0

大きなファイルから読み取ると、このコードから奇妙な出力が得られます。ファイルはwhileループを使用して99,999桁に印刷されましたが、ファイルを読み取って内容を印刷すると、99,988行しか出力されません。また、ファイルを読み戻すための唯一のオプションはByteBufferを使用していますか?CharBufferを使用している他のコードを見たことがありますが、どのコードを使用すべきか、どのような場合に使用すべきかわかりません。注:filePathは、ディスク上のファイルを指すPathオブジェクトです。

    private void byteChannelTrial() throws Exception {
        try (FileChannel channel = (FileChannel) Files.newByteChannel(filePath, READ)) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            String encoding = System.getProperty("file.encoding");
            while (channel.read(buffer) != -1) {
                buffer.rewind();
                System.out.print(Charset.forName(encoding).decode(buffer));
                buffer.clear();
            }
        }
4

3 に答える 3

2

通常、flip()は、バッファデータが読み取られる前に呼び出されます。rewind()メソッドは次のように機能します。

public final Buffer rewind() {
    position = 0;
    mark = -1;
    return this;
}

フリップ()のように「制限」を設定しません。

public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

したがって、読み取る前にrewind()の代わりにflip()を使用してトレイを取ります。

于 2013-03-25T08:45:19.727 に答える
1

テキストを読むにはBufferedReaderが最適です

    try (BufferedReader rdr = Files.newBufferedReader(Paths.get("path"),
            Charset.defaultCharset())) {
        for (String line; (line = rdr.readLine()) != null;) {
            System.out.println(line);
        }
    }

ところで

String encoding = System.getProperty("file.encoding");
Charset.forName(encoding);

と同等です

Charset.defaultCharset();
于 2013-03-25T07:17:11.213 に答える
0

まあ、実際にはこの組み合わせが機能することがわかります:

    private void byteChannelTrial() throws Exception {
        try (FileChannel channel = (FileChannel) Files.newByteChannel(this.filePath, READ)) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (channel.read(buffer) != -1) {
                buffer.flip();
                System.out.print(Charset.defaultCharset().decode(buffer));
                buffer.clear();
            }
        }
    }

なぜそれが機能するのかについては、私にはよくわかりません。

于 2013-03-26T06:29:14.937 に答える