Java IO流學習總結一:輸入輸出流

来源:http://www.cnblogs.com/zhaoyanjun/archive/2017/01/17/6292384.html
-Advertisement-
Play Games

Java IO流學習總結一:輸入輸出流 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自 "【趙彥軍的博客】" Java流類圖結構: 流的概念和作用 流是一組有順序的,有起點和終點的位元組集合,是對數據傳輸的總 ...


Java IO流學習總結一:輸入輸出流

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/54292148
本文出自【趙彥軍的博客】

Java流類圖結構:

這裡寫圖片描述

流的概念和作用

流是一組有順序的,有起點和終點的位元組集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱為流,流的本質是數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀的進行數據操作。

IO流的分類

  • 根據處理數據類型的不同分為:字元流和位元組流
  • 根據數據流向不同分為:輸入流和輸出流

字元流和位元組流

字元流的由來: 因為數據編碼的不同,而有了對字元進行高效操作的流對象。本質其實就是基於位元組流讀取時,去查了指定的碼表。 位元組流和字元流的區別:

  • 讀寫單位不同:位元組流以位元組(8bit)為單位,字元流以字元為單位,根據碼表映射字元,一次可能讀多個位元組。
  • 處理對象不同:位元組流能處理所有類型的數據(如圖片、avi等),而字元流只能處理字元類型的數據。

  • 位元組流:一次讀入或讀出是8位二進位。
  • 字元流:一次讀入或讀出是16位二進位。

設備上的數據無論是圖片或者視頻,文字,它們都以二進位存儲的。二進位的最終都是以一個8位為數據單元進行體現,所以電腦中的最小數據單元就是位元組。意味著,位元組流可以處理設備上的所有數據,所以位元組流一樣可以處理字元數據。

結論:只要是處理純文本數據,就優先考慮使用字元流。 除此之外都使用位元組流。

輸入流和輸出流

輸入流只能進行讀操作,輸出流只能進行寫操作,程式中需要根據待傳輸數據的不同特性而使用不同的流。

輸入位元組流 InputStream

  • InputStream 是所有的輸入位元組流的父類,它是一個抽象類。
  • ByteArrayInputStreamStringBufferInputStreamFileInputStream 是三種基本的介質流,它們分別從Byte 數組StringBuffer、和本地文件中讀取數據。
  • PipedInputStream 是從與其它線程共用的管道中讀取數據,與Piped 相關的知識後續單獨介紹。
  • ObjectInputStream 和所有FilterInputStream 的子類都是裝飾流(裝飾器模式的主角)。

輸出位元組流 OutputStream

  • OutputStream 是所有的輸出位元組流的父類,它是一個抽象類。
  • ByteArrayOutputStreamFileOutputStream 是兩種基本的介質流,它們分別向Byte 數組、和本地文件中寫入數據。
  • PipedOutputStream 是向與其它線程共用的管道中寫入數據。
  • ObjectOutputStream 和所有FilterOutputStream 的子類都是裝飾流。

總結:

  • 輸入流:InputStream或者Reader:從文件中讀到程式中;
  • 輸出流:OutputStream或者Writer:從程式中輸出到文件中;

節點流

節點流:直接與數據源相連,讀入或讀出。
直接使用節點流,讀寫不方便,為了更快的讀寫文件,才有了處理流。
這裡寫圖片描述

常用的節點流

  • 父 類 :InputStreamOutputStreamReaderWriter
  • 文 件 :FileInputStreamFileOutputStreanFileReaderFileWriter 文件進行處理的節點流
  • 數 組 :ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter 對數組進行處理的節點流(對應的不再是文件,而是記憶體中的一個數組)
  • 字元串 :StringReaderStringWriter 對字元串進行處理的節點流
  • 管 道 :PipedInputStreamPipedOutputStreamPipedReaderPipedWriter 對管道進行處理的節點流

處理流

處理流和節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。如BufferedReader.處理流的構造方法總是要帶一個其他的流對象做參數。一個流對象經過其他流的多次包裝,稱為流的鏈接。
這裡寫圖片描述

常用的處理流

  • 緩衝流:BufferedInputStreanBufferedOutputStreamBufferedReaderBufferedWriter 增加緩衝功能,避免頻繁讀寫硬碟。
  • 轉換流:InputStreamReaderOutputStreamReader實現位元組流和字元流之間的轉換。
  • 數據流: DataInputStreamDataOutputStream 等-提供將基礎數據類型寫入到文件中,或者讀取出來。

轉換流

InputStreamReaderOutputStreamWriterInputStreamOutputStream作為參數,實現從位元組流到字元流的轉換。

構造函數

InputStreamReader(InputStream);        //通過構造函數初始化,使用的是本系統預設的編碼表GBK。
InputStreamWriter(InputStream,String charSet);   //通過該構造函數初始化,可以指定編碼表。
OutputStreamWriter(OutputStream);      //通過該構造函數初始化,使用的是本系統預設的編碼表GBK。
OutputStreamwriter(OutputStream,String charSet);   //通過該構造函數初始化,可以指定編碼表。

實戰演練

  • FileInputStream類的使用:讀取文件內容
