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

CommonsIOを使用するようにアドバイスしたかっただけです。

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);
    }
}

バッファをある程度の長さで初期化する必要があるため、コードを複製したり、2 つのメソッドを使用したりしないようにする方法はわかりません。

于 2018-10-31T03:18:59.883 に答える