Каков наилучший способ передачи файла с помощью Java? - PullRequest
9 голосов
/ 10 ноября 2008

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

У меня есть текущий фрагмент кода, который выполняет передачу файлов, и мне было интересно, как я могу ускорить передачу.

Извините за весь код:

InputStream fileItemInputStream ;
OutputStream saveFileStream;
int[] buffer;
while (fileItemInputStream.available() > 0) {
    buffer = Util.getBytesFromStream(fileItemInputStream);
    Util.writeIntArrToStream(saveFileStream, buffer);
}
saveFileStream.close();
fileItemInputStream.close();

Методы Util следующие:

public static int[] getBytesFromStream(InputStream in, int size) throws IOException {
    int[] b = new int[size];
    int count = 0;
    while (count < size) {
        b[count++] = in.read();
    }
    return b;
}

и

public static void writeIntArrToStream(OutputStream out, int[] arrToWrite) throws IOException {
    for (int i = 0; i < arrToWrite.length; i++) {
        out.write(arrToWrite[i]);
    }
}

1 Ответ

16 голосов
/ 10 ноября 2008

Чтение одного байта за раз будет ужасно неэффективным. Вы также полагаетесь на available, что редко является хорошей идеей. (Он вернет 0, если в данный момент нет доступных байтов , но их может быть больше.)

Это правильный код для копирования потока:

public void copyStream(InputStream input, OutputStream output) throws IOException
{
    byte[] buffer = new byte[32*1024];
    int bytesRead;
    while ((bytesRead = input.read(buffer, 0, buffer.length)) > 0)
    {
        output.write(buffer, 0, bytesRead);
    }
}

(вызывающий должен закрыть оба потока.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...