java - 使用RandomAccessFile读取文件乱码

标签 java android java-io 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

最佳答案

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。

关于java - 使用RandomAccessFile读取文件乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074169/

相关文章:

java - 如何清空文件内容而不删除java中的文件?

Java Runtime.maxMemory 不正确?

java - 在 JavaFX 中将单个阶段置于窗口的最前面

Android:自定义 Listadapter 中列表项内的 ImageView 上的 OnClickListener

android - 如何从 XML 扩展 RelativeLayout

java - 调用方法将行添加到java中的文本文件

java - 如何使用 EclipseLink 将 Oracle 类型作为输入或输出来处理 Oracle Store Procedure 调用

android - 无法访问 includeAndroidResource 在 UnitTestOptions 中是私有(private)的

java - jtextarea.settext()方法是否被缓冲?

java - 如果读取相同的文本则停止 BufferedReader