2017-05-05 53 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,前兩個字符是「字節順序標記」,也就是BOM。它們通常必須是「0xff」'0xfe'。檢查一個十六進制查看器。 – 9000

+1

@ 9000是的該死的權利,謝謝你的評論作爲回答,以便我可以接受你 –

回答

2

最有可能該文件從Windows機器,被NOTEPAD.EXE爲UTF-16保存,並且前兩個字符是「字節順序標記」(從評論複製),又稱BOM。他們通常必須是0xff0xfe。檢查一個十六進制查看器。

如果其餘數據是ASCII,則可安全省略這些字節。否則,您必須從UTF-16正確解碼;解碼器將負責BOM。

1

我沒有找到你使用過的類'StringObservable'。我代替

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

我認爲?是因爲兩個字節無法用UTF-8表示。

@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(); 
}