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.
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
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!