2009-11-20 6 views
4

FileInputStream lit tous les octets d'un fichier et FileOutputStream écrit allbytes dans un fichierligne FileInputStream et FileOutputStream par ligne

quelle classe dois-je utiliser si je veux lire tous les octets d'un fichier, mais ligne par ligne

de sorte que

si fileA contient deux lignes

LINE1 LINE2

puis octets de ligne1 et ligne2 sont lus séparément

va de même pour FileOutputStream

+0

"lignes" implique des données textuelles. "flux de sortie" implique des données binaires. Lequel est-ce? –

Répondre

12

Fredrik a raison BufferedReader, mais je serais en désaccord sur PrintWriter - mon problème avec PrintWriter est qu'il engloutit des exceptions.

Il est intéressant de comprendre pourquoi FileInputStream et FileOutputStream n'ont aucune méthode relative aux lignes: les classes *Stream concernent les flux de données binaires. Il n'y a pas de "ligne" en termes de données binaires. Les classes *Reader et *Writer sont sur le le texte, où le concept d'une ligne a beaucoup plus de sens ... bien qu'un général Reader n'a pas assez d'intelligence pour lire une ligne (juste un bloc de caractères) donc c'est là BufferedReader entre

InputStreamReader et OutputStreamWriter sont des classes d'adaptateur, appliquant un codage de caractères à un flux d'octets pour les convertir en caractères, ou un flux de caractères pour les transformer en octets.

Donc, vous voulez probablement BufferedReader envelopper un InputStreamReader enveloppant un FileInputStream pour la lecture - puis appelez readLine(). Pour l'écriture, utilisez un BufferedWriter enveloppant un OutputStreamWriter enveloppant un FileOutputStream - puis appelez write(String) et newLine(). (Cela vous donnera le séparateur de ligne par défaut de la plate-forme - si vous voulez un particulier, il suffit d'écrire comme une chaîne.)

Il y a aussi la classe FileReader qui combine sorte de FileInputStream et InputStreamReader (et FileWriter-ce que l'équivalent), mais ceux-ci utilisent toujours l'encodage par défaut de la plate-forme, qui est presque jamais ce que vous voulez. Cela les rend tous, mais inutiles IMO.

+0

Je suis d'accord PrintWriter a des inconvénients, mais il était le plus proche de la question. J'ai commencé par suggérer un écrivain, mais il ne fait vraiment pas "ligne par ligne". Bon point cependant (+1). – Fredrik

+0

@Fredrik: Ce n'est pas votre faute si les concepteurs de bibliothèques Java ont décidé de confier trop de responsabilités à PrintWriter :( –

+0

@Jon: Merci :-) Je le sais, je voulais juste vous expliquer pourquoi je l'ai quand même recommandé. – Fredrik

Questions connexes