以下代码摘自核心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之间有什么区别?
答案 0 :(得分:5)
ByteArrayInputStream
和ByteArrayOututStream
是内存中实现,当您希望以类似流的方式将数据临时存储在内存中,然后在其他地方再次将其抽出时。
例如,假设您有一个方法需要输入流作为参数,例如
public Document parseXml(InputStream in) // build an XML document from data read in
但你想发送一个String的内容给它。然后,您使用ByteArrayInputStream
并将其填入字符串的内容,并将ByteArrayInputStream
传递给该方法。
ByteArrayOutputStream
用法的一个示例可能是方法写入输出流,但您只想捕获结果并直接获取它。
答案 1 :(得分:1)
InputStream是一个抽象类,而ByteArrayInputStream是InputStream的一个具体类,它提供了自己对(InputStream)给出的抽象概念的实现,
此外:
关闭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()
是抽象的。