dataoutputstream亂碼怎麼辦

2023-01-05 14:00:44

dataoutputstream亂碼的解決辦法:1、通過「dos.write("...".getBytes());」方式寫入String;2、設定「new OutputStreamWriter(new FileOutputStream(file), "utf-8");」即可。

本教學操作環境:Windows10系統、Java8.0版、Dell G3電腦。

dataoutputstream亂碼怎麼辦?

解決DataOutputStream亂碼的問題

這個坑我就先踩為敬了,重要的話說三遍!

千萬不要用DataOutputStream的 writeBytes 方法

千萬不要用DataOutputStream的 writeBytes 方法

千萬不要用DataOutputStream的 writeBytes 方法

我們使用 DataOutputStream 的時候,比如想寫入String ,你就會看到三個方法

public final void writeBytes(String s)
public final void writeChars(String s)
public final void writeUTF(String str)
登入後複製

OK,那你試著去寫入相同的內容後,再去讀取一下試試

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());
登入後複製

是的,你沒看錯,writeBytes方法寫入的內容讀出來,為啥亂碼了?

點進去看看實現

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);
    }
登入後複製

大哥,這char型別被強轉為 byte型別了,失精度了呀,怪不得回不來了,所以使用的時候千萬別貪方便,老老實實換成 dos.write("你好".getBytes()); 都好的呀

DataOutputStream寫入txt檔案資料亂碼

這是正常的,如果要讀,要用DataInputStream讀出,如果僅要保成文字檔案直接要FileOutputStream或PrintWriter

OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
oStreamWriter.append(str);
oStreamWriter.close();
登入後複製

主要是編碼方式不一樣

要用字元流 而非位元組流

BufferedReader類從字元輸入流中讀取文字並緩衝字元,以便有效地讀取字元,陣列和行

推薦學習:《》

以上就是dataoutputstream亂碼怎麼辦的詳細內容,更多請關注TW511.COM其它相關文章!