Maison >Java >JavaBase >Que faire si le flux de sortie de données est tronqué ?

Que faire si le flux de sortie de données est tronqué ?

藏色散人
藏色散人original
2023-01-05 11:28:5330719parcourir

Solution au flux de données tronqué : 1. Écrivez la chaîne via "dos.write("...".getBytes());"; 2. Définissez "new OutputStreamWriter(new FileOutputStream(file), "utf-8 "); " C'est ça.

Que faire si le flux de sortie de données est tronqué ?

L'environnement d'exploitation de ce tutoriel : système Windows 10, Java version 8.0, ordinateur Dell G3.

Que dois-je faire si le flux de sortie des données est tronqué ?

Résoudre le problème des caractères tronqués de DataOutputStream

Je vais d'abord éviter ce gouffre et dire les choses importantes trois fois !

Ne jamais utiliser la méthode writeBytes de DataOutputStream

Ne jamais utiliser la méthode writeBytes de DataOutputStream

Ne jamais utiliser la méthode writeBytes de DataOutputStream

Lorsque nous utilisons DataOutputStream, par exemple, nous voulons écrire une chaîne , vous verra trois méthodes

public final void writeBytes(String s)
public final void writeChars(String s)
public final void writeUTF(String str)

OK, puis essayez d'écrire le même contenu puis relisez-le

File file = new File("d:"+File.separator+"test.txt");
   DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
   dos.writeBytes("你好");
   dos.writeChars("你好");
   dos.writeUTF("你好");
   dos.flush();
   dos.close();
   
   DataInputStream dis = new DataInputStream(new FileInputStream(file));
   byte[] b = new byte[2];
   dis.read(b);
            //  `}
   System.out.println(new String(b, 0, 2));
   
   char[] c = new char[2];
   for (int i = 0; i < 2; i++) {
    c[i] = dis.readChar();
   }
            //你好
   System.out.println(new String(c, 0, 2));
   //你好
   System.out.println(dis.readUTF());

Oui, vous avez bien lu, la méthode writeBytes écrit Le contenu d'entrée est lu, pourquoi est-il tronqué ?

Cliquez pour voir l'implémentation

public final void writeBytes(String s) throws IOException {
        int len = s.length();
        for (int i = 0 ; i < len ; i++) {
            out.write((byte)s.charAt(i));
        }
        incCount(len);
    }

Frère, ce type de caractère a été converti de force en type octet et la précision a été perdue. Pas étonnant qu'il ne puisse pas être restauré, alors ne soyez pas avide de commodité. lorsque vous l'utilisez, et modifiez-le honnêtement. Cela devient dos.write("Hello".getBytes()); Tout va bien

DataOutputStream écrit les données du fichier txt avec des caractères tronqués

C'est normal Si vous voulez lire, utilisez. DataInputStream à lire. Si vous voulez juste garantir le succès, le fichier texte nécessite directement FileOutputStream ou PrintWriter

OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
oStreamWriter.append(str);
oStreamWriter.close();

La raison principale est que la méthode d'encodage est différente

Utilisez un flux de caractères au lieu d'un flux d'octets

Le La classe BufferedReader lit le texte du flux d'entrée de caractères et met les caractères en mémoire tampon pour une lecture efficace. Caractères, tableaux et lignes

Apprentissage recommandé : "Tutoriel vidéo Java"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn