java - 更好的 Java 循环?

标签 java loops for-loop while-loop

我有一段代码可以读取 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/

相关文章:

php - 从MySQL中的行填充下拉选择菜单

javascript - 循环遍历二维数组以获取第二列值

xml - xsl :for-each loop counter

c - 在 for 循环内声明变量; c2000编译器出现错误

java - 在 Spring MVC 中显示带有复选框的列表

java - 连接和读取图像字节和字符串字节

java - 将第二个json对象添加到java中的同一个json数组中

java - 找不到 Hadoop 命令

R:成对比较矩阵中的所有列

java - Java 中 false boolean 值后重新启动 While 循环