我正在处理一个任务,并且对代码审查有一个问题-我们需要确保输入流在这里被消耗吗?'
public void processInputStream(final DataInputStream dataInputStream, final OutputStream output) {
try {
// doing something with dataInputStream!!
} catch (IOException e) {
// doing something with IOException
}
}
我有几个问题-
我假设如果InputStream处理被中断,那么我的catch块将被触发。对吗?如果是这样,是否就不需要确保流已经被消耗了?#2在这种情况下,我如何检查InputStream已被消耗?
感谢更新——
处理我的InputStream的一部分涉及使用-
copyInputStreamToFile(..)
From Apache commons https://commons.apache.org/proper/commons-io/javadocs/api-2.7/org/apache/commons/io/FileUtils.html#copyInputStreamToFile-java.io.InputStream-java.io.File-
他们的文档说-
将字节从InputStream源复制到文件目标。如果到目标的目录不存在,将创建它们。如果目的地已经存在,它将被覆盖。源流已关闭。请参阅copyToFile(InputStream, File)获取不关闭输入流的方法。
这是否意味着给定源流是关闭的,那么这包括检查InputStream是否已被消耗?
您可以使用以下方法检查InputStream是否已耗尽:
package example;
import java.io.IOException;
import java.io.InputStream;
public class SO {
public static boolean isExhausted(InputStream in) throws IOException {
final boolean exhausted;
if (in.markSupported()) {
in.mark(1);
exhausted = in.read() == -1;
in.reset();
} else {
throw new IllegalStateException("mark is not supported on this inputstream");
}
return exhausted;
}
}
注意,这只在InputStream支持标记和重置方法(in.markSupported())时才有效
成功了!
private void consumeQuietly(final InputStream inputStream) {
try (OutputStream out = NullOutputStream.NULL_OUTPUT_STREAM) {
IOUtils.copy(inputStream, out);
} catch (IOException ioException) {
// Log something!!
}
}
public void processInputStream(final DataInputStream dataInputStream, final OutputStream output)
{
try
{
// doing something with dataInputStream!!
}
catch (InterruptedException ie)
{
// doing something with InterruptedException
}
catch (IOException ioe)
{
// doing something with IOException
}
}
您可以使用inputStream.available()
方法来确定输入流是否被消耗。