1. 程式人生 > >java io流最詳解

java io流最詳解

初學Java,一直搞不懂java裡面的io關係,在網上找了很多大多都是給個結構圖草草描述也看的不是很懂。而且沒有結合到java7 的最新技術,所以自己來整理一下,有錯的話請指正,也希望大家提出寶貴意見。

首先看個圖:(如果你也是初學者,我相信你看了真個人都不好了,想想java設計者真是煞費苦心啊!)

這是Java io 比較基本的一些處理流,除此之外我們還會提到一些比較深入的基於io的處理類,比如console類,SteamTokenzier,Externalizable介面,Serializable介面等等一些高階用法極其原理。

一、java io的開始:檔案

1. 我們主要講的是流,流的本質也是對檔案的處理,我們循序漸進一步一步從檔案將到流去。

2. java 處理檔案的類 File,java提供了十分詳細的檔案處理方法,舉了其中幾個例子,其餘的可以去

Java程式碼  收藏程式碼
  1. package com.hxw.io;  
  2. import java.io.*;  
  3. public class FileExample{  
  4.     public static void main(String[] args) {  
  5.         createFile();  
  6.     }  
  7.   /** 
  8.    * 檔案處理示例
     
  9.    */  
  10.   public static void createFile() {  
  11.      File f=new File("E:/電腦桌面/jar/files/create.txt");  
  12.         try{  
  13.             f.createNewFile();  //當且僅當不存在具有此抽象路徑名指定名稱的檔案時,不可分地建立一個新的空檔案。  
  14.             System.out.println("該分割槽大小"+f.getTotalSpace()/(1024*1024*1024)+"G"); //返回由此抽象路徑名錶示的檔案或目錄的名稱。  
  15.             f.mkdirs();  //建立此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
      
  16. //            f.delete(); //  刪除此抽象路徑名錶示的檔案或目錄  
  17.            System.out.println("檔名  "+f.getName());  //  返回由此抽象路徑名錶示的檔案或目錄的名稱。  
  18.            System.out.println("檔案父目錄字串 "+f.getParent());// 返回此抽象路徑名父目錄的路徑名字串;如果此路徑名沒有指定父目錄,則返回 null。  
  19.         }catch (Exception e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.   }  
  23. }  

二、位元組流:

1.位元組流有輸入和輸出流,我們首先看輸入流InputStream,我們首先解析一個例子(FileInputStream)。

Java程式碼  收藏程式碼
  1. package com.hxw.io;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. public class FileCount {  
  7.    /** 
  8.     * 我們寫一個檢測檔案長度的小程式,別看這個程式挺長的,你忽略try catch塊後發現也就那麼幾行而已。 
  9.     */  
  10.    publicstatic void main(String[] args) {  
  11.       //TODO 自動生成的方法存根  
  12.              int count=0;  //統計檔案位元組長度  
  13.       InputStreamstreamReader = null;   //檔案輸入流  
  14.       try{  
  15.           streamReader=newFileInputStream(new File("D:/David/Java/java 高階進階/files/tiger.jpg"));  
  16.           /*1.new File()裡面的檔案地址也可以寫成D:\\David\\Java\\java 高階進階\\files\\tiger.jpg,前一個\是用來對後一個 
  17.            * 進行轉換的,FileInputStream是有緩衝區的,所以用完之後必須關閉,否則可能導致記憶體佔滿,資料丟失。 
  18.           */  
  19.           while(streamReader.read()!=-1) {  //讀取檔案位元組,並遞增指標到下一個位元組  
  20.              count++;  
  21.           }  
  22.           System.out.println("---長度是: "+count+" 位元組");  
  23.       }catch (final IOException e) {  
  24.           //TODO 自動生成的 catch 塊  
  25.           e.printStackTrace();  
  26.       }finally{  
  27.           try{  
  28.              streamReader.close();  
  29.           }catch (IOException e) {  
  30.              //TODO 自動生成的 catch 塊  
  31.              e.printStackTrace();  
  32.           }  
  33.       }  
  34.    }  
  35. }  

我們一步一步來,首先,上面的程式存在問題是,每讀取一個自己我都要去用到FileInputStream,我輸出的結果是“---長度是: 64982 位元組”,那麼進行了64982次操作!可能想象如果檔案十分龐大,這樣的操作肯定會出大問題,所以引出了緩衝區的概念。可以將streamReader.read()改成streamReader.read(byte[]b)此方法讀取的位元組數目等於位元組陣列的長度,讀取的資料被儲存在位元組陣列中,返回讀取的位元組數,InputStream還有其他方法mark,reset,markSupported方法,例如:

markSupported 判斷該輸入流能支援mark 和 reset 方法。

mark用於標記當前位置;在讀取一定數量的資料(小於readlimit的資料)後使用reset可以回到mark標記的位置。

FileInputStream不支援mark/reset操作;BufferedInputStream支援此操作;

mark(readlimit)的含義是在當前位置作一個標記,制定可以重新讀取的最大位元組數,也就是說你如果標記後讀取的位元組數大於readlimit,你就再也回不到回來的位置了。

通常InputStream的read()返回-1後,說明到達檔案尾,不能再讀取。除非使用了mark/reset。

2.FileOutputStream 循序漸進版, InputStream是所有位元組輸出流的父類,子類有ByteArrayOutputStream,FileOutputStream,ObjectOutputStreanm,這些我們在後面都會一一說到。先說FileOutputStream

我以一個檔案複製程式來說,順便演示一下快取區的使用。(Java I/O預設是不緩衝流的,所謂“緩衝”就是先把從流中得到的一塊位元組序列暫存在一個被稱為buffer的內部位元組數組裡,然後你可以一下子取到這一整塊的位元組資料,沒有緩衝的流只能一個位元組一個位元組讀,效率孰高孰低一目瞭然。有兩個特殊的輸入流實現了緩衝功能,一個是我們常用的BufferedInputStream.)

Java程式碼  收藏程式碼
  1. package com.hxw.io;  
  2. import java.io.*;  
  3. public class FileCopy {  
  4.   public static void main(String[] args) {  
  5.      // TODO自動生成的方法存根  
  6.      byte[] buffer=new byte[512];   //一次取出的位元組數大小,緩衝區大小  
  7.      int numberRead=0;  
  8.      FileInputStream input=null;  
  9.      FileOutputStream out =null;  
  10.      try {  
  11.         input=new FileInputStream("D:/David/Java/java 高階進階/files/tiger.jpg");  
  12.         out=new FileOutputStream("D:/David/Java/java 高階進階/files/tiger2.jpg"); //如果檔案不存在會自動建立  
  13.         while ((numberRead=input.read(buffer))!=-1) {  //numberRead的目的在於防止最後一次讀取的位元組小於buffer長度,  
  14.            out.write(buffer, 0, numberRead);       //否則會自動被填充0  
  15.         }  
  16.      } catch (final IOException e) {  
  17.         // TODO自動生成的 catch 塊  
  18.         e.printStackTrace();  
  19.      }finally{  
  20.         try {  
  21.            input.close();  
  22.            out.close();  
  23.         } catch (IOException e) {  
  24.            // TODO自動生成的 catch 塊  
  25.            e.printStackTrace();  
  26.         }  
  27.      }  
  28.   }  
  29. }  

3.讀寫物件:ObjectInputStream 和ObjectOutputStream ,該流允許讀取或寫入使用者自定義的類,但是要實現這種功能,被讀取和寫入的類必須實現Serializable介面,其實該介面並沒有什麼方法,可能相當於一個標記而已,但是確實不合缺少的。例項程式碼如下:

Java程式碼  收藏程式碼
  1. package com.hxw.io;  
  2. import java.io.*;  
  3. public class ObjetStream {  
  4.    /** 
  5.     * @param args 
  6.     */  
  7.    public static void main(String[] args) {  
  8.       // TODO自動生成的方法存根  
  9.       ObjectOutputStream objectwriter=null;  
  10.       ObjectInputStream objectreader=null;  
  11.       try {  
  12.          objectwriter=new ObjectOutputStream(new FileOutputStream("D:/David/Java/java 高階進階/files/student.txt"));  
  13.          objectwriter.writeObject(new Student("gg"22));  
  14.          objectwriter.writeObject(new Student("tt"18));  
  15.          objectwriter.writeObject(new Student("rr"17));  
  16.          objectreader=new ObjectInputStream(new FileInputStream("D:/David/Java/java 高階進階/files/student.txt"));  
  17.          for (int i = 0; i < 3; i++) {  
  18.             System.out.println(objectreader.readObject());  
  19.          }  
  20.       } catch (IOException | ClassNotFoundException e) {  
  21.          // TODO自動生成的 catch 塊  
  22.          e.printStackTrace();  
  23.       }finally{  
  24.          try {  
  25.             objectreader.close();  
  26.             objectwriter.close();  
  27.          } catch (IOException e) {  
  28.             // TODO自動生成的 catch 塊  
  29.             e.printStackTrace();  
  30.          }  
  31.       }  
  32.    }  
  33. }  
  34. class Student implements Serializable{  
  35.    private String name;  
  36.    private int age;  
  37.    public Student(String name, int age) {  
  38.       super();  
  39.       this.name = name;  
  40.       this.age = age;  
  41.    }  
  42.    @Override  
  43.    public String toString() {  
  44.       return "Student [name=" + name + ", age=" + age + "]";  
  45.    }  
  46. }  

執行後系統輸出:

Student [name=gg, age=22]

相關推薦

java io

初學Java,一直搞不懂java裡面的io關係,在網上找了很多大多都是給個結構圖草草描述也看的不是很懂。而且沒有結合到java7 的最新技術,所以自己來整理一下,有錯的話請指正,也希望大家提出寶貴意見。 首先看個圖:(如果你也是初學者,我相信你看了真個人都不好了,想想java設計者真是煞費苦心啊

java Io

修改 文件目錄 != exe [] 深入 clas one fileinput 關於java 流類的復習;習慣性的復習按照圖結構一層層往下深入去了解去復習,最後通過代碼來實現感覺印象會更深刻一些; 關於 I/O流:IO可以理解為JAVA用來傳遞數據的管道

Java 常用IO操作

字符集 -s fileinput 顯式 print OS 數值 重寫 目錄 1.基本概念 IO:Java對數據的操作是通過流的方式,IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java用於操作流的對象都在IO包中。 2.IO流的分類 圖示:(主要IO流)

Java中的IO

在介紹IO流之前,需要首先給大家介紹一下File的使用,及一些常用的方法。 File類 :檔案和目錄路徑名的抽象表示形式。 通俗一點說,例項化File類的一個物件,其傳入的引數就是一個路徑名(可以是絕對路徑名,也可以是相對路徑名) 例:File  file=new   

JDK1.8 java.io.Serializable介面

java.io.Serializable介面是一個標誌性介面,在介面內部沒有定義任何屬性與方法。只是用於標識此介面的實現類可以被序列化與反序列化。但是它的奧祕並非像它表現的這樣簡單。現在從以下幾個問題入手來考慮。 希望物件的某些屬性不參與序列化應該怎麼處理? 物件序列化之後,如果類的屬性

java字元緩衝區

1. 為什麼要緩衝區? 程式頻繁地操作一個資源(如檔案),則效能會很低,此時為了提升效能,就可以將一部分資料暫時讀入到記憶體的一塊區域中,以後直接從此區域中讀取資料即可,因為讀記憶體速度比較快,這樣提高效能。在IO中引入緩衝區,主要是提高流的讀寫效率。 2. 緩衝技術的原理? 總的來說,

(五)java.io.ObjectInput介面

簡介:ObjectInput介面繼承了DataInput、AutoCloseable介面包括物件的閱讀功能,DataInput介面包括輸入原始資料型別的方法,ObjectInput介面擴充套件介面包括陣列、物件、字串。 1.public Object re

Java IO

一、IO流概述 概述: IO流簡單來說就是Input和Output流,IO流主要是用來處理裝置之間的資料傳輸,Java對於資料的操作都是通過流實現,而java用於操作流的物件都在IO包中。 分類: 按操作資料分為:位元

Java IO

初學java,一直搞不懂java裡面的io關係,在網上找了很多大多都是給個結構圖草草描述也看的不是很懂。而且沒有結合到java7 的最新技術,所以自己來整理一下,有錯的話請指正,也希望大家提出寶貴意見。 首先看個圖:(如果你也是初學者,我相信你看了真個人都不好了

java IO之緩衝的使用

java緩衝流本身不具IO功能,只是在別的流上加上緩衝提高效率,像是為別的流裝上一種包裝。當對檔案或其他目標頻繁讀寫或操作效率低,效能差。這時使用緩衝流能夠更高效的讀寫資訊。因為緩衝流先將資料快取起來,然後一起寫入或讀取出來。所以說,緩衝流還是很重要的,在IO操作時記得加

Java io 之FileOutputStream與FileInputStream

FileOutputStream 檔案輸出流 方法程式碼詳解: public class Demo01 { public static void main(String[] a

史上Java學習路線(

Java是一個通用的程式語言,其實可以幹很多事,怎麼學Java就看怎麼用了,但有一些一般的步驟: 熟悉一種文字編輯器,比如:Vim, Emacs, Notepad++, TextMate等。知道哪些是開源的,哪些是閉源的,哪些要收費。養成不用盜版軟體的習慣。 安裝

Java網路程式設計之

前言 大部分網路程式做的事情就是接受輸入併產生輸出。讀伺服器傳送過來的資料與讀取本地檔案的資料並沒有多大的區別,同時伺服器將資料傳送給客戶端與寫資料到本地檔案也很像。 Java的IO操作基於streams實現的。輸入流讀資料,輸出流寫資料。 該系列文

Java IO學習總結

系統 指針 數組 rar amr redo 修改 接收 學習 Java IO流學習總結 Java流操作有關的類或接口: Java流類圖結構: 流的概念和作用 流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱為流,流

java io 分析

decode string 對象 集成 piped fileread 一個 blog 文章 java io流 在java應用或者android應用中很常見,並且使用頻率很高的一個模塊。當時每次需要用到這個模塊的時候總是有提筆忘字的感覺,不知道該用哪個流或者該用誰包裝誰。

seall的Java IO總結

如果 com read 對稱 可能 對象實例化 它的 通過 兩個 Java流類圖結構: 流的概念和作用 流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱為流,流的本質是數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀

java Pattern和Matcher

而且 建議 exc regex 示例 aabb 工廠 sta 數字 結論:Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持. 單獨用Pattern只能使用Pattern.matcher(String reg

Java 多線程(三)------線程的同步

alt 來看 監聽 介紹 創建進程 java 多線程 system ima 關鍵字 Java 多線程詳解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多線程詳解(二)------如何創建進

java io 數據 DataInputStream、DataOutputStream、ByteArrayInputStream、ByteArrayOutputStream

clas mat 分享 col -s 例子 oid 類型 write 例子程序: package io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream;

Java反射機制深入

const 運行時 設計 應用程序 類加載器 分配 import 程序 為什麽 一.概念   反射就是把Java的各種成分映射成相應的Java類。   Class類的構造方法是private,由JVM創建。   反射是java語言的一個特性,它允程序在運行時(註意不是編譯的