1. 程式人生 > 其它 >Java入門需要了解(IO-三十五)

Java入門需要了解(IO-三十五)

技術標籤:java學習分享記錄javajavase程式語言stream

IO目錄

IO概述

什麼是IO

IO 就是 Input 和 Output 的首寫字母,輸入輸出。

這裡的輸入輸出,是以記憶體為中心來定義的,讀取資料到記憶體中,叫輸入。
如果讀取記憶體中的資料到其他裝置,叫輸出。

IO的作用

IO 流用來處理裝置之間的資料傳輸

什麼是裝置

儲存資料的介質,如硬碟,U盤,光碟,記憶體,快取,印表機等都是裝置。

IO流

IO流,是一種資料傳輸時的形象描述,像水一樣流動。
輸入流,InputStream,是讀取資料到記憶體,從根本上講是讀取資料的動作。
輸出流,OutputStream,是從記憶體中寫資料到裝置,從根本上講是寫資料的動作。

流按操作資料分類

  • 位元組流:處理位元組的流。(能處理所有的資料)
  • 字元流:處理字元的流。(位元組流讀取資料後,不直接操作,而是先查詢指定的編碼表,以獲取編碼表對於的文字,即:位元組流+編碼)

IO流的頂層基類

位元組流頂層基類

InputStream

OnputStream

字元流頂層基類Reader、Writer

如果是處理文字資料,優先考慮字元流

FileReader讀取一個文字檔案

用來讀取字元檔案的便捷類

讀取檔案內容,並且列印到控制檯上!

 /**
  * 1.建立讀取字元資料的流物件
  * 建立讀取流物件時,必須要明確被讀取的檔案,要確定該檔案是存在的
  * 用一個讀取流關聯一個已經存在的檔案
  */
public static void readTxtFile() {
        FileReader fileReader = null;
        try
{ fileReader = new FileReader("demo.txt"); do { int ch = fileReader.read(); if (ch < 0) { break; } System.out.println("ch = " + ch); } while (true); fileReader.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fileReader != null) { try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }

FileReader讀取一個文字檔案2

/**
     * 讀取一組字元到指定的字元陣列中
     */
    public static void readTxtFile2() {
        FileReader fileReader = null;
        try {
            fileReader = new FileReader("demo.txt");
            //定義每次讀取的字元陣列長度建議為1024的整數倍
            char[] chars = new char[10];
            do {
                //讀取字元到字元陣列中,並返回每次讀取的長度
                int charNum = fileReader.read(chars);
                if (charNum < 0) {
                    break;
                }
                //將讀取的字元陣列組合成字串列印到控制檯
                System.out.print(new String(chars,0,charNum));
            } while (true);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

結果:
檔案內容為:
1234567890
cde
輸出結果為:
1234567890
cde

FileWriter將字元寫入一個檔案

 try {
            //建立一個可以往檔案中寫入字元資料的字元輸出流物件。
            //往檔案中寫入文字資料,那麼在物件建立時,就應該明確檔案
            //如果檔案不存在,則會自動建立
            //如果檔案存在,則會被覆蓋。
            FileWriter fileWriter = new FileWriter("demo.txt");
            //呼叫FileWriter物件中的writer方法
            /**
             * 呼叫這個方法之後,資料寫入到臨時緩衝區中
             *
             */
            fileWriter.write("abcde");
            /**
             * 對資料立即進行重新整理,將資料寫入到目的檔案中!
             */
           // fileWriter.flush();
            //在呼叫close時,先會呼叫重新整理
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

FileWriter追加檔案內容

使用構造方法:FileWriter(String fileName,boolean append)

 try {
            //對檔案進行繼續寫入
            FileWriter fileWriter = new FileWriter("demo2.txt",true);
            //獲取換行符,每種系統的換行符不一樣
            //String lineStr = System.getProperty("line.separator");
            fileWriter.write("eeee1");
            // fileWriter.write("ab" + lineStr + "cde");

            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

IO異常處理的最基本程式碼結構

    public static void exceptionTest() {
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter("L:/demo2.txt",true);
            fileWriter.write("adbcd");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    throw new RuntimeException("");
                }
            }

        }
    }

複製文字檔案

這是一個讀取檔案和寫入檔案的綜合應用,這裡的檔案是在classPath路徑下,也可以指定絕對路徑


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 複製文字檔案測試(每次讀取一個字元和寫入一個字元)
 */
class CopyTxtFileTest {
    public static void main(String[] args) {
        copyTxtFile("demo.txt","demo_copy.txt");
    }

    public static void copyTxtFile(String sourceFile,String targetTxtFile) {
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        try {
            fileReader = new FileReader(sourceFile);
            fileWriter = new FileWriter(targetTxtFile);
            do {
                int ch = fileReader.read();
                if (ch < 0) {
                    break;
                }
                fileWriter.write(ch);
            } while (true);
            //fileWriter.write(fileReader);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//關閉已經開啟的檔案
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

讀寫(IO)緩衝區 Buffer

緩衝區提高了對資料的讀寫效率;
緩衝區要結合流才有用;
緩衝區可以看做是流的增強套件。

BufferedReader

從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取

 /**
     * 通過緩衝區來讀取一個檔案
     */
    public static void testBuffedRead() {
        FileReader fileReader = null;
        try {
            fileReader = new FileReader("demo.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            //bufferedReader.readLine();
            do {
                String lineStr = bufferedReader.readLine();
                if (lineStr == null) {
                    break;
                }
                System.out.println("lineStr = " + lineStr);
                bufferedReader.close();
            } while (true);
            //fileReader.read();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

BufferedWriter

將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入
緩衝區必須有緩衝的物件,對於 BufferedWriter 他緩衝的物件是 Writer

public static void bufferWriter() {
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter("bufferWriter.txt");
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
            bufferedWriter.write("bufferedWriter test");
            //使用緩衝區去的重新整理把資料重新整理到目的檔案中
            bufferedWriter.flush();
            //關閉緩衝區時,也會關閉
            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }