PMD-совместимая потоковая копия в Java - PullRequest
4 голосов
/ 11 августа 2011

У меня есть фрагмент кода для потокового копирования.

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 ]

3 голосов
/ 11 августа 2011

Я просто хотел посоветовать вам использовать 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 поможет?

3 голосов
/ 11 августа 2011

Самый элегантный способ ... это подавить предупреждение.

PMD поставляется с множеством правил, и идея состоит в том, что вы выбираете те, которые хотите использовать в своем собственном коде. Если вы думаете, что назначения в операндах в порядке, просто подавляет предупреждение :

@SuppressWarnings("PMD.AssignementInOperand")

Кстати, это определено в противоречивым Набор правил в любом случае. Я бы вообще не активировал это.

Спорный набор правил содержит правила, которые по какой-либо причине считаются спорными. Они выделены здесь, чтобы позволить людям включать их по своему усмотрению с помощью пользовательских наборов правил. Этот набор правил был первоначально создан в ответ на обсуждения UnneededConstructorRule, которые нравятся Тому, но большинству людей это не нравится :-)

После использования PMD некоторое время вам следует подумать о настраиваемом наборе правил, который включает в себя все правила и только те правила, с которыми вы согласны.

1 голос
/ 11 августа 2011
while (true) {
   int bufferLength = is.read(buffer);
   if (bufferLength == -1) 
      break;
   os.write(buffer, 0, bufferLength);
}
0 голосов
/ 31 октября 2018

Может быть, дополнительный рекурсивный метод мог бы решить это предупреждение:

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

Так как вам нужно инициализировать ваш буфер некоторой длины, я не вижу другого способа не дублировать код или использовать два метода.1004 *

...