java io流最詳解
初學Java,一直搞不懂java裡面的io關係,在網上找了很多大多都是給個結構圖草草描述也看的不是很懂。而且沒有結合到java7 的最新技術,所以自己來整理一下,有錯的話請指正,也希望大家提出寶貴意見。
首先看個圖:(如果你也是初學者,我相信你看了真個人都不好了,想想java設計者真是煞費苦心啊!)
這是Java io 比較基本的一些處理流,除此之外我們還會提到一些比較深入的基於io的處理類,比如console類,SteamTokenzier,Externalizable介面,Serializable介面等等一些高階用法極其原理。
一、java io的開始:檔案
1. 我們主要講的是流,流的本質也是對檔案的處理,我們循序漸進一步一步從檔案將到流去。
2. java 處理檔案的類 File,java提供了十分詳細的檔案處理方法,舉了其中幾個例子,其餘的可以去
Java程式碼- package com.hxw.io;
- import java.io.*;
- public class FileExample{
- public static void main(String[] args) {
- createFile();
- }
- /**
-
* 檔案處理示例
- */
- public static void createFile() {
- File f=new File("E:/電腦桌面/jar/files/create.txt");
- try{
- f.createNewFile(); //當且僅當不存在具有此抽象路徑名指定名稱的檔案時,不可分地建立一個新的空檔案。
- System.out.println("該分割槽大小"+f.getTotalSpace()/(1024*1024*1024)+"G"); //返回由此抽象路徑名錶示的檔案或目錄的名稱。
-
f.mkdirs(); //建立此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
- // f.delete(); // 刪除此抽象路徑名錶示的檔案或目錄
- System.out.println("檔名 "+f.getName()); // 返回由此抽象路徑名錶示的檔案或目錄的名稱。
- System.out.println("檔案父目錄字串 "+f.getParent());// 返回此抽象路徑名父目錄的路徑名字串;如果此路徑名沒有指定父目錄,則返回 null。
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
二、位元組流:
1.位元組流有輸入和輸出流,我們首先看輸入流InputStream,我們首先解析一個例子(FileInputStream)。
Java程式碼- package com.hxw.io;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- public class FileCount {
- /**
- * 我們寫一個檢測檔案長度的小程式,別看這個程式挺長的,你忽略try catch塊後發現也就那麼幾行而已。
- */
- publicstatic void main(String[] args) {
- //TODO 自動生成的方法存根
- int count=0; //統計檔案位元組長度
- InputStreamstreamReader = null; //檔案輸入流
- try{
- streamReader=newFileInputStream(new File("D:/David/Java/java 高階進階/files/tiger.jpg"));
- /*1.new File()裡面的檔案地址也可以寫成D:\\David\\Java\\java 高階進階\\files\\tiger.jpg,前一個\是用來對後一個
- * 進行轉換的,FileInputStream是有緩衝區的,所以用完之後必須關閉,否則可能導致記憶體佔滿,資料丟失。
- */
- while(streamReader.read()!=-1) { //讀取檔案位元組,並遞增指標到下一個位元組
- count++;
- }
- System.out.println("---長度是: "+count+" 位元組");
- }catch (final IOException e) {
- //TODO 自動生成的 catch 塊
- e.printStackTrace();
- }finally{
- try{
- streamReader.close();
- }catch (IOException e) {
- //TODO 自動生成的 catch 塊
- e.printStackTrace();
- }
- }
- }
- }
我們一步一步來,首先,上面的程式存在問題是,每讀取一個自己我都要去用到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程式碼- package com.hxw.io;
- import java.io.*;
- public class FileCopy {
- public static void main(String[] args) {
- // TODO自動生成的方法存根
- byte[] buffer=new byte[512]; //一次取出的位元組數大小,緩衝區大小
- int numberRead=0;
- FileInputStream input=null;
- FileOutputStream out =null;
- try {
- input=new FileInputStream("D:/David/Java/java 高階進階/files/tiger.jpg");
- out=new FileOutputStream("D:/David/Java/java 高階進階/files/tiger2.jpg"); //如果檔案不存在會自動建立
- while ((numberRead=input.read(buffer))!=-1) { //numberRead的目的在於防止最後一次讀取的位元組小於buffer長度,
- out.write(buffer, 0, numberRead); //否則會自動被填充0
- }
- } catch (final IOException e) {
- // TODO自動生成的 catch 塊
- e.printStackTrace();
- }finally{
- try {
- input.close();
- out.close();
- } catch (IOException e) {
- // TODO自動生成的 catch 塊
- e.printStackTrace();
- }
- }
- }
- }
3.讀寫物件:ObjectInputStream 和ObjectOutputStream ,該流允許讀取或寫入使用者自定義的類,但是要實現這種功能,被讀取和寫入的類必須實現Serializable介面,其實該介面並沒有什麼方法,可能相當於一個標記而已,但是確實不合缺少的。例項程式碼如下:
Java程式碼- package com.hxw.io;
- import java.io.*;
- public class ObjetStream {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO自動生成的方法存根
- ObjectOutputStream objectwriter=null;
- ObjectInputStream objectreader=null;
- try {
- objectwriter=new ObjectOutputStream(new FileOutputStream("D:/David/Java/java 高階進階/files/student.txt"));
- objectwriter.writeObject(new Student("gg", 22));
- objectwriter.writeObject(new Student("tt", 18));
- objectwriter.writeObject(new Student("rr", 17));
- objectreader=new ObjectInputStream(new FileInputStream("D:/David/Java/java 高階進階/files/student.txt"));
- for (int i = 0; i < 3; i++) {
- System.out.println(objectreader.readObject());
- }
- } catch (IOException | ClassNotFoundException e) {
- // TODO自動生成的 catch 塊
- e.printStackTrace();
- }finally{
- try {
- objectreader.close();
- objectwriter.close();
- } catch (IOException e) {
- // TODO自動生成的 catch 塊
- e.printStackTrace();
- }
- }
- }
- }
- class Student implements Serializable{
- private String name;
- private int age;
- public Student(String name, int age) {
- super();
- this.name = name;
- this.age = age;
- }
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + "]";
- }
- }
執行後系統輸出:
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語言的一個特性,它允程序在運行時(註意不是編譯的