package com.vincent.example; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class TestDataStream { public static void main(String[] args) { // 使用DataInputStream,DataOutputStream寫入文件且從文件里讀取數據。try { // Data Stream寫到輸入流中 DataOutputStream dos = new DataOutputStream(new FileOutputStream( "datasteam.txt")); dos.writeBytes("世界"); //按2字節寫入,都是寫入的低位 dos.writeChars("世界"); // 依照Unicode寫入 // 依照UTF-8寫入(UTF8變長,開頭2字節是由writeUTF函數寫入的長度信息。方便readUTF函數讀取) dos.writeUTF("世界"); dos.flush(); dos.close(); // Data Stream 讀取 DataInputStream dis = new DataInputStream(new FileInputStream( "datasteam.txt")); // 讀取字節 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)); // 讀取UTF System.out.println(dis.readUTF()); dis.close(); } catch (IOException e) { e.printStackTrace(); } } }
使用16進制方式打開文件例如以下:
能夠看出,第一個“世界”已經被截斷,兩個漢字都僅僅被寫入了低位。因此肯定亂碼。
package com.vincent.example; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class TestDataStream { public static void main(String[] args) { // 使用DataInputStream,DataOutputStream寫入文件且從文件里讀取數據。 try { // Data Stream寫到輸入流中 DataOutputStream dos = new DataOutputStream(new FileOutputStream( "datasteam.txt")); dos.write("世界".getBytes()); // 按UTF8編碼(我的系統默認編碼方式)寫入 //dos.write("世界".getBytes("GBK")); //指定其它編碼方式 dos.writeChars("世界"); // 依照Unicode寫入 // 依照UTF-8寫入(UTF8編碼長度可變。開頭2字節是由writeUTF函數寫入的長度信息,方便readUTF函數讀取) dos.writeUTF("世界"); dos.flush(); dos.close(); // Data Stream 讀取 DataInputStream dis = new DataInputStream(new FileInputStream( "datasteam.txt")); // 讀取字節 byte[] b = new byte[6]; dis.read(b); System.out.println(new String(b, 0, 6)); // 讀取字符 char[] c = new char[2]; for (int i = 0; i < 2; i++) { c[i] = dis.readChar(); } System.out.println(new String(c, 0, 2)); // 讀取UTF System.out.println(dis.readUTF()); dis.close(); } catch (IOException e) { e.printStackTrace(); } } }
文件打開例如以下:
能夠看出,讀取前6字節並依照UTF-8解碼就能夠避免亂碼。
值得注意的是。String構造函數也能夠指定對byte數組作其它編碼方式的解碼。比如:new String(b,0,6,"GBK")。同一時候使用writeUTF和readUTF能夠免去程序員對於長度的考慮,由於這兩個函數為我們攻克了長度問題。寫入了文件。因此我們無需關心。但這樣就使用了額外的空間去記錄長度信息。