Comment comprendre le flux IO en Java - rationalisation

Table des matières

introduction

flux mis en mémoire tampon 

flux de tampon d'octets 

flux de tampon de caractères 

transformer le flux 

flux de conversion d'entrée de caractères 

flux de conversion de sortie de caractères 

Sérialiser et désérialiser 

sérialisation d'objet 

Désérialisation d'objet 

flux d'impression 

Propriétés


 

introduction

Grâce à l'étude simple précédente, nous avons pu avoir une compréhension générale du fonctionnement du fichier, mais nous pouvons clairement sentir qu'il y a encore des inconvénients lors de l'exécution d'autres opérations, donc aujourd'hui nous allons apprendre quatre autres flux IO Pour nous aider fonctionnent sur des fichiers, ces quatre flux sont le flux de mise en mémoire tampon , le flux de conversion , la sérialisation et le flux d'impression . Eh bien, sans plus tarder, permettez-moi de commencer l'étude d'aujourd'hui !

 

 

flux mis en mémoire tampon 

  • Le streaming tamponné est également appelé streaming efficace ou streaming avancé. Le flux d'octets précédemment appris peut également être appelé flux brut.
  • Fonction : le flux de tampon possède son propre tampon, ce qui peut améliorer les performances de lecture des données du flux d'octets et du flux de caractères d'origine.
  • Exemple d'image : Si nous imaginons les opérations d'entrée et de sortie du fichier comme le processus de transport de l'eau, au début, l'eau (données) est transportée directement vers la conduite d'eau, et la différence entre le débit tampon est que l'eau ne pas besoin d'être connecté au tuyau d'eau. , il doit seulement être amarré au réservoir d'eau devant le tuyau d'eau, ce qui peut améliorer l'efficacité du transport.
  • Il existe deux types de flux de tampon, l'un est un flux de tampon d'octets et l'autre est un flux de tampon de caractères. Ce sont BufferedInputStream (flux d'entrée mis en mémoire tampon par octets) , BufferedOuputStream (flux de sortie mis en mémoire tampon par octets) , BufferedReader (flux d'entrée mis en mémoire tampon par caractères) , BufferedWriter (flux de sortie mis en mémoire tampon par caractères). 

flux de tampon d'octets 

  • Flux d'entrée en mémoire tampon d'octets : BufferedInputStream, améliore les performances de lecture des données à partir du flux d'entrée d'octets, et les fonctions de lecture et d'écriture n'ont pas changé
  • Flux de sortie en mémoire tampon d'octets : BufferedOutputStream, améliore les performances de lecture des données à partir du flux de sortie d'octets, et il n'y a aucun changement dans les fonctions de lecture et d'écriture
Constructeur illustrer

public BufferedInputStream (InputStream est)

Le flux d'entrée d'octets de bas niveau peut être encapsulé dans un pipeline de flux d'entrée tamponné d'octets de haut niveau, améliorant ainsi les performances de lecture des données à partir du flux d'entrée d'octets.
public BufferedOutputStream (OutputStream os) Le flux de sortie d'octets de bas niveau peut être encapsulé dans un pipeline de flux de sortie à mémoire tampon d'octets de haut niveau, améliorant ainsi les performances d'écriture des données
InputStream is = new FileInputStream("File//data.txt");
InputStream bis = new BufferedInputStream(is);
OutputStream os = new FileOutputStream("File//data01.txt");
OutputStream bos = new BufferedOutputStream(os);
int len;
byte []buffer = new byte[1024];
while ((len = bis.read(buffer))!=-1){
bos.write(buffer,0,len);
bos.flush();

Copie le contenu d'un fichier dans un autre via un flux de tampon d'octets.

 

flux de tampon de caractères 

Flux d'entrée en mémoire tampon de caractères : BufferedReader, qui améliore les performances de lecture des données du flux d'entrée de caractères, en plus de la fonction de lecture des données par ligne

Constructeur illustrer
public BufferedReader (lecteur r) Le flux d'entrée de caractères de bas niveau peut être enveloppé dans un pipeline de flux d'entrée de caractères tamponné de haut niveau, améliorant ainsi les performances de lecture des données à partir du flux d'entrée de caractères.
méthode illustrer
chaîne publique readLine() Lire une ligne de données et retourner, si la lecture n'est pas terminée, il n'y a pas de ligne à lire et retourner null
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);//由于是子类独有的功能,所有不能使用多态创建
        String s;
        byte []buffer = new byte[1024];
        while ((s = br.readLine())!=null){
            System.out.println(s);
        }
//正常情况下会将文件中的数据依次输出;
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);
        br.readLine();
        br.readLine();
//若文件中的数据不足两行:
//kdirvingJamesJame
//null

Flux de sortie en mémoire tampon de caractères : BufferedWriter, qui améliore les performances du flux de sortie de caractères en écrivant des données, en plus de la fonction de retour à la ligne 

