1

文字列で満たされたランダムアクセスファイルがあります(問題を説明するのに役立ちますが、実際には文字列ではないことはわかっています)。私がやりたいのは、特定の文字列、たとえば文字列#4を表示することです。整数や一般的にプリミティブなデータ型の場合はバイト長が固定されているため簡単ですが、前のすべてのバイトを合計することで正しいバイトを読み取ることができます。

すべての文字列に16文字の固定長を与えることでこの問題を解決できたので、「dog」という単語がある場合、RAFのこの単語は「dog」(dog + 13スペース)であり、バイト長は修正もしました。繰り返しますが、次の方法を使用して正しい値を簡単に読み取ることができます。

static String loadOne(int n) throws IOException {
    raf = new RandomAccessFile(file, "rw");
    raf.seek((n-1)*(fix+2));
    String x = raf.readUTF();
    return x;
}

ここで、 nは読み取りたい値の数であり、修正は1つの文字列の文字(およびバイト)の数です。

2バイトで構成されているため、文字列の1つで余分なASCII文字(ポーランド語の文字)を使用するまで、すべてが正常に見えました。文字の長さは同じ-16でしたが、17バイトあり、すべてがバラバラになりました。

私に何ができる?

4

1 に答える 1

1

期待どおりに使用されていないのではないかと強く思いますreadUTF。あなたはそれが何をするのかを正確に読みましたか?

最初の2バイトは、readUnsignedShortのように、現在のファイルポインタから開始して読み取られます。この値は、結果の文字列の長さではなく、エンコードされた文字列に含まれる後続のバイト数を示します。次のバイトは、変更されたUTF-8形式の文字をエンコードするバイトとして解釈され、文字に変換されます。

それはあなたのファイルに保存されているものと一致しますか?(ファイルの形式については何も指定していません。)

UTF-8は固定幅ではないため、シナリオには不適切に聞こえます。

エントリごとに32バイトを使用することをお勧めします。これによりchar、UTF-16コード単位として常に16個の値が得られます。new String(data, "UTF-16BE")これは、andを使用して非常に簡単に変換できますtext.getBytes("UTF-16BE")(または、必要に応じてLE代わりに使用BEできます)。そうすれば、文字だけでなく、バ​​イト単位で真に固定長の文字列を作成できます。

于 2012-12-07T16:34:38.597 に答える