InputStream和ByteArrayInputStream之间有什么区别?

时间:2012-12-01 03:15:20

标签: java inputstream jnlp bytearrayinputstream

以下代码摘自核心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之间有什么区别?

4 个答案:

答案 0 :(得分:5)

ByteArrayInputStreamByteArrayOututStream是内存中实现,当您希望以类似流的方式将数据临时存储在内存中,然后在其他地方再次将其抽出时。

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

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

但你想发送一个String的内容给它。然后,您使用ByteArrayInputStream并将其填入字符串的内容,并将ByteArrayInputStream传递给该方法。


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

答案 1 :(得分:1)

InputStream是一个抽象类,而ByteArrayInputStream是InputStream的一个具体类,它提供了自己对(InputStream)给出的抽象概念的实现,

此外:

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

关闭ByteArrayInputStream无效。可以在关闭流之后调用此类中的方法,而不会产生IOException。

  

从Java Docs公共类ByteArrayInputStream扩展InputStream

答案 2 :(得分:0)

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

答案 3 :(得分:0)

InputStream是一个抽象类,从中扩展的所有类都表示输入的字节流。需要定义InputStream子类的应用程序必须始终提供返回输入的下一个字节的方法。 而ByteArrayInputStream包含一个内部缓冲区,其中包含可从流中读取的字节。内部计数器跟踪read方法提供的下一个字节。

由于多态概念,您可以将子项分配给父项,就像

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

如果我们致电data.read(),则表示我们正在调用read ByteArrayInputStream方法。由于ByteArrayInputStream正在提供read()的实施,因此InputStream方法read()是抽象的。