Чтение файла искажено при использовании RandomAccessFile

Во-первых, я использую этот код для записи двух строк в файл:

String lineSeparator = System.getProperty("line.separator", "\n");
String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test1.txt";
RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "rw");

randomAccessFile.writeUTF("aaaaaaaaaaaaaaaaaaaaa");
randomAccessFile.write(lineSeparator.getBytes());
randomAccessFile.writeUTF("bbbbbbbbbbbbbbbbbbbb");
randomAccessFile.write(lineSeparator.getBytes());

randomAccessFile.close();

После записи файла я прочитал файл:

RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
int i = 0;
String line;
while ((line = randomAccessFile.readLine()) != null) {
    Log.i("log", (i++)+" : "+line);
}
randomAccessFile.close();

Но произошли странные вещи, каждая строка начинается с ��, я не знаю, что это такое.

Полные журналы:

07-13 07:21:41.027 1138-1138/? I/log: 0 : ��aaaaaaaaaaaaaaaaaaaaa
07-13 07:21:41.027 1138-1138/? I/log: 1 : ��bbbbbbbbbbbbbbbbbbbb

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


Я попытался использовать writeChars вместо writeUTF, но в журнале появилось больше искаженных символов:

07-13 08:14:26.352 16821-16821/? I/log: 0 : ��a��a��a��a��a��a��a��a��a��a��a��a��a��a��a��a��a��a��a��a��a
07-13 08:14:26.352 16821-16821/? I/log: 1 : ��b��b��b��b��b��b��b��b��b��b��b��b��b��b��b��b��b��b��b��b

person L. Swifter    schedule 13.07.2017    source источник
comment
Используйте writeChars вместо записи UTF8   -  person Scary Wombat    schedule 13.07.2017
comment
@ScaryWombat Если данные не содержат разделители строк.   -  person user207421    schedule 13.07.2017


Ответы (1)


randomAccessFile.writeUTF("aaaaaaaaaaaaaaaaaaaaa");
randomAccessFile.write(lineSeparator.getBytes());
randomAccessFile.writeUTF("bbbbbbbbbbbbbbbbbbbb");
randomAccessFile.write(lineSeparator.getBytes());
randomAccessFile.close();

Единственный способ прочитать это:

String aaa = randomAccessFile.readUTF();
randomAccessFile.readFully(lineSeparator.getBytes());
String bbb = randomAccessFile.readUTF();
randomAccessFile.readFully(lineSeparator.getBytes());

Будет видно, что написание разделителя строк было пустой тратой времени и места.

Короче говоря, writeUTF() записывает данные, которые может прочитать только readUTF().

См. Javadoc.

person user207421    schedule 13.07.2017