2

Javaで固定長のランダムアクセスファイルを作成する方法を示すYouTubeのチュートリアルを見ました。クラス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);NEW ファイルに次の内容を保存します。

ここでは正しく見えないかもしれませんが、John の後に空白があり、名前は実際に読めます。

0 バイトと 10 バイトの使用にこのような違いがある理由を説明していただけますか?? また、コードに加えることができる改善を提案してください。

どうもありがとう、私は助けに感謝します:)。

4

2 に答える 2

1

ASCII を使用して (空白ではなく) 新しい行を書き込もうとしています -この表を参照してください。

ただし、選択した UTF のエンコーディングは 8 ビットではない可能性がありますが、8 ビットしか書いていないため、2 つ以上の 8 ビットを組み合わせると奇妙なシンボルが作成されます。

0 は、改行や空白ではなく、単純に null を書き込みます。

代わりにこれを試してください:

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

raf.writeByte(10);どちらの場合も (または) 、「John」のバイトがファイルに書き込まれていますraf.writeByte(0);。ただし、テキスト エディターは、ファイルを異なる方法で解釈することを選択しています。16 進エディタを使用して、実際に何が書き込まれているのかを確認してください。

于 2013-08-24T21:03:28.303 に答える