package com.app;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class A1 {

    public static void main(String[] args) {
        A1 a1 = new A1();
    
        //電腦d盤中的abc.txt 文檔
        String filePath = "D:/abc.txt" ;
        String reslut = a1.readFile( filePath ) ;
        System.out.println( reslut ); 
    }


    /**
     * 讀取指定文件的內容
     * @param filePath : 文件的路徑
     * @return  返回的結果
     */
    public String readFile( String filePath ){
        FileInputStream fis=null;
        String result = "" ;
        try {
            // 根據path路徑實例化一個輸入流的對象
            fis  = new FileInputStream( filePath );

            //2. 返回這個輸入流中可以被讀的剩下的bytes位元組的估計值;
            int size =  fis.available() ;
            //3. 根據輸入流中的位元組數創建byte數組;
            byte[] array = new byte[size];
            //4.把數據讀取到數組中;
            fis.read( array ) ; 

            //5.根據獲取到的Byte數組新建一個字元串,然後輸出;
            result = new String(array); 

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            if ( fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return result ;
    }


}

  • FileOutputStream 類的使用:將內容寫入文件
package com.app;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class A2 {

    public static void main(String[] args) {
        A2 a2 = new A2();

        //電腦d盤中的abc.txt 文檔
        String filePath = "D:/abc.txt" ;

        //要寫入的內容
        String content = "今天是2017/1/9,天氣很好" ;
        a2.writeFile( filePath , content  ) ;

    }

    /**
     * 根據文件路徑創建輸出流
     * @param filePath : 文件的路徑
     * @param content : 需要寫入的內容
     */
    public void writeFile( String filePath , String content ){
        FileOutputStream fos = null ;
        try {
            //1、根據文件路徑創建輸出流
            fos  = new FileOutputStream( filePath );

            //2、把string轉換為byte數組;
            byte[] array = content.getBytes() ;
            //3、把byte數組輸出;
            fos.write( array );

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            if ( fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


}

註意:

  1. 在實際的項目中,所有的IO操作都應該放到子線程中操作,避免堵住主線程。
  2. FileInputStream在讀取文件內容的時候,我們傳入文件的路徑("D:/abc.txt"), 如果這個路徑下的文件不存在,那麼在執行readFile()方法時會報FileNotFoundException異常。
  3. FileOutputStream在寫入文件的時候,我們傳入文件的路徑("D:/abc.txt"), 如果這個路徑下的文件不存在,那麼在執行writeFile()方法時, 會預設給我們創建一個新的文件。還有重要的一點,不會報異常。

效果圖:

這裡寫圖片描述

  • 綜合練習,實現複製文件,從D盤複製到E盤
package com.app;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class A3 {

    public static void main(String[] args) {
        A3 a2 = new A3();

        //電腦d盤中的cat.png 圖片的路徑
        String filePath1 = "D:/cat.png" ;

        //電腦e盤中的cat.png 圖片的路徑
        String filePath2 = "E:/cat.png" ;

        //複製文件
        a2.copyFile( filePath1 , filePath2 );

    }

    /**
     * 文件複製 
     * @param filePath_old : 需要複製文件的路徑
     * @param filePath_new : 複製文件存放的路徑
     */
    public void copyFile( String filePath_old  , String filePath_new){
        FileInputStream fis=null ;
        FileOutputStream fout = null ;
        try {
            // 根據path路徑實例化一個輸入流的對象
            fis  = new FileInputStream( filePath_old );

            //2. 返回這個輸入流中可以被讀的剩下的bytes位元組的估計值;
            int size =  fis.available() ;
            //3. 根據輸入流中的位元組數創建byte數組;
            byte[] array = new byte[size];
            //4.把數據讀取到數組中;
            fis.read( array ) ; 

            //5、根據文件路徑創建輸出流
            fout = new FileOutputStream( filePath_new ) ;
            
            //5、把byte數組輸出;
            fout.write( array );

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            if ( fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if ( fout != null ) {
                try {
                    fout.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }   
            }
        }
    }
}




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇知識很重要,最好全掌握: 知識點: 1.UIViewController基本認識 2.UIViewController之間的切換 3.UIViewController生命周期 4.多個Controller之間的數據如何交換 UIViewController 1.MVC設計模式 MVC設計模式:M ...
  • 知識點 1.UICollectionView的創建 2. UICollectionView的常用代理方法 3. UICollectionView相關XIB操作 UICollectionView的創建 1.UICollectionViewLayout 作用:控制collectionView佈局的一個抽 ...
  • AsyncTask,即非同步任務,是Android給我們提供的一個處理非同步任務的類。 ...
  • 效果 特點 1.實現單選或者多選的時候,修改的參數非常少。 2.可定製選擇的內容 用法 1.將工具文件夾中的4個文件拷貝到項目中,在需要點擊選擇的頁面導入頭文件 》#import "ChooseItemViewController.h"。 2.其他具體的細節參考源碼。 3.需要註意的細節看下麵的貼圖 ...
  • 可參考 http://www.cocoachina.com/apple/20161223/18431.html https://developer.apple.com/news/?id=12212016b 如果想看最新的公告和資訊 可以看首頁的右下角 進入 ...
  • 由[OpenDigg](http://www.opendigg.com/) 出品的安卓開源項目周報第六期來啦。我們的安卓開源周報集合了OpenDigg一周來新收錄的優質的[安卓開源項目](http://www.opendigg.com/tags/android),方便安卓開發人員便捷的找到自己需要的... ...
  • NSMutableArray *meiArr = [NSMutableArray arrayWithCapacity:4]; for (int i = 0; i < 4; i++) { NSString *imageName = [NSString stringWithFormat:@"001%d" ...
  • //獲取當前的時間 +(NSString*)getCurrentTimes{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 設置你想要的格式,hh與HH的區別:分別表示12小時制,24小時制 [formatter se ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...