2011-08-11 50 views
3

我有一段代碼用於流拷貝。在java中的PMD兼容流拷貝

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

您可以通過使用Commons IO避免重複代碼:-) – 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); 
} 

我會假設你的代碼是有效的,並保持原樣。或者,也許do-while循環會做到這一點?

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

最優雅的方法是壓制警告。

PMD附帶了很多規則,並且您的想法是選擇您想要在自己的代碼中使用的那些規則。如果你覺得,在操作數分配都OK,只是suppress the warning

@SuppressWarnings("PMD.AssignementInOperand") 

順便說一句,這是在爭議規則集反正定義。我根本不會激活它。

有爭議的規則集包含無論什麼原因都被認爲有爭議的規則。他們在這裏被分離出來,允許人們通過自定義規則集來包含他們認爲合適的人。此規則集最初響應了UnnecessaryConstructorRule湯姆喜歡,但討論創建大多數人真的不喜歡:-)

使用PMD一段時間後,你應該開始考慮,包括所有的規則,只有那些自定義的規則集規則同意。

+0

是的,我不知道這個規則是有爭議的。但我實際上同意,如果你沒有看到每隔一天那樣的東西,那麼閱讀<賦值運算符>構造有點困難。 – rompetroll

+1

是的。但是,您的示例顯示了一種非常常見的模式,在此情況下可以抑制警告。在其他情況下,我同意,警告將有助於提高意識,但代碼難以理解。 –