Как лучше всего передать файл с помощью Java?

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

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

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

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]);
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
8 593
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтение одного байта за раз будет ужасно неэффективным. Вы также полагаетесь на 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);
    }
}

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

разве мне не нужно беспокоиться о моих беззнаковых байтах в файле, переполненных подписанными байтами Java?

jjnguy 10.11.2008 10:38

Это mp3 файлы, если это важно

jjnguy 10.11.2008 10:39

Нет, не знаешь. Это просто чтение и запись, а не выполнение каких-либо арифметических операций или преобразований.

Jon Skeet 10.11.2008 10:43

И / или изучите использование классов BufferedInput / OutputStream.

John Gardner 10.11.2008 21:09

Другие вопросы по теме