2

我刚刚在 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 字节会有这样的区别吗?您还可以建议我对代码进行的任何改进。

非常感谢,感谢您的帮助:)。

4

2 回答 2

1

您正在尝试使用 ASCII 写一个新行(不是空格) - 请参阅此表

但是,您选择的 UTF 编码可能不是 8 位,而您只写入 8 位,因此 2 个或更多 8 位的组合会产生一些奇怪的符号。

0 只写空,而不是新行或空格。

试试这个:

raf.writeChar(' ');
于 2013-08-24T20:56:19.420 回答
0

raf.writeByte(10);在这两种情况下(或raf.writeByte(0);),“John”的字节都被写入您的文件。但是,您的文本编辑器选择以不同方式解释文件。使用十六进制编辑器查看真正编写的内容。

于 2013-08-24T21:03:28.303 回答