如何将FileInputStream转换为InputStream?

118
我只想将一个FileInputStream转换为InputStream,我应该怎么做?
例如:
FileInputStream fis = new FileInputStream("c://filename");
InputStream is = ?; 
fis.close();

3
Ranjan,请你把这篇帖子的正确答案改掉。目前的答案不太好。如果你可以把它改成下面那个答案就最好了。 - Whitecat
这只是一个愚蠢的问题...我对序列化没有正确的理解...任何人都可以参考@sudocode。 - ranjan
4
也许这是一个愚蠢的问题,但很多人仍然会提到它,因为它很有用。 - Whitecat
1
@WilliMentzel 我来这里是为了寻找从 File 类转换为 InputStream 的实际方法。你的编辑建议作者正在寻求这一点(至少部分),但这是不正确的。 - Line
@Line就像我之前说的:如果你认为这个编辑有误,你可以进行更正。我不想过多地解释。谢谢你和我讨论这个问题 :) - Willi Mentzel
显示剩余2条评论
5个回答

139
InputStream is;

try {
    is = new FileInputStream("c://filename");

    is.close(); 
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

return is;

13
为什么在最后返回" is "之前调用了"is.close()"方法? - Talespin_Kit

56
InputStream is = new FileInputStream("c://filename");
return is;

38

FileInputStream is an inputStream.


FileInputStream是一个输入流。
FileInputStream fis = new FileInputStream("c://filename");
InputStream is = fis;
fis.close();  
return is;

当然,这不会做你想要的事情; 你返回的流已经被关闭了。只需返回FileInputStream并完成它。调用代码应该关闭它。


7
这很蠢 - 如果你关闭了“fis”,你也会关闭“is”。 - RonK
1
如果我关闭文件,数据就不会被发送。 - ranjan
2
@RonK 确实。这就是我提到它的原因。 - Joeri Hendrickx
3
在返回类型为 InputStream 的方法中,可以使用更简洁的代码 return FileInputStream("c://filename"); - Amit
对于Maven项目, 如果文件config.property保存在项目文件夹中,则FileInputStream fis = new FileInputStream("congfig.property");可以正常工作。 - Abhidemon
显示剩余2条评论

7
您通常会先从输入流中读取数据,然后关闭它。您可以将FileInputStream包装在另一个InputStream(或Reader)中。当您关闭包装流/读取器时,它将自动关闭。
如果这是一个将InputStream返回给调用者的方法,则关闭流是调用者的责任。如果您在您的方法中关闭它,则调用者将无法使用它。
回答一些您的评论...
要将InputStream的内容发送到远程消费者,您需要将InputStream的内容写入OutputStream,然后关闭两个流。
远程消费者不知道您创建的流对象。他只接收内容,在他创建、读取和关闭的InputStream中。

如果我想通过邮件发送一个InputStream,那么在另一端关闭它是否可能或者不需要关闭呢? - ranjan
2
流对象本身不可序列化。流的内容可以通过将内容写入OutputStream进行序列化。 - ewan.chalmers
实际上我的目标是发送一个文件.. 我不希望在发送后有任何运行.. 例如,就像我发送一个字符串一样.. 这样另一端就不需要担心关闭任何东西。 - ranjan
1
文件也不可序列化。但是可以使用OutputStream将文件内容序列化。 - ewan.chalmers
我能否等待一段特定的时间,然后关闭输入流,例如根据文件大小? - ranjan
但是一旦我返回流,我就退出了作用域。 - ranjan

2

如果您将一个流包装到另一个流中,则不需要关闭中间流,而且非常重要的是:在完成使用外部流之前不要关闭它们。因为这样会导致外部流也被关闭。


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