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é ?

藏色散人
Libérer: 2023-01-05 11:28:53
original
30699 Les gens l'ont consulté

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)
Copier après la connexion

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());
Copier après la connexion

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);
    }
Copier après la connexion

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();
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal