黑馬程序猿——26,基本數據操作流,字節數組操作流,轉換流,編碼表
-----------android培訓、java培訓、java學習型技術博客、期待與您交流!
------------
黑馬程序猿——26,
DataInputStream,DataOutputStream,
ByteArrayInputStream,ByteArrayOutputStream,
InputStreamReader,OutputStreamWriter,編碼表
/*
DataInputStream和DataOutputStream
能夠更加操作基本數據類型的流
註意這裏是Data不是Date!
*/
import java.io.*; class Ioliou31 { public static void main(String[] args)throws IOException { UTFDemo() ; // method(); } public static void method() throws IOException { File f=new File("f:\\科學.txt"); //封裝目的文件為對象 FileOutputStream fos=new FileOutputStream(f);//關聯目的文件的流 DataOutputStream dos=new DataOutputStream(fos); //再用專門操作基本類型數據的流的構造函數接收 //下面註意寫入的格式 //不同的寫入格式是依照不同位數寫入的 dos.writeInt(56); dos.writeBoolean(false); dos.writeDouble(15.24); /* */ FileInputStream fis=new FileInputStream(f); DataInputStream dis=new DataInputStream (fis); //讀取的時候註意要依照順序讀取,以及讀取的格式 //不同的讀取格式是依照不同的位數來讀取的 int i =dis.readInt(); boolean bo=dis.readBoolean(); double dou=dis.readDouble(); soc(i+"---"+bo+"---"+dou); //特別註意:什麽格式寫入的就用什麽格式讀取出來 dos.close(); dis.close(); } public static void UTFDemo() throws IOException { File f=new File("f:\\科學.txt"); //封裝目的文件為對象 FileOutputStream fos=new FileOutputStream(f);//關聯目的文件的流 DataOutputStream dos=new DataOutputStream(fos); dos.writeUTF("這是");//四個字節組成一個字符,一共八個字節 FileInputStream fis=new FileInputStream(f); DataInputStream dis=new DataInputStream (fis); soc(dis.readUTF()); //readUTF方法返回的是字符串。用什麽格式寫就要用什麽格式讀取 } public static void soc(Object obj) { System.out.println(obj); } }
————————切割線————————
/*
操作字節數組的流(內部封裝長度可變的字節數組)
ByteArrayInputStream
ByteArrayOutputStream
直接把字節數組傳給其ByteArrayInputStream的構造函數,
傳進來的字節數組就是源
源設備:
鍵盤System.in 硬盤FileStream 內存ArrayStream
目的設備
控制臺System.out 硬盤FileStream 內存ArrayStream
這兩個流沒有調用底層資源,不用關閉close
另外,還有ByteArrayReader和ByteArrayWriter使用方法也是和上面兩者類似。
ByteArrayReader構造函數傳入的是字符數組。
*/
import java.io.*; class Ioliou32 { public static void main(String[] args) throws IOException { ByteArrayInputStream bais=new ByteArrayInputStream("哦奧額".getBytes()); ByteArrayOutputStream baos=new ByteArrayOutputStream(); int i=0; while((i=bais.read())!=-1) { baos.write(i); } File f=new File("f:\\可樂可樂.java"); FileOutputStream fos=new FileOutputStream(f); baos.writeTo(fos); //直接寫入字節輸出流中 } public static void soc(Object obj) { System.out.println(obj); } }
——————切割線——————
/*
轉換流與編碼表:
轉換流InputStreamReader和OutputStreamWriter
編碼表:
ASCII美國標準信息交換碼,用一個字節的7位表示
ISO8859-1 歐洲碼表。拉丁碼表不識別中文字符,用一個字節8位表示
GB2312 中國中文編碼表
GBK 中國中文編碼表升級版,兩個字節表示一個字符
Unicode 國際標準碼,java使用的編碼表
UTF-8 最多三個字節表示一個字符
*/
import java.io.*; class Ioliou33 { publicstatic void main(String[] args) throws IOException { // write(); read(); } public static void write() throws IOException { File f=new File("f:\\樓宇.txt"); FileOutputStream fos=new FileOutputStream(f); OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");//要加上編碼表版本號 osw.write("動手打人了"); osw.close(); /* 盡管寫入之後我們代開f:\\樓宇.java文件看到的依然是字符。 可是本質上文件存儲的是編碼表上相應的數字,僅僅只是依照指定編碼表兌換成字符而已。 */ } public static void read() throws IOException { File f=new File("f:\\樓宇.txt"); FileInputStream fis=new FileInputStream(f); InputStreamReader isr=new InputStreamReader(fis,"UTF-8");//編碼表版本號要相應上 /* 讀取的時候也是依照存儲的數字再依照指定的編碼表找出相應的字符 */ char[] ch=new char[20]; int i=0; while ((i=isr.read(ch))!=-1) { soc(new String(ch,0,i)); } isr.close(); } public static void soc(Object obj) { System.out.println(obj); } }
——————切割線——————
/*
編碼與解碼:
經常使用編碼表gbk,utf-8,ISO8859-1
*/
import java.io.*; import java.util.*; class Ioliou34 { public static void main(String[] args)throws Exception { method2(); } public static void method() throws Exception { String s="開始遊戲"; byte[] by= s.getBytes("utf-8");//依照utf-8編碼表進行編碼 soc(Arrays.toString(by)); String s2=new String(by,"ISo8859-1");//依照ISo8859-1編碼表進行解碼 soc("s2="+s2); //假設依照不同的編碼表進行解碼的話會導致錯誤結果 //假設遇到這樣的情況就須要再一次進行編碼解碼 byte[] by2=s2.getBytes("ISo8859-1"); String s3=new String(by2,"utf-8"); soc("s3="+s3); } public static void method2() throws Exception { String s="開始遊戲"; byte[] by= s.getBytes("utf-8");//依照utf-8編碼表進行編碼 soc(Arrays.toString(by)); String s2=new String(by,"gbk"); soc("s2="+s2); //假設依照不同的編碼表進行解碼的話會導致錯誤結果 //假設遇到這樣的情況就須要再一次進行編碼解碼 byte[] by2= s2.getBytes("gbk"); soc(Arrays.toString(by2)); String s3=new String(by2,"utf-8"); soc("s3="+s3); /* 由於gbk和utf-8都是中文編碼表,所以,此時的情況與method方法中的不同。 method方法中解碼過程出錯的是由於使用了IOS8895-1拉丁碼表,裏面不知別中文字符, 而這裏method2的情況則是解碼過程中使用了能夠識別中文的gbk碼表。 解碼中遇到對不上號的字符就會去gbk碼表的亂碼區查找,接著再用gbk碼表編碼就 不是原來的號嗎了,所以,這裏method2方法的s3就會顯示亂碼,而method方法的s3則是顯示正確。 */ } public static void soc(Object obj) { System.out.println(obj); } }
-----------android培訓、java培訓、java學習型技術博客、期待與您交流!
------------
黑馬程序猿——26,基本數據操作流,字節數組操作流,轉換流,編碼表