2017-05-05 2 views
0

Je suis venu avec ce morceau de code pour émettre tous les morceaux de fichier texte avec un séparateur, mais la chaîne émise de Frist ont une marque double question au début,quel double point d'interrogation sur rxjava-string signifie?

Je ne sais vraiment pas où est cette double question marque proviennent de

par exemple ceci est mon contenu du fichier texte

test.txt

pieceOne;pieceTwo;pieceThree;

et ceci est ma sortie avec ; delimiter dans la console:

??pieceOne  
pieceTwo  
pieceThree 

et voici mon code:

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

toutes les idées seraient très appréciées.

+2

Très probablement, le fichier provient d'un ordinateur Windows, a été enregistré par notepad.exe en tant que UTF-16 et les deux premiers caractères sont "marque d'ordre des octets", alias BOM. Ils doivent être '0xff'' 0xfe' normalement. Vérifiez dans une visionneuse hex. – 9000

+1

@ 9000 ouais putain droit, merci plz postez votre commentaire comme une réponse pour que je puisse vous accepter –

Répondre

2

(Copié un commentaire)

Très probablement le fichier est à partir d'une machine Windows, a été sauvé par notepad.exe en UTF-16, et les deux premiers caractères sont "octet marque d'ordre", aka BOM. Ils doivent être 0xff0xfe normalement. Vérifiez dans une visionneuse hex.

Ces octets peuvent être omis en toute sécurité si le reste des données est ASCII. Si non, vous devez décoder correctement de UTF-16; le décodeur prendra soin de la nomenclature.

1

Je n'ai pas trouvé votre classe utilisée 'StringObservable'. Je plutôt utilisé

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

Je pense ?? est à cause de deux octets qui ne peuvent pas être représentés avec 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(); 
}