2011-08-11 10 views
3

ストリームコピー用のコードがあります。PMD準拠のストリームコピーをJavaで使用

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ルールを満たすより洗練された方法はありますか?

+0

あなたは – Thilo

答えて

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

を私はあなたのコードを引き受けます有効であり、そのままの状態にしておきます。または、ループがそのトリックをやりますか?

1
while (true) { 
    int bufferLength = is.read(buffer); 
    if (bufferLength == -1) 
     break; 
    os.write(buffer, 0, bufferLength); 
} 
3

最もエレガントな方法は、警告を抑制することです。ルールの多くと考えと

PMD船はあなたがあなた自身のコード内で使用したいものを選択することです。あなたは、単にsuppress the warning、オペランドで割り当てがOKであることを、と思われる場合:

@SuppressWarnings("PMD.AssignementInOperand") 

ちなみに、これはとにかく物議ルールセットで定義されています。私はそれをまったく有効にしません。

「論争のルールセット」には、何らかの理由で論争の対象となるルールが含まれています。彼らはここで分けられているので、人々がカスタムルールセットを介して適切と考えるように含めることができます。このルールセットは、最初しばらくPMDを使用した後、ほとんどの人は本当に

:-)嫌いトムが好きしかしUnnecessaryConstructorRule以上の議論に応じて作成された、あなたはすべてのルールとのみを含むカスタムルールセットについて考え始める必要がありますルールはに同意します。

+0

うん:-)コモンズIOを使用してコードの重複を避けることができ、私はルールが論争のあるunderstad。しかし、私は実際には、そのようなものが一日おきに見えない場合、operator> constructionの代入を読むのは少し難しいことに実際に同意します。 – rompetroll

+1

真。しかし、あなたの例は非常に一般的なパターンを示しており、警告を抑制するのが理にかなっています。他のケースでは、私は同意します、警告は意識を作成するのに役立ち、コードは理解しにくいです。 –