FileInputStream in = new FileInputStream(myFile);
ByteArrayOutputStream out = new ByteArrayOutputStream();
Вопрос: Как я могу читать все из in
в out
способом, который не является циклом, созданным вручную, с моим собственным байтовым буфером?
FileInputStream in = new FileInputStream(myFile);
ByteArrayOutputStream out = new ByteArrayOutputStream();
Вопрос: Как я могу читать все из in
в out
способом, который не является циклом, созданным вручную, с моим собственным байтовым буфером?
Напишите один метод для этого и вызовите его везде, где нужны функции. Guava уже имеет для этого код, ByteStreams.copy
. Я уверен, что в любой другой библиотеке с "общей" функциональностью IO есть тоже, но Guava - моя первая "go-to" библиотека, где это возможно. Это скалы:)
В Apache Commons/IO вы можете сделать это с помощью IOUtils.copy(in, out)
:
InputStream in = new FileInputStream(myFile);
OutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
Но я согласен с Джоном Скитом, я предпочел бы использовать Guava ByteStreams.copy(in, out)
Итак, что Guava ByteStreams.copy(in, out) делает:
private static final int BUF_SIZE = 0x1000; // 4K
public static long copy(InputStream from, OutputStream to)
throws IOException {
checkNotNull(from);
checkNotNull(to);
byte[] buf = new byte[BUF_SIZE];
long total = 0;
while (true) {
int r = from.read(buf);
if (r == -1) {
break;
}
to.write(buf, 0, r);
total += r;
}
return total;
}
Java 9 (и позже) ответ:
in.transferTo(out);
Похоже, они наконец-то поняли, что эта функциональность настолько необходима, что ее лучше встроить. Метод возвращает количество байтовых копий, если вам нужно знать.
В моем проекте я использовал этот метод:
private static void copyData(InputStream in, OutputStream out) throws Exception {
byte[] buffer = new byte[8 * 1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
}
В качестве альтернативы Guava можно использовать Apop Commons IO (старый) и Apache Commons IOUtils (новый, как указано в комментарии).
Я бы использовал цикл вместо импорта новых классов или добавлял библиотеки в свой проект. Функция библиотеки, вероятно, также реализована с помощью цикла. Но это только мой личный вкус.
Однако, мой вопрос к вам: что вы пытаетесь сделать? Подумайте о "большой картине", если вы хотите поместить все содержимое файла в массив байтов, почему бы просто не сделать это? Размер атрибута - file.length(), и вам не нужно динамически расти, скрываясь за ByteArrayOutputStream (если ваш файл не используется совместно, и его содержимое может измениться во время чтения).
Другая альтернатива: можете ли вы использовать FileChannel и ByteBuffer (java.nio)?