Файл в байт [] в Java - PullRequest
       97

Файл в байт [] в Java

667 голосов
/ 13 мая 2009

Как конвертировать java.io.File в byte[]?

Ответы [ 23 ]

13 голосов
/ 23 января 2014

Простейший способ чтения байтов из файла

import java.io.*;

class ReadBytesFromFile {
    public static void main(String args[]) throws Exception {
        // getBytes from anyWhere
        // I'm getting byte array from File
        File file = null;
        FileInputStream fileStream = new FileInputStream(file = new File("ByteArrayInputStreamClass.java"));

        // Instantiate array
        byte[] arr = new byte[(int) file.length()];

        // read All bytes of File stream
        fileStream.read(arr, 0, arr.length);

        for (int X : arr) {
            System.out.print((char) X);
        }
    }
}
11 голосов
/ 17 апреля 2013

Гуава может предложить вам Files.toByteArray () . У него есть несколько преимуществ:

  1. Он охватывает угловой случай, когда файлы сообщают о длине 0, но все еще имеют содержимое
  2. Он очень оптимизирован, вы получаете исключение OutOfMemoryException, если пытаетесь прочитать большой файл, даже не пытаясь загрузить файл. (Через умное использование file.length ())
  3. Вам не нужно изобретать велосипед.
10 голосов
/ 02 сентября 2016
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;

File file = getYourFile();
Path path = file.toPath();
byte[] data = Files.readAllBytes(path);
9 голосов
/ 24 февраля 2012

Использование того же подхода, что и вики-ответа сообщества, но более чистого и компилируемого из коробки (предпочтительный подход, если вы не хотите импортировать библиотеки Apache Commons, например, на Android):

public static byte[] getFileBytes(File file) throws IOException {
    ByteArrayOutputStream ous = null;
    InputStream ios = null;
    try {
        byte[] buffer = new byte[4096];
        ous = new ByteArrayOutputStream();
        ios = new FileInputStream(file);
        int read = 0;
        while ((read = ios.read(buffer)) != -1)
            ous.write(buffer, 0, read);
    } finally {
        try {
            if (ous != null)
                ous.close();
        } catch (IOException e) {
            // swallow, since not that important
        }
        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
            // swallow, since not that important
        }
    }
    return ous.toByteArray();
}
7 голосов
/ 03 апреля 2014

Я верю, что это самый простой способ:

org.apache.commons.io.FileUtils.readFileToByteArray(file);
5 голосов
/ 16 апреля 2015

ReadFully Считывает байты b.length из этого файла в байтовый массив, начиная с текущего указателя файла. Этот метод читает несколько раз из файла, пока не будет прочитано запрошенное количество байтов. Этот метод блокируется до тех пор, пока не будет прочитано запрошенное количество байтов, не будет обнаружен конец потока или не сгенерировано исключение.

RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);
3 голосов
/ 13 мая 2009

Позвольте мне добавить другое решение без использования сторонних библиотек. Он повторно использует шаблон обработки исключений, который был предложен Скотт ( ссылка ). И я переместил некрасивую часть в отдельное сообщение (я бы спрятался в каком-то классе FileUtils;))

public void someMethod() {
    final byte[] buffer = read(new File("test.txt"));
}

private byte[] read(final File file) {
    if (file.isDirectory())
        throw new RuntimeException("Unsupported operation, file "
                + file.getAbsolutePath() + " is a directory");
    if (file.length() > Integer.MAX_VALUE)
        throw new RuntimeException("Unsupported operation, file "
                + file.getAbsolutePath() + " is too big");

    Throwable pending = null;
    FileInputStream in = null;
    final byte buffer[] = new byte[(int) file.length()];
    try {
        in = new FileInputStream(file);
        in.read(buffer);
    } catch (Exception e) {
        pending = new RuntimeException("Exception occured on reading file "
                + file.getAbsolutePath(), e);
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (Exception e) {
                if (pending == null) {
                    pending = new RuntimeException(
                        "Exception occured on closing file" 
                             + file.getAbsolutePath(), e);
                }
            }
        }
        if (pending != null) {
            throw new RuntimeException(pending);
        }
    }
    return buffer;
}
3 голосов
/ 13 октября 2012

Если вы хотите прочитать байты в заранее выделенный байтовый буфер, этот ответ может помочь.

Ваше первое предположение, вероятно, будет использовать InputStream read(byte[]). Однако этот метод имеет недостаток, который делает его неоправданно сложным: нет никакой гарантии, что массив будет полностью заполнен, даже если EOF не обнаружен.

Вместо этого взгляните на DataInputStream readFully(byte[]). Это оболочка для входных потоков, которая не имеет вышеуказанной проблемы. Кроме того, этот метод выбрасывает при обнаружении EOF. Гораздо приятнее.

2 голосов
/ 12 ноября 2012
public static byte[] readBytes(InputStream inputStream) throws IOException {
    byte[] buffer = new byte[32 * 1024];
    int bufferSize = 0;
    for (;;) {
        int read = inputStream.read(buffer, bufferSize, buffer.length - bufferSize);
        if (read == -1) {
            return Arrays.copyOf(buffer, bufferSize);
        }
        bufferSize += read;
        if (bufferSize == buffer.length) {
            buffer = Arrays.copyOf(buffer, bufferSize * 2);
        }
    }
}
1 голос
/ 25 ноября 2014

Другой способ чтения байтов из файла

Reader reader = null;
    try {
        reader = new FileReader(file);
        char buf[] = new char[8192];
        int len;
        StringBuilder s = new StringBuilder();
        while ((len = reader.read(buf)) >= 0) {
            s.append(buf, 0, len);
            byte[] byteArray = s.toString().getBytes();
        }
    } catch(FileNotFoundException ex) {
    } catch(IOException e) {
    }
    finally {
        if (reader != null) {
            reader.close();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...