2011-12-30 1 views
4

私は自分のWebサイトからいくつかのレポートをダウンロードするために別の会社の図書館を使っています。これらのレポートをファイルに書き込む前に解析する必要があります。なぜなら、これらのレポートが特定の基準に合致していれば無視したいからです。Java.io.Readerから意味のあるテキストを取得する

問題は、それらのメソッドdownload()はjava.io.Readerを返します。利用できる唯一の方法は、

int read(char[] cbuf); 

です。この返された配列を印刷すると意味のない文字が表示されます。どのキャラクタセットを使用しているのかをバイト配列に変換することができますが、どのように行うのかわかりません。私は

//retrievedFile is my Reader object 
char[] cbuf = new char[2048]; 
int numChars = retrievedFile.read(cbuf); 
//I've tried other character sets, too 
new String(cbuf).getBytes("UTF-8"); 

を試みたと私はそれが仕事をしたりしません場合、私は確実に知ることができないので、より便利なリーダーにダウンキャストすることが怖いです。助言がありますか?

私はそれが「無意味な文字」出力しますと言うEDIT

、私はそれはジョンスキートによって与えられた例のようになっていることを意味するものではありません。今は自分のマシンではないので、説明するのは本当に難しいですが、エンコードの問題だと思います。文字は、レポートの見た目に似た凹みや構造を持っているようです。私は火曜日に戻ってすぐにこれらの提案を試してみます(私はインターンだけなので、遠隔の口座などを設定することに悩まされていません)。

+1

'BufferedReader'を試しましたか?それがうまくいかない理由はありません... – fge

+0

'System.out.print(cbuf [i])'がi = 0,1,2 ..のためにあなたにガベージを与えた場合、他の会社のlibに問題があります。またはあなたはそれをうまく構成していない。 –

答えて

14

はこれを試してください:あなたはそれの本当の種類を知らないので

BufferedReader in = new BufferedReader(retrievedFile); 
String line = null; 
StringBuilder rslt = new StringBuilder(); 
while ((line = in.readLine()) != null) { 
    rslt.append(line); 
} 
System.out.println(rslt.toString()); 

は、任意のクラスを読者に型キャストしないでください。 代わりに、BufferedReaderを使用してReaderに渡します。また、BufferedReaderはjava.io.Readerのサブクラスを引数として取るため、使用するために保存されます。

+0

私のシナリオではうまくいった。 –

0

ファイルはテキストファイルなので、ReaderからBufferedReaderを作成し、それを1行ずつ読みます。これはその意味を理解するのに役立ちます。

1

無意味な文字は何を意味しますか?おそらくヌル文字ですが、読者からすべての文字を読み取るのではなく、最大で2048文字です。読み込みメソッドから返された値を無視します(実際に読み取られた文字の数が分かります)。

文字列の中に全部を読みたい、あなたが返された値が負になるまでループを持っており、文字を追加しますのStringBuilderに(0からnumChars分まで)各反復で読み取った。

StringBuilder builder = new StringBuilder(); 
int numChars; 
while ((numChars = reader.read(cbuf)) >= 0) { 
    builder.append(cbuf, 0, numChars); 
} 
String s = builder.toString(); 
+0

例には 'cbuf'配列の定義がありません。これが最も効率的なIMOソリューションです。 –

4

アウト印刷char[]自体はおそらくあなたのようなものを与えるでしょう:

[[email protected] 

これは、Javaのchar配列のtoStringを呼び出す通常の出力です。それはStringに変換するように聞こえますが、これはString(char[])コンストラクタで行うことができます。一方

public class Test { 
    public static void main(String[] args) { 
     char[] chars = "hello".toCharArray(); 
     System.out.println((Object) chars); 

     String text = new String(chars); 
     System.out.println(text); 
    } 
} 

java.io.Readerchar[]を返すread方法を持っていない - それは、より有効に一度に単一の文字を返す、またはいずれかのメソッドを(持っている:ここではいくつかのサンプルコードです)char[]を入力してデータを入力し、読み取られたデータ量を返します。これは実際にサンプルコードが示すものです。新しいStringを作成するには、char配列と読み取られた文字数を使用するだけです。たとえば、

char[] buffer = new char[4096]; 
int charsRead = reader.read(buffer); 
String text = new String(buffer, 0, charsRead); 

ただし、すべてのデータが一度に返されるわけではありません。 BufferedReaderを使ってそれを1行ずつ読むことができます。あるいはループしてすべての情報を取得できます。 Guavaには、CharStreamsクラスに便利なコードが含まれています。たとえば:

String allText = CharStreams.toString(reader); 

または

List<String> lines = CharStreams.readLines(reader); 
+0

ジョン、私の方法についての間違い、私はintを返してchar []を取ることを忘れていました。 char配列の出力は、エンコーディングの問題のように見えます。私が間違って設定したこともあるかもしれません。@ amadeusの投稿 – Tom

+0

@Tom:エンコーディングの問題であれば、実装が乱れている可能性があります。 'Reader'を使うと、エンコーディング*を気にする必要はありません。あなたは図書館の詳細を伝えることができますか? –