2011-12-21 8 views
2

Windows上でjavaとjcifsを使用してファイルを読み込む。私はマルチバイトとASCII文字を含むファイルのサイズを決定する必要があります。文字数でのファイルサイズの決定方法は?

私はそれを効率的に、またはJavaの既存のAPIをどのように達成できますか?

おかげで、

+1

あなたも、何の意味を作るために、質問のための文字コードを知っている必要があります。 *あなたはエンコーディングを知っていますか? –

+0

ファイルサイズ自体は? 'new RandomAccessFile(...)。getChannel()。size()'? – fge

+0

@fgeマルチバイト文字がない場合は、これは問題ありません。 –

答えて

1

文字カウントを取得するには、ファイルを読み取る必要があります。正しいファイルエンコーディングを指定することで、Javaがファイル内の各文字を正しく読み取れるようになります。

BufferedReader.read()は、Unicode文字の読み取り値(0〜65535の範囲の整数)を返します。だから、それを行うための簡単な方法は、次のようになります:

int countCharsSimple(File f, String charsetName) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), charsetName)); 
    int charCount = 0; 
    while(reader.read() > -1) { 
     charCount++; 
    } 
    reader.close(); 
    return charCount; 
} 

あなたはReader.read(char[])を使用してより高速なパフォーマンスを得られます:

int countCharsBuffer(File f, String charsetName) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), charsetName)); 
    int charCount = 0; 
    char[] cbuf = new char[1024]; 
    int read = 0; 
    while((read = reader.read(cbuf)) > -1) { 
     charCount += read; 
    } 
    reader.close(); 
    return charCount; 
} 

は関心のために、私はこれらの2をベンチマークとNIOバージョンはアンドレイの答えで提案されています。私は上記の2番目の例(countCharsBuffer)が最速であることを発見しました。

は、(すべてのこれらの例は、その数の行区切り文字が含まれていることに注意してください。)

+0

@thanks sudocode、同様のコードが書かれていました。しかし、私は疑問だったので、他のオプションをチェックしたい。あなたのコメントは本当に助けた。 – Sach

2

疑いで、あなたが適切なエンコーディングでそれを読まなければならない文字の正確な数を取得します。 問題は効率的にファイルを読む方法です。 Java NIOはこれを行うための最速の方法です。その後、

FileChannel fChannel = new FileInputStream(f).getChannel(); 
    byte[] barray = new byte[(int) f.length()]; 
    ByteBuffer bb = ByteBuffer.wrap(barray); 
    fChannel.read(bb); 

バイトのバッファに読み込み

String str = new String(barray, charsetName); 
str.length(); 

がディスクスピードテストを約70〜75 MB /秒を与えながら、私にとってそれは60 MB /秒のようなものだった(使用可能な最大の近くに高速で行われます)

+1

大きなファイルを読み込もうとすると、少しメモリが爆発することはありませんか? – sudocode

+1

また、 'new String(ByteBuffer、String)'はコンパイルされません。 – sudocode

+0

@sudocodeコメントありがとうございました。あなたは、絶対に正しい。アルゴリズムは、メモリに収まるファイルに対してのみ機能します(実用的な99.99%のタスクに適しています)。しかしこれは良いコメントです。 "新しい文字列(ByteBuffer、String)について"あなたはもう一度です。私はそれを "new String(barray、String)"に修正しました。ありがとう! – andrey

関連する問題