Вывод RandomAccessFile getFilePointer

У меня есть файл a.txt с содержимым, написанным с помощью writeUTF(),

Dog
Cat
Rat

Теперь, когда я перечитываю содержимое, я также печатаю положение указателя, и положение указателя неверно.

Код:

public static void main(String[] args) throws Exception 
{
    RandomAccessFile ra = new RandomAccessFile("a.txt", "rw");
    System.out.println("Pointer:  " + ra.getFilePointer());
    ra.writeUTF("Dog\n");
    ra.writeUTF("Cat\n");
    ra.writeUTF("Rat");
    ra.seek(0);
    System.out.println(ra.readLine()+ "  " + ra.getFilePointer());
    ra.close();

}

Вывод:

Pointer: 0
Dog 6

1). Разве позиция указателя не должна быть 4? Потому что после чтения Dog его позиция будет 3, а после чтения \n она должна быть 4. Как показывает 6?

2). Кроме того, когда я читаю весь файл, он показывает позицию 17. Но есть только 9 символов, 2 символов новой строки и 1 EOF (должны ли мы учитывать и это?).

3). Вместо Dog\n, если я пишу \n перед Cat, например Dog \nCat в writeUTF(), выводится другая позиция, которая будет 8 после чтения Dog.

Код:

public static void main(String[] args) throws Exception 
{
    RandomAccessFile ra = new RandomAccessFile("a.txt", "rw");
    System.out.println("Pointer:  " + ra.getFilePointer());
    ra.writeUTF("Dog");
    ra.writeUTF("\nCat");
    ra.writeUTF("\nRat");
    ra.seek(0);
    System.out.println(ra.readLine()+ "  " + ra.getFilePointer());
    ra.close();

}

Вывод:

Pointer: 0
Dog 8

person ssh    schedule 15.03.2017    source источник


Ответы (1)


getFilePointer показывает позицию в байтах. "модифицированный UTF-8" использует 1,2 или 3 байта для создания символа.

http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#modified-utf-8

Обратите внимание, как работает метод writeUTF с объектом RandomAccessFile:

http://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html#writeUTF(java.lang.String)

person user681574    schedule 15.03.2017