InputStream和ByteArrayInputStream有何区别?

10
下面的代码摘自《Java核心技术 卷1》中的Java Web Start章节。
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     PrintStream printOut = new PrintStream(out);
     printOut.print(panel.getText());
     //panel.getText() return a String
     InputStream data = new ByteArrayInputStream(out.toByteArray());
     FileSaveService service = (FileSaveService) ServiceManager
           .lookup("javax.jnlp.FileSaveService");
     service.saveFileDialog(".", new String[] { "txt" }, data, "calc.txt");

总共创建了四个对象,流被重定向了三次。 使用jnlp api还有其他将数据写入文件的方法吗? InputStream和ByteArrayInputStream有什么区别?


3
电脑速度非常快。除非你需要大量重复操作或者对性能要求非常高,否则没有什么事情是“可怕”的。 - JimN
你应该更改标题:它是数据而不是日期。然后将8字节的日期时间戳写入文件会很糟糕。 - AlexWien
我的意思是对于程序员来说,这太复杂了,而不是对于计算机。我想知道是否有必要以这种方式编码。 - scobur
这里有两个问题。第二个问题很简单,可以在Javadoc中找到答案。你的真正问题是第一个问题吗?如果是,你应该修改标题。 - user207421
4个回答

8

ByteArrayInputStreamByteArrayOututStream是内存实现,用于在以流的方式临时存储数据时使用,然后再将其传输到其他地方。

例如,假设您有一个方法需要输入流作为参数,例如:

public Document parseXml(InputStream in) // build an XML document from data read in

但是如果您想要发送字符串的内容,您需要使用ByteArrayInputStream并将其填充为您的字符串的内容,然后将ByteArrayInputStream传递给方法。


ByteArrayOutputStream的用法示例可能是如果一个方法写入输出流,但是您只想捕获结果并直接获取它。


1

InputStream是一个抽象类,ByteArrayInputStream是InputStream的具体实现类,并提供了自己的实现(继承自InputStream)。

此外:

  • ByteArrayInputStream包含一个内部缓冲区,其中包含可以从流中读取的字节。
  • 一个内部计数器跟踪下一个由read方法提供的字节。

关闭ByteArrayInputStream没有任何影响。在流关闭后,仍然可以调用此类中的方法而不会生成IOException。

来自Java文档:public class ByteArrayInputStream extends InputStream


0

InputStream是输入流的通用接口。
FileInputStream和ByteArrayInputStream都实现了该接口。


0

InputStream 是一个抽象类,所有继承自它的类都代表着字节输入流。需要定义 InputStream 子类的应用程序必须提供一个返回下一个输入字节的方法。

ByteArrayInputStream 包含一个内部缓冲区,其中包含可以从流中读取的字节。一个内部计数器跟踪由 read 方法提供的下一个字节。

由于多态性概念,您可以像将子类分配给父类一样进行赋值。

InputStream data = new ByteArrayInputStream(out.toByteArray());

如果我们调用 data.read(),那意味着我们正在调用 ByteArrayInputStreamread 方法。因为 ByteArrayInputStream 提供了 read() 的实现,在 InputStream 方法中 read() 是抽象的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接