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能夠免去程序員對於長度的考慮,由於這兩個函數為我們攻克了長度問題。寫入了文件。因此我們無需關心。但這樣就使用了額外的空間去記錄長度信息。
