Java中常見的IO流及使用方法

IO的概念及分類

什麼是流

就是內存和存儲設備之間傳輸數據的通道或是管道

分類

按照方向 [以JVM內存爲參照物]
  • 輸入流
    將<存儲設備>中數據讀取到< jvm內存>中->讀操作(read)
  • 輸出流
    將< jvm內存>中數據寫入到< 存儲設備>中->寫操作(write)
按照單位:
  • 字節流
    以字節爲單位,可以操作任意類型的文件
  • 字符流
    以字符爲單位,可以操作文本類型的文件
    注意:文本類型的文件:能以 記事本打開而且不亂碼的文件,例如:.java / .txt / .c / .html 等文件都是文本文件,.class / .world / .ppt / .map4 等是非文本文件
按照功能:
  • 節點流
    只具有基本的讀寫功能
  • 過濾流
    在節點流的基礎上增強功能

字節流

字節流父類(抽象類)

InputStream

字節輸入流,對應的讀操作(read)

OutputStream

字節輸出流,對應的操作寫操作(write)

字節節點流

FileOutputStream:文件字節輸出流

常見的構造方法

  • FileOutputStream fos = new FileOutputStream(“E:/test/a.txt”);
    • 如果指定文件不存在,則JVM會自動的創建文件,但是如果指定文件夾不存在,則jvm報錯,錯誤信息爲: java.io.FileNotFoundException: (系統找不到指定的路徑)
    • 絕對路徑
      帶有盤符的路徑,盤符:/文件夾/文件
  • FileOutputStream fos = new FileOutputStream(“a.txt”);
    • 相對路徑:默認在當前項目的根目錄下查找所需要的的文件,如果有,直接使用,如果沒有則jvm自動創建此文件
  • FileOutputStream fos = new FileOutputStream(“file/a.txt”);
    • 開發時,通常在項目的根目錄下創建一個文件夾,用於存 儲項目中操作的文件,便於管理
  • FileOutputStream fos = new FileOutputStream(“file/a.txt”,true);
    • 參數說明
      第一個參數:指定操作的文件路徑及文件名
      第二個參數:boolean,是否在原有內容進行追加
      true - 不覆蓋原有內容,直接追加,false - 覆蓋原有內容

常用方法

  • void write(int n):將一個字節的內容寫入到文件中
FileInputStream:文件字節輸入流

常用構造方法

  • FileInputStream fis = new FileInputStream(“E:\Java2003\a.txt”);
    • 參數代表
      操作文件的路徑及文件名,指定的文件夾及文件 必須存在,否則運行報錯,報錯信息爲:java.io.FileNotFoundException: (系統找不到指定的文件)

常用的方法
int read():一次性讀取一個字節的內容,讀取到的內容作爲 返回值返回,如果達到文件的尾部,則返回-1

字節過濾流

BufferedOutputStream/Bu fferedInputStream
  • 緩衝流,提高IO的讀寫效率,減少訪問磁盤次數
  • 數據存儲存儲在緩衝區,可以通過flush方法或是close方法將緩衝區內容一次性寫入到文件中,並清空緩衝區
  1. flush方法只是清空緩衝同將緩衝區的內容一次性寫入到文件中,但是流還是繼續可以使用;
  2. close方法關閉流的同時清空緩衝區,將緩衝區的內容一次性的寫入到文件中,流一旦關閉不能再繼續使用
    注意:緩衝滿的時候,將緩衝區的內容一次性寫入到文件 中,同時清空緩衝區
PrintStream (輸出流)
  • 緩衝流,提高IO的寫的效率
  • 增強了操作基本數據類型的方法,同時還可以操作字符串 print(int n) / print(long l) / print(boolean b) / print(double d) / print(String str) —> 不自動換行
    println(int n) / println(long l) / println(boolean b) / println(double d) / println(String str) --> 自動換行
ObjectOutputStream / ObjectInputStream(過濾流)
  • 增強緩衝區,提高IO讀寫效率
  • 增強了操作8中基本數據類型方法
  • 對象序列化
  1. 概念
    對象放在流上進行傳輸的過程
  2. 參與對象序列化的要求
    參與對象序列化的對象對應的類必須實現 java.io.Serializable接口
  3. 對象的讀寫操作
    void writeObject(Object obj):將指定的對象寫入到文件
    Object readObject() :從文件中讀取對象
  4. 文件達到尾部的標記
    java.io.EOFException
  5. 如果對象的某一個屬性不想參與對象序列化,則屬性前面用transient修飾
  6. 如果參與對象序列的對象中有自定類型的屬性,該屬性也必須實現 java.io.Serializable 接口,否則運行報錯,錯誤信息爲:java.io.NotSerializableException(不可序列化的異常)
  7. 如果參與對象序列化的是集合對象,集合對應類在JDK提供時已經實現java.io.Serializable 接口,但是如果集合中存儲的是自定義類型的對象,則該對應對應類必須實現 java.io.Serializable接口

