rxjava-string上的双重问号是什么意思?

时间:2017-05-05 17:31:50

标签: java rx-java inputstream

我想出了这段代码,用分隔符发出每个文本文件,但是发出的字符串在开头有一个双重问号,

我真的不知道这个双重问号来自哪里

例如这是我的文本文件内容

的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 个答案:

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