我刚看了youtube上的一个教程,展示了如何在java中创建固定长度的随机访问文件。我对writeBytes
类中RandomAccessFile
方法的概念略感混淆。
// Create an instance of the RandomAccessFile class
RandomAccessFile raf = new RandomAccessFile("RAF1.dat", "rw");
// Get the length of the file so new entries
// Are added at the end of the file
raf.seek(raf.length());
// Max input length of the persons name
int recordLength = 20;
// Each record will have a byte length of 22
// Because writeUTF takes up 2 bytes
int byteLength = 22;
// Just a random name to stick in the file
String name = "John";
// Write the UTF name into the file
raf.writeUTF(name);
// Loop through the required whitespace to
// Fill the contents of the record with a byte
// e.g recordLength - nameLength (20 - 4) = 16 whitespace
for (int i = 0; i < recordLength - name.length(); i++) {
raf.writeByte(10);
}
上面是我用来写入随机访问文件的代码。如你所见,我正在使用raf.writeByte(10);为了填补记录中的空白。
raf.writeByte(10);
在文件中存储以下内容:Ѐ潊湨ਊਊਊਊਊਊਊਊ
但是当我将raf.writeByte(10);
更改为raf.writeByte(0);
并创建新文件时...
raf.writeByte(0);
在新文件中存储以下内容:John
你可能无法在这里正确看到它,但在John之后有空格并且名称实际上是可读的。
你能解释一下为什么使用0字节和10字节会有这么大的差异吗?您还可以建议我对代码进行任何改进。
非常感谢,感谢您的帮助:)。
答案 0 :(得分:1)
您正在尝试使用ASCII编写新行(不是空格) - 请参阅this table。
但是,您选择的UTF编码可能不是8位,而您只编写8位,因此2位或更多8位的组合会产生一些奇怪的符号。
0只写空,而不是新行或空格。
请改为尝试:
raf.writeChar(' ');
答案 1 :(得分:0)
在两种情况下(raf.writeByte(10);
或raf.writeByte(0);
)都会将“John”的字节写入您的文件。但是,您的文本编辑器选择以不同方式解释文件。使用十六进制编辑器查看真正正在编写的内容。