5

次のコードがあります。

        String inputFile = "somefile.txt";
        FileInputStream in = new FileInputStream(inputFile);
        FileChannel ch = in.getChannel();
        ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE);  // BUFSIZE = 256

        /* read the file into a buffer, 256 bytes at a time */
        int rd;
        while ( (rd = ch.read( buf )) != -1 ) {
            buf.rewind();
            for ( int i = 0; i < rd/2; i++ ) {
                /* print each character */
                System.out.print(buf.getChar());
            }
            buf.clear();
        }

しかし、文字は ? で表示されます。これは、Unicode 文字を使用する Java と関係がありますか? これを修正するにはどうすればよいですか?

4

6 に答える 6

7

ファイルのエンコーディングを知ってから、そのエンコーディングを使用してByteBufferをCharBufferにデコードする必要があります。ファイルがASCIIであると仮定します。

import java.util.*;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;

public class Buffer
{
    public static void main(String args[]) throws Exception
    {
        String inputFile = "somefile";
        FileInputStream in = new FileInputStream(inputFile);
        FileChannel ch = in.getChannel();
        ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE);  // BUFSIZE = 256

        Charset cs = Charset.forName("ASCII"); // Or whatever encoding you want

        /* read the file into a buffer, 256 bytes at a time */
        int rd;
        while ( (rd = ch.read( buf )) != -1 ) {
            buf.rewind();
            CharBuffer chbuf = cs.decode(buf);
            for ( int i = 0; i < chbuf.length(); i++ ) {
                /* print each character */
                System.out.print(chbuf.get());
            }
            buf.clear();
        }
    }
}
于 2008-09-18T15:39:24.363 に答える
3

buf.getChar() は 1 文字あたり 2 バイトを想定していますが、1 しか格納していません。次を使用します。

 System.out.print((char) buf.get());
于 2008-09-18T15:27:37.340 に答える
2

somefile.txt のエンコーディングによっては、文字が実際には 2 バイトで構成されていない場合があります。このページでは、適切なエンコーディングでストリームを読み取る方法について詳しく説明します。

残念なことに、ファイル システムはファイルのエンコーディングを認識していないため、それを教えてくれません。それに関する限り、それは単なるバイトの集まりです。エンコーディングをプログラムに伝える何らかの方法を見つけるか、何らかの方法で検出するか、(可能であれば) エンコーディングが常に同じであることを確認する必要があります (UTF-8 など)。

于 2008-09-18T15:34:20.367 に答える
2

printステートメントを次のように変更します。

System.out.print((char)buf.get());

役に立ちそうです。

于 2008-09-18T15:27:33.050 に答える
1

ファイルをそのように読んでいる特定の理由はありますか?

ASCII ファイルを読み込んでいる場合は、実際には Reader を使用する必要があります。

私はそれを次のようにします:

File inputFile = new File("somefile.txt");
BufferedReader reader = new BufferedReader(new FileReader(inputFile));

そして、どちらかreadLineまたは類似のものを使用して、実際にデータを読み込みます!

于 2008-09-18T15:21:37.980 に答える
0

はい、ユニコードです。

ファイルに 14 文字ある場合、'?' は 7 つしか得られません。

解決待ち。まだ考えています。

于 2008-09-18T15:20:40.417 に答える