7

以下代码摘自核心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

4 回答 4

8

ByteArrayInputStream并且ByteArrayOututStream是内存中的实现,当您想以类似流的方式将数据临时存储在内存中,然后在其他地方再次将其抽出时使用。

例如,假设您有一个期望输入流作为参数的方法,例如

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

但是您想将说字符串的内容发送给它。然后你会使用 aByteArrayInputStream并用你的 String 的内容填充它,然后将它传递ByteArrayInputStream给方法。


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

于 2012-12-01T03:45:30.437 回答
1

InputStream 是一个抽象类,而 ByteArrayInputStream 是 InputStream 的一个具体类,并提供了由 (InputStream) 给出的抽象思想的自己的实现,

此外 :

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

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

来自 Java Docs 公共类 ByteArrayInputStream 扩展 InputStream

于 2019-04-25T09:25:49.847 回答
0

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

由于多态性的概念,您可以将孩子分配给父母,就像

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

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

于 2012-12-01T11:33:39.093 回答
0

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

于 2012-12-01T03:51:03.337 回答