2017-05-05 10 views
0

私は区切り文字で、テキストファイルのすべての部分を放出するためのコードのこの部分を思い付いたが、延期は、放出された文字列を、私は本当にこの二重の質問です見当がつかない、最初に二重の疑問符をしているrxjava-stringにはどのような二重疑問符がありますか?

マークは例えば

から来るこれは

あるtest.txt私のテキストファイルの内容である

pieceOne;pieceTwo;pieceThree;

と、これはコンソールで;区切り文字と私の出力です:

??pieceOne  
pieceTwo  
pieceThree 

とここに私のコードです:

public Observable<String> readFile(String filePath, String delimiter) { 
     return Observable.just(filePath) 
       .map(Paths::get) 
       .map(this::safeInitializeInputStream)//just initialize inputstream here 
       .flatMap(in -> readInputStream(in, delimiter)) 
       .observeOn(scheduler); 
    } 

private Observable<String> readInputStream(InputStream is, String delimiter) { 
     return StringObservable 
       .split(StringObservable.from(new InputStreamReader(is, 
         Charset.forName("UTF-8"))), delimiter); 
    } 

任意のアイデアは非常に高く評価されるだろう。

+2

ほとんどのファイルはWindowsマシンからのもので、notepad.exeによってUTF-16として保存され、最初の2文字は「BOM」という「バイトオーダーマーク」です。通常は '0xff'' 0xfe'でなければなりません。ヘキサビューアをチェックインします。 – 9000

+1

@ 9000ええ、まあ、ありがとうplz私はあなたを受け入れることができるように答えとしてurのコメントを投稿 –

答えて

2

おそらくファイルがWindowsマシンからのもので、UTF-16としてnotepad.exeをによって保存され、最初の2つの文字は「バイトオーダーマーク」ありました、別名BOM。通常は0xff0xfeである必要があります。ヘキサビューアをチェックインします。

残りのデータがASCIIの場合、これらのバイトは安全に省略できます。そうでない場合は、UTF-16から正しくデコードする必要があります。デコーダはBOMを処理します。

1

私は使用したクラス 'StringObservable'を見つけられませんでした。私の代わりに私が考える

compile "com.github.akarnokd:rxjava2-extensions:0.17.0" 

を使用しました? UTF-8で表現できない2バイトのためです。 (コメントからコピー)

@Test 
void name() { 
    // pieceOne;pieceTwo;pieceThree; 
    readFile("/home/sergej/Desktop/wurstdatei", ";") 
      .test() 
      .assertValues("pieceOne", "pieceTwo", "pieceThree"); 
} 

private Observable<String> readFile(String filePath, String delimiter) { 
    return Observable.just(filePath) 
      .map(Paths::get) 
      .map(path -> Files.newInputStream(path)) 
      .flatMap(in -> readInputStream(in, delimiter)) 
      .observeOn(Schedulers.io()); 
} 

private Observable<String> readInputStream(InputStream is, String delimiter) { 
    return Flowable.just(new BufferedReader(new InputStreamReader(is))) 
      .scan("", (s, bufferedReader) -> bufferedReader.readLine()) 
      .compose(StringFlowable.split(delimiter)) 
      .toObservable(); 
} 
関連する問題