Работа RandomAccessFile.seek()

170
10 января 2018, 18:17

Пожалуйста, объясните как работает данный метод.
То, что он перемещает курсор на определенную позицию в байтах это я знаю, но все равно у меня лажа получается.
Есть файл состоящий из нескольких строк и в определенную мне нужно дописать символ(два, три и т.д.). Строки равные по своей длине. Номер строки куда писать является входящим значением, но всегда приходит по порядку и кол-во символов которое дописывается тоже одинаковое.
Я беру первую строку(так как это String, то можно вызвать getBytes()), если номер строки не 0, то умножаю длинную массива байт на номер строки(в моем понимании должен получить именно то количество байт которое необходимо). Передаю полученное значение в seek() и пишу в файл то, что мне нужно. Но все равно раз за разом получаю белиберду.

Подправил. Сам метод пишет в файл определенную цифру. Если не использовать перевод строки, то пишется в одну линию так как ожидаемо(0 1 2 3 0 1 2 3 ..). А при переходе на новую строку я получаю

0
0 3

А ожидаю:

0 0 0 ... 0
1 1 1 ... 1
2 2 2 ... 2
3 3 3 ... 3

Код метода:

 private static synchronized void controller(int number, RandomAccessFile raf) throws IOException {
    String file = raf.readLine()+"";
    String line = "";
    if(number!=0)
        raf.seek(file.replaceAll("null","").getBytes().length * number);
    else
        raf.seek(file.replaceAll("null","").getBytes().length);
    line = raf.readLine() + "";
    line = line.replaceAll("\n","").replaceAll("null", "") + number + " ";
    line += "\n";
    raf.write(line.getBytes());
}

код вызова метода:

RandomAccessFile file = new RandomAccessFile("someFile.txt","rw");
new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                controller(0, file);
                controller(1, file);
                controller(2, file);
                controller(3, file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

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

Answer 1

Метод RandomAccessFile.readLine() читает символы только стандартной ASCII кодировке:

Each byte is converted into a character by taking the byte's value for the lower eight bits of the character and setting the high eight bits of the character to zero. This method does not, therefore, support the full Unicode character set.

То есть, если в файле будут встречаться не ASCII символы или итого хуже кодировка будет 2-х байтовая, то будет читать разный мусор.

Короче все зависит от кодировки исходного вашего файла. Если кодировка UTF-8, то можно попробовать прочитать методом: RandomAccessFile.readUTF()

P.S. lineString.getBytes() - подсчитывает количество байтов используя текущую кодировку JVM, а не кодировку файла - так что это нерабочий код.

READ ALSO
Отображение CoordinatorLayout

Отображение CoordinatorLayout

Вообщем у меня есть CoordinatorLayout и мну нужно его редактировать, но проблема в том, что его preview не отображается в android Studio? А запускать по 500 раз...

241
WebSocket подключение с VPN

WebSocket подключение с VPN

Сервер Tomcat 8 (Java EE)Машина Ubuntu 16

235
JAVA REST API Как правильно делать

JAVA REST API Как правильно делать

Не совсем понимаю как должна выглядеть структура проекта, соответствующая REST APIНа данный момент у меня есть простой сервлет

160
Вставка изображения в TextView (Java)

Вставка изображения в TextView (Java)

Пытаюсь вставить изображение в TextViewПо нажатию на кнопку выполняется следующий код:

180