gpt4 book ai didi

java - 更好的 Java 循环?

转载 作者:搜寻专家 更新时间:2023-11-01 01:04:22 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com