1. 程式人生 > >Java學習--InputStream和OutputStream

Java學習--InputStream和OutputStream

一個流可以理解為一個數據的序列,輸入了表示從一個源讀取資料,輸出流表示向一個目標寫資料。

Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。

(轉自:http://blog.csdn.net/wangbaochu/article/details/53484042)

位元組流

1. InputStream和 OutputStream

InputStream 和 OutputStream為各種輸入輸出位元組流的基類,所有位元組流都繼承這兩個基類。



關於InputStream和OutputStream的輸入輸出方向的理解

(轉自:http://blog.csdn.net/guizaijianchic/article/details/71348482)

InputStream輸入類,首先需要讀取的內容轉化成輸入流,再從它那裡進行讀取,先關聯源;之後過程中關聯目的,這樣形成了流; 
把要讀取的內容輸入到輸入流,再從輸入流進行讀取,所以是read()

OutputStream輸出類,首先需要與寫入的目的地相關聯,然後通過它進行寫入,首先關聯的是流的目的;之後的過程中再關聯源,這樣形成了流 
把要輸出的東西通過輸出流輸出到目的地,所以是write()

下面的例子就是將f中的內容讀至byte陣列中,在例項化的時候,先關聯的是f,也就是讀取的源,然後input.read(b),關聯了目的,也就是陣列b

File f = new
File("d:"+File.separator+"test.txt"); InputStream input = new FileInputStream(f); byte b[] = new byte[1024]; //讀入陣列b中 int len = input.read(b); input.close(); System.out.println(new String(b,0,len));

先關聯的是目的,檔案f,然後out.write(b),指明瞭源

File f = new File("d:"+File.separator+"test.txt"
); OutputStream out = new FileOutputStream(f); String str = "hello,world"; byte b[] = str.getBytes(); out.write(b); out.close();

2. FileInputStream 和 FileOutputStream

是對檔案的位元組流操作,是最常見的IO操作流

[java]  view plain  copy
  1. /* 
  2.  * 以位元組為單位讀取檔案,常用於讀二進位制檔案,如圖片、聲音、影像等檔案。 
  3.  */  
  4. public static void readFileByBytes(String inFile, String outFile) {  
  5.     File file = new File(fileName);  
  6.     InputStream in = null;  
  7.     OutputStream out = null;  
  8.     try {  
  9.         byte[] tempbytes = new byte[100];  
  10.         int byteread = 0;  
  11.         in = new FileInputStream(inFile);  
  12.         out = new FileOutputStream(outFile);  
  13.         while ((byteread = in.read(tempbytes)) != -1) {  
  14.             out.write(tempbytes, 0, byteread);  
  15.         }  
  16.     } catch (Exception e1) {  
  17.         e1.printStackTrace();  
  18.     } finally {  
  19.         if (in != null) {  
  20.             try {  
  21.                 in.close();  
  22.             } catch (IOException e1) {  
  23.             }  
  24.             try {  
  25.                 out.close();  
  26.             } catch (IOException e1) {  
  27.             }  
  28.         }  
  29.     }  
  30. }  

3.DataInputStream和DataOutputStream

DataInputStream 是資料輸入流,它繼承於FilterInputStream。
DataOutputStream 是資料輸出流,它繼承於FilterOutputStream。

二者配合使用,“允許應用程式以與機器無關方式從底層輸入流中讀寫基本 Java 資料型別”。

[java] view plain copy  view plain view plain  copy  copy
  1. /** 
  2.  * DataOutputStream的API測試函式 
  3.  */  
  4. private static void testDataOutputStream() {  
  5.     DataOutputStream out = null;  
  6.     try {  
  7.         File file = new File("file.txt");  
  8.         out = new DataOutputStream(new FileOutputStream(file));  
  9.           
  10.         out.writeBoolean(true);  
  11.         out.writeByte((byte)0x41);  
  12.         out.writeChar((char)0x4243);  
  13.         out.writeShort((short)0x4445);  
  14.         out.writeInt(0x12345678);  
  15.         out.writeLong(0x0FEDCBA987654321L);  
  16.         out.writeUTF("abcdefg");  
  17.     } catch (FileNotFoundException e) {  
  18.         e.printStackTrace();  
  19.     } catch (SecurityException e) {  
  20.         e.printStackTrace();  
  21.     } catch (IOException e) {  
  22.         e.printStackTrace();  
  23.     } finally {  
  24.         try {  
  25.             out.close();  
  26.         } catch(IOException e) {  
  27.         }  
  28.     }  
  29. }  
  30.   
  31. /** 
  32.  * DataInputStream的API測試函式 
  33.  */  
  34. private static void testDataInputStream() {  
  35.     DataInputStream in = null;  
  36.     try {  
  37.         File file = new File("file.txt");  
  38.         in = new DataInputStream(new FileInputStream(file));  
  39.   
  40.         System.out.printf("byteToHexString(0x8F):0x%s\n", byteToHexString((byte)0x8F));  
  41.         System.out.printf("charToHexString(0x8FCF):0x%s\n", charToHexString((char)0x8FCF));  
  42.         System.out.printf("readBoolean():%s\n", in.readBoolean());  
  43.         System.out.printf("readByte():0x%s\n", byteToHexString(in.readByte()));  
  44.         System.out.printf("readChar():0x%s\n", charToHexString(in.readChar()));  
  45.         System.out.printf("readShort():0x%s\n", shortToHexString(in.readShort()));  
  46.         System.out.printf("readInt():0x%s\n", Integer.toHexString(in.readInt()));  
  47.         System.out.printf("readLong():0x%s\n", Long.toHexString(in.readLong()));  
  48.         System.out.printf("readUTF():%s\n", in.readUTF());  
  49.     } catch (FileNotFoundException e) {  
  50.         e.printStackTrace();  
  51.     } catch (SecurityException e) {  
  52.         e.printStackTrace();  
  53.     } catch (IOException e) {  
  54.         e.printStackTrace();  
  55.     } finally {  
  56.         try {  
  57.             in.close();  
  58.         } catch(IOException e) {  
  59.         }  
  60.     }  
  61. }  

4.BufferedInputStream 和 BufferedOutputStream

BufferedInputStream是帶緩衝區的輸入流,它繼承於FilterInputStream。預設緩衝區大小是8M,能夠減少訪問磁碟的次數,提高檔案讀取效能。

BufferedOutputStream是帶緩衝區的輸出流,它繼承於FilterOutputStream,能夠提高檔案的寫入效率。

它們提供的“緩衝功能”本質上是通過一個內部緩衝區陣列實現的。例如,在新建某輸入流對應的BufferedInputStream後,當我們通過read()讀取輸入流的資料時,BufferedInputStream會將該輸入流的資料分批的填入到緩衝區中。每當緩衝區中的資料被讀完之後,輸入流會再次填充資料緩衝區;如此反覆,直到我們讀完輸入流資料。

[java]  view plain  copy
  1. public static void readAndWrite(String[] args) {      
  2.     try {  
  3.         BufferedInputStream bis = new BufferedInputStream(new FileInputStream("f:/a.mp3"));  
  4.         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("f:/b.mp3"));  
  5.         byte[] b=new byte[1024];  
  6.         int len=0;  
  7.         while(-1!= (len = bis.read(b, 0, b.length))) {  
  8.             bos.write(b, 0, len);  
  9.         }