0

次の方法でファイルに書き込もうとしています:

for(String s : str){
     buffer.put(s.getBytes());
     buffer.flip();
     channel.write(buffer);
      buffer.clear();
}

だから私がファイルからフェッチしているときはいつでもchar c = (char)randomAccessFile.readChar();

ここでは、文字列に含まれていた文字を取得していません。誰か理由を教えてください。

バイトにしようとしていると仮定して変換する理由のもう1つ、Stringつまりstring.getBytes()6バイトを与えています。しかし、 char はバイトを取ることがわかっている2ので、16*6=96.

4

1 に答える 1

0

ARandomAccessFileは、バイトが基になる文字列のメモリ表現であると想定しています。呼び出すString.getBytes()と、基になる文字列の標準的な表現が得られます。で動作するコード例を次に示しますRandomAccessFile。基になるものを使用しているのではなく、代わりに aにgetBytes()キャストしていることに注意してください。charbyte

public static void main(String [] args) throws IOException {
    String str = "foo";

    SeekableByteChannel channel = Files.newByteChannel(Paths.get("C:\\tmp\\foo.txt"), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    for(int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        buffer.put((byte)(ch >> 8));
        buffer.put((byte)ch);
    }
    buffer.flip();
    channel.write(buffer);

    RandomAccessFile file = new RandomAccessFile("/tmp/foo.txt", "rw");
    try {
        while(true) {
            System.out.println(file.readChar());
        }
    } finally {
        file.close();
    }
}
于 2013-10-21T23:00:27.073 に答える