我想出了这段代码,用分隔符发出每个文本文件,但是发出的字符串在开头有一个双重问号,
我真的不知道这个双重问号来自哪里
例如这是我的文本文件内容
的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);
}
任何想法都会非常感激。
答案 0 :(得分:2)
(从评论中复制)
很可能该文件来自Windows机器,由notepad.exe保存为UTF-16,前两个字符是“字节顺序标记”,即BOM。它们通常必须为0xff
0xfe
。签入十六进制查看器。
如果其余数据是ASCII,则可以安全地省略这些字节。如果没有,你必须从UTF-16正确解码;解码器将处理BOM。
答案 1 :(得分:1)
我没找到你用过的课程&#39; StringObservable&#39;。我改为使用
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();
}