Как читать байты из файла, тогда как результат byte [] точно такой же длинный - PullRequest
2 голосов
/ 22 апреля 2011

Я хочу, чтобы результат byte[] точно соответствовал содержимому файла. Как этого добиться.

Я думаю о ArrayList<Byte>, но это не похоже на эффективность.

Ответы [ 4 ]

5 голосов
/ 22 апреля 2011

Лично я бы пошел по маршруту Гуава :

File f = ...
byte[] content = Files.toByteArray(f);

В Apache Commons IO есть аналогичные служебные методы, если хотите.

Если это не то, что вам нужнонаписать этот код не так уж сложно:

public static byte[] toByteArray(File f) throws IOException {
    if (f.length() > Integer.MAX_VALUE) {
        throw new IllegalArgumentException(f + " is too large!");
    }
    int length = (int) f.length();
    byte[] content = new byte[length];
    int off = 0;
    int read = 0;
    InputStream in = new FileInputStream(f);
    try {
        while (read != -1 && off < length) {
            read = in.read(content, off, (length - off));
            off += read;
        }
        if (off != length) {
            // file size has shrunken since check, handle appropriately
        } else if (in.read() != -1) {
            // file size has grown since check, handle appropriately
        }
        return content;
    } finally {
        in.close();
    }
}
4 голосов
/ 22 апреля 2011

Я почти уверен, File # length () не перебирает файл.( Предполагая, что вы имели в виду length()) Каждая ОС предоставляет достаточно эффективные механизмы для определения размера файла, не читая все это.

2 голосов
/ 22 апреля 2011

Выделите соответствующий буфер (при необходимости измените его размер во время чтения) и отследите, сколько байтов прочитано.После окончания чтения создайте новый массив с точной длиной и скопируйте содержимое буфера чтения.

1 голос
/ 22 апреля 2011

Небольшая функция, которую вы можете использовать:


// Returns the contents of the file in a byte array.
public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);

    // Get the size of the file
    long length = file.length();

    // You cannot create an array using a long type.
    // It needs to be an int type.
    // Before converting to an int type, check
    // to ensure that file is not larger than Integer.MAX_VALUE.
    if (length > Integer.MAX_VALUE) {
        throw new RuntimeException(file.getName() + " is too large");
    }

    // Create the byte array to hold the data
    byte[] bytes = new byte[(int)length];

    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length
           && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
        offset += numRead;
    }

    // Ensure all the bytes have been read in
    if (offset < bytes.length) {
        throw new IOException("Could not completely read file "+file.getName());
    }

    // Close the input stream and return bytes
    is.close();
    return bytes;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...