轉換流 1、轉換流:將位元組流轉換成字元流,轉換之後就可以一個字元一個字元的往程式寫內容了,並且可以調用字元節點流的write(String s)方法,還可以在外面套用BufferedReader()和BufferedWriter,並使用它們的readLine 和 newLine方法。 2、有兩種轉換 ...
轉換流
1、轉換流:將位元組流轉換成字元流,轉換之後就可以一個字元一個字元的往程式寫內容了,並且可以調用字元節點流的write(String s)方法,還可以在外面套用BufferedReader()和BufferedWriter,並使用它們的readLine 和 newLine方法。 2、有兩種轉換流:InputStreamReader、OutputStreamWriter 練習小程式1: package test.io.transfer; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class OutputStreamWriterTest { public static void main(String args[]){ FileOutputStream fos = null; FileOutputStream fos1 = null; OutputStreamWriter opsw = null; try { fos = new FileOutputStream("E:/技術學習/java/test/Socket/test4.txt"); fos1 = new FileOutputStream("E:/技術學習/java/test/Socket/test5.txt"); opsw = new OutputStreamWriter(fos); opsw.write("轉換流練習"); System.out.println(opsw.getEncoding());//獲取編碼格式 opsw.flush(); opsw.close(); opsw = new OutputStreamWriter(fos1,"GBK"); opsw.write("轉換流練習轉換流練習"); System.out.println(opsw.getEncoding());//獲取編碼格式 opsw.flush(); } catch (IOException e) { e.printStackTrace(); }finally{ try { fos.close(); opsw.close(); } catch (IOException e) { e.printStackTrace(); } } } } 練習小程式2: package test.io.transfer; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderTest { public static void main(String args[]){ InputStreamReader isr = new InputStreamReader(System.in);//System.in是inputstream的子類 BufferedReader bf = new BufferedReader(isr); String ss = null; try { while((ss=bf.readLine()) != null){ if(ss.equals("exit")){ break; } System.out.println(ss); } } catch (IOException e) { e.printStackTrace(); }finally{ try { isr.close(); bf.close(); } catch (IOException e) { e.printStackTrace(); } } } } 數據流、位元組數組流 1、數據流:一般的位元組流只能讀寫byte[]類型的數據,只能寫int、byte、byte[]類型的數據 ;字元輸入流只能讀char[]類型的數據,字元輸出流只能寫char、char[]、int、String類型的數據。如果想要讀寫long、double、boolean等其他類型的數據,就需要用到數據流。 2、數據流是一種處理流,有兩種數據流:DataInputStream、DataOutputStream,分別繼承於InputStream和OutputStream。他們需要套在InputStream和OutputStream類型的位元組流上操作,下圖中截取一些,具體方法見幫助文檔。 DataInputStream:
DataOutputStream:
DataInputStream的構造方法:DataInputStream(InputStream in) DataOutputStream 的構造方法:DataOutputStream(OutputStream out) 3、位元組數組流(位元組流): ByteArrayInputStream: 位元組數組輸入流在記憶體中創建一個位元組數組緩衝區,從輸入流讀取的數據保存在該位元組數組緩衝區中,從位元組數組中讀數據。 ByteArrayOutputStream:創建位元組數組輸出流的同時,記憶體會為該輸出流創建一個預設大小的位元組數組,用於存儲寫入的位元組內容。 4、位元組數組流的構造方法: ByteArrayInputStream(byte[] buf); ByteArrayInputStream(byte[] buf, int offset, int length); ByteArrayOutputStream(); 創建位元組輸出流的同時記憶體中會創建一個byte[]位元組數組,預設大小。 ByteArrayOutputStream(int size); 創建位元組輸出流的同時記憶體中會創建一個大小為size的byte[]位元組數組。 在使用的時候,可以用byte[] b = byteArrayOutputStream.toByteArray()返迴流中的位元組數組,然後創建ByteArrayInputStream bai = new ByteArrayInputStream(byte[] b)來將輸入流接入到位元組數組上。 練習小例子: package test.io.data; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; public class DataByteArrayStreamTest { public static void main(String args[]){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); ByteArrayInputStream bais = null; DataInputStream dis = null; try { dos.writeDouble(Math.random()); dos.writeBoolean(true); dos.flush(); bais = new ByteArrayInputStream(baos.toByteArray()); dis = new DataInputStream(bais); System.out.println(dis.available()); //先進先出,先寫先讀,如果這裡是先讀的Boolean,則會自動找到存入的double數據的第一個位元組,當做boolean類型讀出來 System.out.println(dis.readDouble()); System.out.println(dis.readBoolean()); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(baos != null){ baos.close(); } if(dos != null){ dos.close(); } if(bais != null){ bais.close(); } if(dis != null){ dis.close(); } } catch (IOException e) { e.printStackTrace(); } } } } 控制台輸出結果: 9 0.02241410199042526 true