【问题标题】:Reusing the input stream variable重用输入流变量
【发布时间】:2016-07-13 15:28:43
【问题描述】:

考虑以下代码 sn -p getInputStreamForRead() 方法创建并返回一个新的输入流以供读取。

InputStream is = getInputStreamForRead();    //This method creates and returns an input stream for file read
is = getDecompressedStream(is);

由于原始文件内容已压缩并存储,因此必须在读取时解压缩。因此,下面的getDecompressedStream() 方法将提供解压缩流内容的选项

public InputStream getDecompressedStream(InputStream is) throws Exception {
 return new GZIPInputStream(is);
}

有以下疑惑

  1. 上面的sn-p哪个是正确的

    is = getDecompressedStream(is) 
    

    InputStream newStream = getDecompressedStream(is)
    
  2. 再次重用InputStream 变量会导致任何问题吗?

我对流完全陌生。请帮助我了解这一点。

【问题讨论】:

  • 我相信 inputstream 只是另一个对象,它将被重新分配新值。 1应该没问题。
  • 你可以自己测试一下。但他们都会做同样的事情。两者都是有效选项
  • 我可以假设/理解类似于类实例的流实例吗?或者流实例有什么例外?

标签: java stream inputstream


【解决方案1】:

只要:

  • 您没有在原始分配和新调用之间操纵原始 InputStream
  • 您总是在 finally 声明中关闭您的信息流

...您应该可以重新分配给原始变量 - 它只是传递给现有引用的新值。

事实上,这可能是推荐的方式,因为您只能以编程方式关闭一个Closeable,如GZIPInputStream#close...

关闭此输入流并释放与该流关联的所有系统资源。

(请参阅here - 我将其读作“关闭底层流”)。

【讨论】:

    【解决方案2】:

    由于您想正确关闭输入流,最好的方法是使用链接创建输入流,并使用 try-with-resources 为您处理关闭。

    try (InputStream is = getDecompressedStream(getInputStreamForRead())) {
        // code using stream here
    }
    

    【讨论】:

    • 是的@Andreas 这似乎是关闭输入流的好选择。但是我想知道输入流是否可以重用。 IE;使用其他值重新分配 InputStream 实例是否会导致任何问题。
    • 例如,最终变量的值不能更改。同样,对于 InputStream 实例变量,重用/重新分配它会导致任何麻烦吗?
    • @RajasubaSubramanian 你的 cmets 很混乱,所以让我这样回答:1)一个变量可以重复使用,当你重新分配时你只是失去了以前的值。如果您不再需要该值,则没有问题。 2) InputStream 不能重复使用。您只能读取一次流。
    • 感谢@Andreas,您的解释非常好。有一张清晰的照片。
    猜你喜欢
    • 2018-10-31
    • 2018-04-20
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2022-01-08
    • 2017-05-19
    相关资源
    最近更新 更多