常見編碼方式

  • 常見的編碼
    ASCII碼值表
    美國製定的第一個標準表,每一個標準表的前 0~255都是此標準內容
    ISO8859-1
    西歐編碼,底層佔用一個字節內容
    GB2312
    最早的中國漢字編碼表,6000多漢字
    GBK
    目前主流的中國漢字編碼表,2萬多漢字
    GB18030
    漢字的編碼表,7萬多的中國符號
    Big5
    中國繁體字,中國臺灣應用
    UTF-8
    萬國碼, 在UTF-8中底層採用是動態編碼,漢字佔用2~3字節
    注意:編碼方式的書寫不區分大小寫,utf-8等價於UTF-8
  • 編碼和解碼
    編碼:將字符對應十進制轉換爲二進制的過程
    解碼:將進制轉換爲十進制對應爲字符的過程
    注意:只有當編碼方式和解碼方式統一,纔不會出現亂碼

字符流

字符流的父類

  • Reader
    字符輸入流 [對應的讀操作 - read]
  • Writer
    字符輸出流 [對應的寫操作 - write]

節點流

FileWriter:文件字符輸出流
  • 常用方法
    void write(int n):將單個字符寫入到文件
    void write(String str):將一個字符串寫入到文件中
FileReader:文件字符輸入流
  • 常用方法
    int read():一次性讀取單個字符內容,讀取的內容作爲返回值返回,如果達到文件的尾部,則返回-1

過濾流

BufferedReader

String readLine():一次性的讀取一個文本行的內容,返回值類型爲String,如果達到文件尾部則返回null.

PrintWriter:
  • 可以操作8種基本數據和字符串
    print(形參列表):將對應數據寫入到文件中,不換行
    println(形參列表):將對應的數據寫入到文件中,自動換行
  • 可以將對象對應內容寫入文件中
    println(Object obj) :將對象的toString方法的返回值寫入到 文件中

橋轉換流

InputStreamReader / OutputStreamWriter
  • 作用
    字節流轉換爲字符流的通道,可以設置編解碼的方式
  • 步驟總結
    需要設置編解碼格式的時候,需要應用到橋轉換流
  1. 創建文件字節流作爲基礎流:
    FileInputStream/FileOutputStream
  2. 創橋轉換流:
    將字節流轉換字符流,同時可以設置編解碼格式InputStreamReader / OutputStreamWriter
  3. 包裝過濾流,目的:增強字符流的讀寫功能 BufferedReader/PrintWriter
  4. 讀寫操作
  5. 關閉流,關閉最層即可

File類

File 和 IO流的區別

  • IO流:對文件的內容直接操作,讀文件或是往文件中寫入內容
  • File:代表一個文件或是文件夾(目錄),利用File類中的一些方法對文件或是文件夾進行操作

常用的方法

  • 構造方法
    public File(String name):操作文件或是文件夾的路徑及名字
  • 成員方法
方法名 含義
boolean createNewFile() 創建一個新的文件,成功- true;不成功-false(文件已經存在)
boolean mkdir() 創建一個新的文件夾
boolean delete() 刪除一個文件或是文件夾,如果刪除文件夾,文件夾爲空,刪除成功;文件夾不爲空, 刪除失敗,如果刪除文件,不管文件中是否存在內容,刪除成功
String getName() 獲取文件名,帶有後綴(文件類型,擴展名) a.txt;同時還可以獲取文件夾的名字
String getAbsolutePath() 獲取絕對路徑
boolean exists() 判斷一個文件或是文件夾是否存在, 存在-true;不存在-false
File[] listFiles() 獲取文件夾中所有爲文件夾和文件
boolean isFile() 判斷指定的是否爲文件,是-true;不 是-false
boolean isDirectory() 判斷指定的是文件夾,是-true; 不是-false

整理不易,喜歡請點個贊!
編者微信:1014961803,添加時請備註"CSDN"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章