我写了一个方法将字节从InputStream
复制到OutputStream
。
// copies bytes from given input stream to specified output stream
// returns the number of bytes copied.
private static long copy(final InputStream input,
final OutputStream output)
throws IOException {
long count = 0L;
final byte[] buffer = new byte[4096];
for (int length; (length = input.read(buffer)) != -1; count += length) {
output.write(buffer, 0, length);
}
return count;
}
SonarQube抱怨道。
此循环的停止条件测试"长度,输入,缓冲区"但是增量器会更新"计算"。
当for循环的停止条件和增量器不对同一个变量起作用时,几乎总是出错。即使它不是,也可能会混淆代码的未来维护者,应该避免使用。
是否有更好的代码用于同一目的?
更新
正如建议的答案,我确实喜欢这个,问题已经消失。
// copies bytes from given input stream to specified output stream
// returns the number of bytes copied.
private static long copy(final InputStream input,
final OutputStream output)
throws IOException {
long count = 0L;
final byte[] buffer = new byte[4096];
for (int length; (length = input.read(buffer)) != -1;) {
output.write(buffer, 0, length);
count += length;
}
return count;
}
答案 0 :(得分:4)
你正在滥用for
循环,这就是SonarQube发出警告的原因。在以下循环中,您在更新子句中递增count
但停止条件不依赖于count
for (int length; (length = input.read(buffer)) != -1; count += length) {
^---------------------------------^ ^-------------^
does not depend on count increments count
相反,您应该使用while
循环并增加循环体内的计数:
private static long copy(final InputStream input, final OutputStream output) throws IOException {
long count = 0;
final byte[] buffer = new byte[4096];
int length;
while ((length = input.read(buffer)) != -1) {
output.write(buffer, 0, length);
count += length;
}
return count;
}
答案 1 :(得分:1)
将count += length
放在for循环体中。它不是增量器,因此不属于那里,它只是计算副本大小。