我有一段代码可以读取 InputStream
并将内容写入 OutputStream
:
BufferedInputStream in = new BufferedInputStream(...);
FileOutputStream outStream = new FileOutputStream outStream(...);
int read = in.read(buffer, 0, bufferSize);
while (read != -1) {
outStream.write(buffer, 0, read);
read = in.read(buffer, 0, bufferSize);
}
它有效,但我不喜欢它,因为变量 read
被声明在循环之外,并且 read()
方法被写入了两次。
修订版:
for (int read = 0; read != -1; read = in.read(buffer, 0, bufferSize)) {
outStream.write(buffer, 0, read);
}
它看起来更好但不够好,因为第一次迭代在 read=0 时没有用(而且可能有害)。
你有更好的解决方案吗?
最佳答案
就我个人而言,对于这种事情,我违反了正常的“条件无副作用”规则:
int bytesRead;
while ((bytesRead = in.read(buffer, 0, bufferSize)) != -1)
{
outStream.write(buffer, 0, bytesRead);
}
编辑:如前所述,它确实涉及在循环外声明read
,但它只调用一次read()
。我从来没有发现它是一个问题——虽然我通常更喜欢声明范围尽可能小的变量,但这更像是一个普遍的清洁问题。如果你想进一步限制范围,你可以将整个东西放在大括号中,或者将它提取到它自己的方法中,就像 Alan 的方法一样。下面是我将如何实现它:
public static void copyStream(InputStream input, OutputStream output)
throws IOException {
byte[] buffer = new byte[1024 * 16]; // Reasonable general size
int bytesRead;
while ((bytesRead = in.read(buffer, 0, buffer.length)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
}
或者,您可以提供缓冲区长度作为参数。请注意,这现在可以进入实用程序库,您再也不需要编写代码了。
或者,您可以利用它已经在其他实用程序库中可用的事实,例如 Guava作为ByteStreams.copy
关于java - 更好的 Java 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071417/