Tout d'abord, permettez-moi d'introduire la différence entre InputStreamReader et FileReader. Le contenu spécifique est le suivant:
InputStreamReader et BufferedReader. La classe la plus importante parmi eux est InputStreamReader, qui est le pont pour convertir les octets en caractères. Vous pouvez ré-spécifier la méthode de codage dans le constructeur. Si elle n'est pas spécifiée, la méthode de codage par défaut du système d'exploitation sous-jacente sera adoptée, comme GBK, etc.
FileReader et InputStreamReader impliquent une conversion de codage (spécifiez la méthode de codage ou utilisez le codage par défaut du système d'exploitation), et le code brouillé peut se produire sur différentes plates-formes! FileInputStream est traité en mode binaire et n'aura pas de code brouillé.
Les flux d'octets FileInputStream sont des octets d'octets lus.
Les flux de caractères FileReader sont lus comme des personnages un par un.
BufferedReader bufReader = null; inputStreamReader isr = null; fileReader fr = null; try {for (String filename: fileNames) {méthode 1: iSr = new inputStreamReader (new FileInputStream ("d: /test.txt"), "utf-8"); bufReader = new BufferedReader (ISR); Méthode 2: FR = nouveau FileReader ("d: /test.txt"); bufReader = new BufferedReader (FR); while (bufReader.ready ()) {// 1. Obtenez chaque ligne de données de données de données Dataline = bufReader.readline (); }}La différence entre InputStream et Reader
Il existe deux classes abstraites ci-dessous Java.io: InputStream et Reader
InputStream est une superclasse qui représente toutes les classes d'un flux d'entrée d'octets.
Lecteur est une classe abstraite pour lire des flux de personnages
InputStream fournit la lecture des flux d'octets, et non la lecture de texte, qui est la différence fondamentale entre l'informatique et la classe des lecteurs.
Autrement dit, le tableau ou la chaîne de char est lu à l'aide du lecteur, et le tableau d'octet est lu à l'aide de InputStream.
Après avoir clarifié la différence fondamentale entre les deux superclasses, examinons l'utilisation de leurs sous-classes ci-dessous. Voici seulement quelques-unes des explications les plus couramment utilisées
Entrée
| __FileInputStream
FileInputStream obtient des octets d'entrée d'un fichier dans le système de fichiers.
Résumé des méthodes de construction
FileInputStream (fichier de fichiers)
Créez un fichierInputStream en ouvrant une connexion au fichier réel, qui est spécifié par le fichier d'objet de fichier dans le système de fichiers.
FileInputStream (FileDeScriptor FDOBJ)
Créez un fichierInputStream à l'aide du descripteur de fichiers FDOBJ, qui représente une connexion existante à un fichier réel dans le système de fichiers.
FileInputStream (nom de chaîne)
Créez un fichierInputStream en ouvrant une connexion au fichier réel, spécifié par le nom de pathname dans le système de fichiers.
Lecteur
| - BufferedReader
| ___ InputStreamReader
| __FileReader
BufferedReader: Lisez le texte d'un flux d'entrée de caractères et tamponne des caractères individuels, permettant ainsi une lecture efficace des caractères, des tableaux et des lignes.
Résumé des méthodes de construction
BufferedReader (lecteur dans)
Crée un flux d'entrée de caractères tamponné qui utilise le tampon d'entrée de taille par défaut.
BufferedReader (lecteur dans, int sz)
Crée un flux d'entrée de caractères tamponné qui utilise le tampon d'entrée de taille spécifié.
BufferedReader (plate-forme Java SE 6)
La plus grande fonctionnalité de BufferedReader est le paramètre de tampon. Habituellement, chaque demande de lecture faite par lecteur se traduira par des demandes de lecture correspondantes pour le flux de caractère ou d'octet sous-jacent. S'il n'y a pas de tampon, chaque appel à lire () ou readLine () entraînera des octets lus à partir du fichier et le convertir en caractères et le renvoyer, ce qui est extrêmement inefficace.
Utilisez le BufferedReader pour spécifier la taille du tampon, ou la taille par défaut peut être utilisée. Dans la plupart des cas, la valeur par défaut est suffisamment grande.
Par conséquent, il est recommandé d'envelopper tous les lecteurs dont les opérations read () peuvent être coûteuses (comme FileReader et InputStreamReader) avec BufferedReader.
Par exemple,
BufferedReader dans = new BufferedReader (nouveau FileReader ("foo.in"));Buffer l'entrée dans le fichier spécifié.
InputStreamReader (plate-forme Java SE 6)
InputStreamReader est le pont entre les flux d'octets et les flux de caractères: il lit des octets en utilisant le charset spécifié et les décode en caractères. Le jeu de caractères qu'il utilise peut être spécifié ou explicitement donné par le nom, ou il peut accepter le jeu de caractères par défaut de la plate-forme.
Résumé des méthodes de construction
InputStreamReader (InputStream in) crée un lecteur InputStreamRe qui utilise le jeu de caractères par défaut. InputStreamReader (InputStream IN, Charset CS) crée un lecteur InputStreamRe qui utilise le jeu de caractères donné. InputStreamReader (InputStream IN, CharSetDeccoder dec) crée un lecteur InputStreamRead qui utilise le décodeur de configuration de caractères donné. InputStreamReader (InputStream IN, String CharSetName) crée un leader InputStreamRe qui utilise le jeu de caractères spécifié.
Chaque appel à une méthode read () dans leader InputStreamRed entraîne un ou plusieurs octets lus à partir du flux d'entrée sous-jacent. Pour permettre une conversion efficace de l'octet au caractère, vous pouvez lire plus d'octets à partir du flux sous-jacent à l'avance, dépassant les octets nécessaires pour satisfaire l'opération de lecture actuelle.
Pour obtenir une efficacité maximale, envisagez d'envelopper leader InputStreamRed à l'intérieur du BufferedReader. Par exemple:
BufferedReader dans = new BufferedReader (new InputStreamReader (System.in));
La plus grande caractéristique de InputStreamReader est qu'elle peut se référer au format de codage fixe de la conversion, ce qui n'est pas possible avec d'autres classes. Il peut être vu à partir de la méthode de construction. Ceci est très utile lors de la lecture des caractères chinois.
Chef de file
1) Introduction à la classe FileReader:
Les sous-classes de la classe InputStreamReader, toutes les méthodes (read (), etc.) sont héritées de la classe parent InputStreamReader;
2) Différences par rapport à la classe InputStreamReader:
Résumé des méthodes de construction
FileReader (fichier de fichier)
Créez un nouveau fichier FileReader étant donné un fichier à partir duquel les données sont lues.
FileReader (FileScriptor FD)
Créez un nouveau fichier FileReader compte tenu d'un fichier de dosscripteur à partir desquels les données sont lues.
FileReader (nom de fichier de chaîne)
Créer un nouveau fichier de fichier compte tenu du nom de fichier à partir duquel les données sont lues
La principale différence entre cette classe et sa classe parent InputStreamReader est le constructeur, et la principale différence est le constructeur!
À partir du constructeur de InputStreamReader, les paramètres sont la méthode InputStream et Encoding. On peut voir que lorsque vous souhaitez spécifier la méthode de codage, la classe InputStreamReder doit être utilisée; et les paramètres du constructeur FileReader sont les mêmes que FileInputStream, qui est un objet de fichier ou une chaîne représentant le chemin. On peut voir que lorsque vous souhaitez lire un fichier en fonction de l'objet ou de la chaîne de fichiers, utilisez FileReader;
Je pense que la fonction de la sous-classe FileReader réside dans cette petite division du travail. La principale différence entre cette classe et sa classe parent InputStreamReader est le constructeur, et la principale différence est le constructeur!
De InputStreamReader
Dans le constructeur, les paramètres sont l'entrée de la méthode et le codage. On peut voir que lorsque vous souhaitez spécifier la méthode de codage, la classe InputStreamReder doit être utilisée; et les paramètres du constructeur FileReader sont les mêmes que FileInputStream, qui est un objet de fichier ou une chaîne représentant le chemin. On peut voir que lorsque vous souhaitez lire un fichier en fonction de l'objet ou de la chaîne de fichiers, utilisez FileReader;
Je pense que la fonction de la sous-classe FileReader réside dans cette petite division du travail.
Deux connexions et différences
(1) caractères et octets:
La classe FileInputStream utilise une entrée / sortie binaire, et la vitesse d'E / S est rapide et efficace, mais sa méthode Read () lit un octet (données binaires), qui est très défavorable à la lecture des gens, et il ne peut pas fonctionner directement sur des caractères dans le fichier, tels que le remplacement et la recherche (il doit être exploité en octets);
La classe de lecture compense ce défaut et peut saisir / sortir au format texte, ce qui est très pratique; Par exemple, vous pouvez utiliser la boucle while ((ch = fileReader.read ())! = - 1) Pour lire le fichier; Vous pouvez utiliser la méthode ReadLine () de BufferedReader pour lire la ligne de texte par ligne.
(2) Encodage
InputStreamReader, c'est le pont pour convertir les octets en caractères. Vous pouvez ré-spécifier la méthode de codage dans le constructeur. Si elle n'est pas spécifiée, la méthode de codage par défaut du système d'exploitation sous-jacente sera adoptée, comme GBK, etc.
FileReader et InputStreamReader impliquent une conversion de codage (spécifiez la méthode de codage ou utilisez le codage par défaut du système d'exploitation), et le code brouillé peut se produire sur différentes plates-formes! FileInputStream est traité en mode binaire et n'aura pas de code brouillé.
Par conséquent, lors de la spécification de la méthode de codage, la classe InputStreamReader doit être utilisée, il s'agit donc d'un pont pour convertir les octets en caractères;
(3) zone de cache
La classe BufferReader est utilisée pour envelopper tous les lecteurs dont les opérations Read () peuvent être coûteuses (comme FileReader et InputStreamReader).
(4) Utilisation standardisée
Résumez ce qui précède et trouvez une meilleure utilisation standard:
1) file file = new File ("Hello.txt");
FileInputStream dans = new FileInputStream (fichier);
2) file file = new File ("Hello.txt");
FileInputStream dans = new FileInputStream (fichier); InputStreamReader inReader = new inputStreamReader (in, "utf-8"); BufferedReader bufreader = new BufferedReader (inReader);
3) file file = new File ("Hello.txt");
FileReader fileReader = new fileReader (fichier); BufferedReader Bufreader = new BufferedReader (FileReader);