DataInputStream和DataOutputStream使用方法細節探討


DataInputStream和DataOutputStream都是Java中輸入輸出流的裝飾類,用起來非常方便。今天就來討論一下使用該類時候遇到的編碼問題。



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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM