Как класс RandomAccessFile возвращает байты с помощью метода randomAccessFile.read();

Я использую гугл-переводчик, надеюсь вопрос понятен.

Есть один момент я не разбираюсь в файлах произвольного доступа .Не понимаю как работает программа но работает.

Это моя программа:

// ---------------------------------------------
RandomAccessFile RandomAccessFile = new RandomAccessFile ( " pathfile ", " r");

byte [] document = new byte [ ( int) randomAccessFile.length ()] ;

randomAccessFile.read (document) ;
// ---------------------------------------------

В строке 1 я получаю доступ к файлу в режиме чтения. В строке 2 я создаю объект массива байтов того же размера, что и файл. В строке 3 считывается массив байтов.

Но никогда не сбрасывается файл на массив байтов.

Я думаю, что программа должна выглядеть примерно так:

/ / ---------------------------------------------
RandomAccessFile RandomAccessFile = new RandomAccessFile ( " pathfile ", " r");

byte [] document = new byte [ ( int) randomAccessFile.length ()] ;

// Line changed
document = randomAccessFile.read();
// ---------------------------------------------

В документации по java сказано:

randomAccessFile.read() ;

Reads a byte of data from this file . The byte is returned as an integer in
the range 0 to 255 ( 0x00- 0x0ff ) .

Возвращает только количество байтов, но не байты.

Кто-нибудь может объяснить мне, как эта строка выгружает байты в документе переменной byte [] с помощью этого оператора?

randomAccessFile.read (document) ;

Спасибо!!

// ------------------------------------------------------------------------------

Другой пример:

Я сравниваю этот метод с BufferedReader:

File file = new File ("C: \ \ file.txt"); 
FileReader fr = new FileReader (file); 
BufferedReader br = new BufferedReader (fr); 
... 
String line = br.readLine (); 

BufferedReader читает строку и передает ее в строку.

Я вижу этот оператор java, который передает содержимое файла в переменную.

String line = br.readLine ();

Но я не вижу этого в другом утверждении:

RandomAccessFile.read ();

только что прочитал, содержание нигде не переходит эту строчку...


person Marquake    schedule 13.03.2014    source источник


Ответы (2)


Вы должны использовать readFully

    try (RandomAccessFile raf = new RandomAccessFile("filename", "r")) {
        byte[] document = new byte[(int) raf.length()];
        raf.readFully(document);
    }

Изменить: вы уточнили свой вопрос. Вы хотите знать, почему read не "возвращает" содержимое файла. Как туда попадает содержимое?

Ответ заключается в том, что read не выделяет памяти для хранения содержимого файла. Вы сделали это с new byte[length]. Это память, в которой будет храниться содержимое файла. Затем вы вызываете read и говорите ему сохранить содержимое файла в этом массиве байтов, который вы создали.

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

Краткий пример "как":

class Test {
    public static void main(String args[]) {
        // here is where chars will be stored. If printed now, will show random junk
        char[] buffer = new char[5];

        // call our method. It does not "return" data.
        // It puts data into an array we already created.
        putCharsInMyBuffer(buffer);

        // prints "hello", even though hello was never "returned"
        System.out.println(buffer);
    }

    static void putCharsInMyBuffer(char[] buffer) {
        buffer[0] = 'h';
        buffer[1] = 'e';
        buffer[2] = 'l';
        buffer[3] = 'l';
        buffer[4] = 'o';
    }
}
person Stuart Caie    schedule 13.03.2014
comment
Я понимаю разницу между read() и readFully() но если у меня есть файл со 100 байтами... метод readFully() я говорю сколько нужно читать, а читать() нет, но два будут читать 100 байт. Когда у меня могут возникнуть проблемы с методом read()? - person Marquake; 13.03.2014
comment
Разница в том, что read только обещает прочитать 1 байт. Он может прочитать 100, но может также прочитать только 1. Он возвращает количество прочитанных байтов, вы должны убедиться, что он вернул ожидаемое число. readFully(), с другой стороны, обещает прочитать все запрашиваемые вами байты. - person Stuart Caie; 14.03.2014
comment
Идеальный! Это моя проблема. Ваш класс точно объясняет, что он делает. Я ожидал увидеть этот код. Я даже декомпилировал и видел только это: // --------- public int read() throws IOException { fd.read return(); } // --------- int read () throws IOException { return read (this.handle); } // -------- private native int read (long paramLong) выбрасывает IOException; // -------- но не видел, что он сделал. Кроме того, я прекрасно понял разницу между read() и readFully(). Большое спасибо! - person Marquake; 17.03.2014
comment
@StuartCaie Есть ли решение для получения количества байтов, прочитанных readFully? Возвращает пустоту.... - person Kenny Worden; 10.11.2017
comment
Просто используйте длину массива, который вы предоставили readFully. Как говорит его javadoc, он блокируется до тех пор, пока не будет прочитано ровно столько байтов. Если он не может прочитать столько байтов, он выдает EOFException. В этой ситуации вы не узнаете, сколько байтов было прочитано, только то, что их недостаточно для заполнения вашего массива. - person Stuart Caie; 06.12.2017

randomAccessFile.read (document) ;

Этот метод будет читать нет. байтов из файла, то есть длина вашей длины массива документов. Если длина массива документов составляет 1024 байта, он будет считывать 1024 байта из файла и помещать его в массив.

Нажмите здесь, чтобы Документация по этому методу

и

document = randomAccessFile.read () ;

просто прочитает один байт из файла и вернет его, он не будет читать весь ваш файл.

Нажмите здесь, чтобы просмотреть документацию по этому методу.

person Mohammad Ashfaq    schedule 13.03.2014
comment
Я сравниваю этот метод с BufferedReader: File file= new File (C:\\file.txt); FileReader fr= новый FileReader(файл); BufferedReader br = новый BufferedReader (fr); ... Строка line= br.readLine(); BufferedReader читает строку и передает ее в строку. Я вижу этот оператор java, который передает содержимое файла в переменную. Строка line= br.readLine(); Но я не вижу этого в другом утверждении: RandomAccessFile.read(); Значит, RandomAccessFile делает то, чего я не вижу? только что прочитал, содержание нигде не переходит эту строку Спасибо - person Marquake; 13.03.2014