一.DataOutputStream類提供了如下3種寫入字串的方法:
1.writeByte(String s);
2.writeChars(String s);
3.writeUTF(String s);
二.三種方法的穩定性
其中,前兩種方法主要用於操作基礎資料型別 (Elementary Data Type)位元組(Byte)和字元(Char)的寫入,而第三種主要用於操作字串(String)的讀取。由於Java中的字元是Unicode編碼的,是雙位元組的。
writeBytes只會將字串中的每一字元的低位元組內容寫入目標裝置中,所以會存在遺失資料的可能性。如果你寫的是"a"這個String,當它取出'a'這個字元後,強轉為Byte,由於字元'a'完全可以用一個位元組表示,所以沒有遺失資料。但如果你寫的是這個String包含中文,比如"你"(由於中文是用兩個位元組編碼的),當它取出'你'這個字元後,強轉為byte,由於字元'你'必須用2個位元組才能表示,所以遺失資料。
writeChars方法也是依次取出每一個字元,分別寫入底層的流中。因為每個字元佔2個位元組,所以對於每一個字元,也必須連續寫入2個位元組才能完整的表示。使用writeChars寫入String不會造成資料的丟失,但是如果想取出寫入的String,則必須要知道原String的長度,通過控制連續讀取的位元組數來讀取。
writeUTF將字元申按照UTF編碼後的位元組長度寫入目標裝置,然後才是每一個位元組的UTF編碼,不存在遺失資料的風險,而且只有writeUTF方法向目標裝置中寫入字串的長度,所以也能準確地讀回寫入字元申。
三.使用例子
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;public class Test {public static void main(String[] args) {try { FileOutputStream fs=new FileOutputStream("D:/test.txt"); DataOutputStream ds=new DataOutputStream(fs); //writeUTF可以直接寫入資料,不會遺失資料 ds.writeUTF("使用writeUTF()方法寫入資料;"); //writeChars首先要寫入String的長度,不會遺失資料 String s=new String("使用writeChars()方法寫入資料;"); ds.writeInt(s.length());ds.writeChars(s); //writeChars首先要寫入String的長度,會遺失資料 String s1=new String("使用writeBytes()方法寫入資料;"); ds.writeInt(s1.length()); ds.writeBytes(s1);ds.close(); FileInputStream fis=new FileInputStream("D:/test.txt"); DataInputStream dis=new DataInputStream(fis); System.out.println(dis.readUTF());//從流中直接讀取writeUTF寫入的資料 int len=dis.readInt();//先從流中讀取wirteChars寫入的資料長度,才能知道要完整讀取資料 for(int i=0;i<len;++i) System.out.println(dis.readChar()); int len1=dis.readInt();//先從流中讀取wirteBytes寫入的資料長度,才能知道要完整讀取資料,資料失真 for(int i=0;i<len1;++i) System.out.print(dis.readByte()+" "); }catch (Exception e){ e.printStackTrace(); } }}