Constructeur illustrer
Public BufferedWriter(Writer w) Le flux de sortie de caractères de bas niveau peut être conditionné dans un pipeline de flux de sortie de caractères tamponné de haut niveau, améliorant ainsi les performances d'écriture de données dans le flux de sortie de caractères.
méthode illustrer
public void newLine() faire une action
        Writer w = new FileWriter("File//data.txt",true);
        BufferedWriter bw = new BufferedWriter(w);//由于是子类独有的功能,所有不能使用多态创建
        bw.write("石原里美");
        bw.newLine();
        bw.write("工藤静香");
        bw.newLine();
        bw.flush();

Il convient de noter que si vous souhaitez ajouter le fichier lors de l'écriture du fichier, vous devez définir true sur l'objet Writer, pas sur l'objet BufferedWriter.

 

transformer le flux 

Avant d'en savoir plus sur les flux de conversion, ce que nous devons comprendre, c'est si l'encodage du code et l'encodage du fichier sont incohérents. L'utilisation du flux de caractères pour lire directement entraînera des caractères brouillés, nous avons donc besoin que l'encodage du code et l'encodage du fichier soient cohérents pour garantir qu'il n'y aura pas de caractères brouillés, et l'apparence du flux de conversion est d'éviter ce genre de chose. . 

 

flux de conversion d'entrée de caractères 

La première est de donner une idée simple pour le problème des caractères tronqués :

1. Utilisez la saisie de caractères pour convertir les flux ;

2. Le flux d'octets d'origine du fichier (encodage différent) peut être extrait et il n'y aura aucun problème avec l'octet d'origine.

3. Convertissez le flux d'octets en flux d'entrée de caractères avec le codage spécifié, afin que les caractères du flux d'entrée de caractères ne soient pas brouillés.

Flux de conversion d'entrée de caractères : InputStreamReader, qui peut convertir le flux d'octets d'origine en un flux d'entrée de caractères selon l'encodage spécifié

Constructeur illustrer
public InputStreamReader (InputStream est) Le flux d'octets d'origine peut être converti en un flux d'entrée de caractères selon l'encodage par défaut du code. presque jamais
public InputStreamReader (InputStream est, jeu de caractères de chaîne) Le flux d'octets d'origine peut être converti en un flux d'entrée de caractères selon le codage spécifié, de sorte que les caractères du flux de caractères ne soient pas brouillés

        InputStream is = new FileInputStream("File//data.txt");
        InputStreamReader isr = new InputStreamReader(is);
        InputStreamReader isr = new InputStreamReader(is,"GBK");

Dans le code ci-dessus, on sait que le format d'encodage du fichier data.txt est défini sur GBK et que l'encodage du code est utf-8, il est donc nécessaire de convertir le flux pour rendre l'encodage cohérent. Un constructeur utilise par défaut utf-8, ce qui n'est évidemment pas acceptable.Le second consiste à spécifier l'encodage, à convertir le flux d'entrée d'octets d'origine en un flux d'entrée de caractères et à le lire sous la forme de GBK.

flux de conversion de sortie de caractères 

Flux de conversion de sortie de caractères : OutputStreamWriter, qui peut convertir le flux de sortie d'octets en un flux de sortie de caractères selon l'encodage spécifié

Constructeur illustrer
public OutputStreamWriter (OutputStream os) Le flux de sortie d'octets d'origine peut être converti en un flux de sortie de caractères selon l'encodage par défaut du code, presque inutile
public OutputStreamWriter(OutputStream os,String charset) Il peut convertir le flux de sortie d'octets d'origine en un flux de sortie de caractères selon l'encodage spécifié

Tout d'abord, nous devons savoir à quoi sert le flux de conversion de sortie de caractères dans le monde réel. À ce stade, nous devons transmettre un fichier encodé en GBK.

        OutputStream os = new FileOutputStream("File//data.txt");
        Writer osw = new OutputStreamWriter(os);
        Writer osw = new OutputStreamWriter(os,"GBK");

Dans le code ci-dessus, le premier est l'utf-8 par défaut, il est donc presque inutile, et le second consiste à spécifier le format de fichier d'encodage requis par le client.

 

Sérialiser et désérialiser 

sérialisation d'objet 

  • Flux de sortie d'octets d'objet , ObjectOutputStream
  • Fonction : basé sur la mémoire, stocke des objets en mémoire dans des fichiers de disque, ce qui s'appelle la sérialisation d'objets
Constructeur illustrer
public ObjectOutputStream (OutputStream os) Enveloppez le flux de sortie d'octets de bas niveau dans un flux de sortie d'octets d'objet de haut niveau

 La première consiste simplement à créer une classe étudiante Student. Il convient de noter que lorsque Java spécifie la sérialisation d'objets, la classe doit implémenter l' interface Serializable .

public class Student implements Serializable {
    private String name;
    private int age;
    private String number;
    private String classroom;
}

L'étape suivante consiste à implémenter la sérialisation de l'objet :

        Student s = new Student("石原里美",18,"001","智能一班");
        OutputStream os = new FileOutputStream("File//data.txt");
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(s);
        oos.close();

De plus, si vous ne souhaitez pas que certaines données de l'objet ne participent pas à la sérialisation, vous pouvez le modifier par transient , tel que "nom de chaîne transitoire privé". Après avoir effectué cette opération, les données afficheront null lorsqu'elles seront désérialisées. .

Désérialisation d'objet 

  • Flux d'entrée d'octets d'objet, ObjectInputStream
  • Fonction : basée sur la mémoire, restaurer les données d'objet stockées dans des fichiers de disque dans des objets en mémoire, ce qui s'appelle la désérialisation d'objet
Constructeur illustrer
Public ObjectInputStream (InputStream est) encapsule un flux d'entrée d'octets de bas niveau dans un flux d'entrée d'octets d'objet de haut niveau
nom de la méthode illustrer
Objet public readObject() Restaurez les données d'objet stockées dans le fichier disque sur l'objet en mémoire et retournez
        InputStream is = new FileInputStream("File//data.txt");
        ObjectInputStream ois = new ObjectInputStream(is);
        Object s = ois.readObject();
        System.out.println(s);
//输出结果:
//Student{name='石原里美', age=18, number='001', classroom='智能一班'}

En outre, il existe un autre point de connaissance. Lors de la définition d'une classe, vous pouvez définir un numéro de série de version, et lors de la désérialisation du numéro de série, le numéro de série doit être cohérent avant de pouvoir être lu normalement, tel que "private static final long serialVersionUID = 1 ; "

Si le numéro de série de la version dans la classe est modifié après la première sérialisation, la désérialisation signalera une erreur avant la seconde re-sérialisation.

 

flux d'impression 

  • Fonction : le flux d'impression peut réaliser des données d'impression pratiques et efficaces dans le fichier. Se réfère généralement à PrintStream, WriteStream deux classes
  • Quelles données peuvent être imprimées sont quelles données, par exemple, imprimer l'entier 97, l'écrire est 97, imprimer booléen vrai, l'écrire est vrai
Constructeur illustrer
public PrintStream (OutputStream os) Le flux d'impression va directement au canal de flux de sortie d'octets
public PrintStream(Fichier f) Le flux d'impression va directement à l'objet fichier
public PrintStream (chemin du fichier de chaîne) Le flux d'impression va directement au chemin du fichier
nom de la méthode illustrer
impression d'annulation publique (Xxx xx) imprimer tout type de données

//三种构造器的使用
PrintStream ps = new PrintStream("File//data01.txt");
PrintStream ps1 = new PrintStream(new File("File//data.txt"));
PrintStream ps2 = new PrintStream(new FileOutputStream(new          File("File//data.txt")));
ps.print(11);
ps.print("凯里·欧文");

La différence entre PrintStream et WriterStream :

  • La fonction d'impression des données est exactement la même, ce qui est facile à utiliser et efficace en termes de performances.
  • PrintStream hérite du flux de sortie d'octets OutputStream et prend en charge les méthodes d'écriture de données d'octets
  • PrintWriter hérite du flux de sortie de caractères Writer et prend en charge l'écriture de caractères

Propriétés

  • Fonction : Properties représente un fichier de propriétés qui peut stocker les informations de paire clé-valeur dans son propre objet dans un fichier de propriétés
  • Fichier de propriétés : le suffixe est un fichier se terminant par .properties et son contenu est key=value, qui sera utilisé ultérieurement pour les informations de configuration du système.

Constructeur illustrer
void load (InputStream est) Lire une liste d'attributs (paires clé-valeur) à partir du flux d'octets d'entrée
void load (Reader r) Lire une liste d'attributs (paires clé-valeur) à partir du flux de caractères d'entrée
void store (OutputStream os,String comments) Écrivez cette liste de propriétés (paires clé-valeur) dans ces propriétés pour générer un flux d'octets dans un format adapté à l'utilisation de la méthode load(InputStream)
void store(Writer w,String comments) Écrit cette liste de propriétés (paires clé-valeur) dans ces propriétés pour générer un flux de caractères dans un format adapté à l'utilisation de la méthode load(reader)
objet public setProperty (clé de chaîne, valeur de chaîne) Enregistrer la paire clé-valeur (put)
public String getProperty(String key) 使用此属性列表中指定的键搜索属性值(get)
public Set<String> stringPropertyNames() 所有键的名称的集合(keySet())
        Properties properties = new Properties();
        properties.setProperty("石原里美","18");
        properties.setProperty("工藤静香","19");
        properties.setProperty("朱茵","20");
        System.out.println(properties);
        //第一个参数是文件存储路径,第二个是对文件的注释
        properties.store(new FileWriter("File//Baby.properties"),"这些都是绝世美女,不接受反驳哈哈哈");

        Properties properties = new Properties();
        properties.load(new FileReader("File//Baby.properties"));
        System.out.println(properties);
//输出结果:
//{"石原里美"=18,"工藤静香"=19,"朱茵"=20}

创作不易,给个三连吧

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_50635856/article/details/125633381
conseillé
Classement