5

我有一段用于流复制的代码。

OutputStream os = ...;
InputStream is = ...;
int bufferLength;
byte[] buffer = new byte[1024];
while ((bufferLength = is.read(buffer)) != -1) {
   os.write(buffer, 0, bufferLength);
}

如果我在它上面运行 PMD,我会收到以下警告http://pmd.sourceforge.net/rules/controversial.html#AssignmentInOperand

现在我希望摆脱那个警告,但我能想到的唯一选择是

OutputStream os = ...;
InputStream is = ...;
int bufferLength;
byte[] buffer = new byte[1024];
bufferLength = is.read(buffer);
while (bufferLength != -1) {
   os.write(buffer, 0, bufferLength);
   bufferLength = is.read(buffer);
}

而且我真的不喜欢这样,因为我最终会重复代码。有没有更优雅的方式来满足这个 PMD 规则?

4

4 回答 4

4

最优雅的方式......是抑制警告。

PMD 附带了许多规则,其想法是您选择要在自己的代码中使用的规则。如果您认为操作数中的分配是可以的,只需取消警告

@SuppressWarnings("PMD.AssignementInOperand")

顺便说一句,无论如何,这是在有争议的规则集中定义的。我根本不会激活它。

有争议的规则集包含无论出于何种原因被认为有争议的规则。它们在这里被分开,以允许人们通过自定义规则集将其包含在内。这个规则集最初是为了回应关于汤姆喜欢但大多数人真的不喜欢的 UnnecessaryConstructorRule 的讨论:-)

使用 PMD 一段时间后,您应该开始考虑自定义规则集,其中包含所有规则并且仅包含同意的那些规则。

于 2011-08-11T12:07:01.327 回答
3

我只是想建议您使用Commons IO

IOUtils.copy(is, os);

然后我快速浏览了以下源代码copy()

byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int n = 0;
while (-1 != (n = input.read(buffer))) {
    output.write(buffer, 0, n);
}

我会假设您的代码是有效的并保持原样。或者也许 do-while 循环可以解决问题?

于 2011-08-11T12:05:43.757 回答
1
while (true) {
   int bufferLength = is.read(buffer);
   if (bufferLength == -1) 
      break;
   os.write(buffer, 0, bufferLength);
}
于 2011-08-11T12:03:44.770 回答
0

也许一个额外的递归方法可以解决这个警告:

private static void writeToInputStream(final InputStream is, final OutputStream os) throws IOException {
    writeToInputStream(is, os, new byte[8388608]); // 8388608 bits = 1024 * 1024 * 8 = 1MB
    os.flush();
}

private static void writeToInputStream(final InputStream is, final OutputStream os, final byte[] dados) throws IOException {
    final int read = is.read(dados, 0, dados.length);
    if (read != -1) {
        os.write(dados, 0, read);
        writeToInputStream(is, os, dados);
    }
}

由于您必须以一定长度初始化缓冲区,因此我看不到其他方法来不重复代码或使用两种方法。

于 2018-10-31T03:18:59.883 回答