1. 程式人生 > 實用技巧 >java基礎——IO

java基礎——IO

IO流

在 Java IO 中,流是一個核心的概念。流表示的是連續的資料,稱之為資料流。我們既可以讀取流中的資料,也可向流中寫入資料。在 Java IO 中,根據讀寫資料的型別不同,可以將流分為兩種型別:位元組流(按位元組讀取資料),字元流(按字元讀取資料)。

java.io 包提供了操作流的類,而這些類的頂層父類如下(輸入和輸出是相對於 JVM 來說的):

位元組流字元流
輸入流 InputStream Reader
輸出流 OutputStream Writer

位元組流

計算機中的檔案都是以位元組的形式進行儲存。

位元組輸出流——OutputStream

以上就是 OutputStream 類的所有方法。OutputStream 只是提供了一些共用的方法,其直接子類共有六個。

FileOutputStream

該類是向磁碟檔案中寫入資料。以下是其構造方法和一般方法。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        File file 
= new File("D:\\javaTest\\IO\\a.txt"); //建立一個輸出流物件, 引數是一個File物件, 路徑必須是實際存在的, 否則會報FileNotFoundException //如果路徑下的檔案不存在, 則會建立該檔案 FileOutputStream out = new FileOutputStream(file); //呼叫write()方法, 向檔案中寫入資料, 只能以位元組的方式寫入 out.write(97); //寫入檔案的是字母 a
//關閉資料流, 釋放資源 out.close(); } }
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\javaTest\\IO\\a.txt");
        
        //建立一個輸出流物件, 引數是一個File物件, 路徑必須是實際存在的, 否則會報FileNotFoundException
        //如果路徑下的檔案不存在, 則會建立該檔案
        FileOutputStream out = new FileOutputStream(file);
        
        //寫入資料會先轉換為ASII碼, 然後在根據ASII碼寫入資料
        //呼叫write(Byte byte)方法, 向檔案中寫入資料, 以單個位元組的方式寫入
        out.write(97);   //寫入檔案的是字母 a
        
        //呼叫write(Byte []byte)方法, 向檔案中寫入資料, 以位元組陣列的方式寫入
        //如果某個位元組是負數,那該位元組就會與後一個位元組一起以GBK編碼格式顯示字元
        byte[] bytes = {-47, 64, -65, -66};
        out.write(bytes);   //寫入的是  袬烤
        
        //如果想寫入一個字串, 可以使用String類中的getBytes();
        String str = "向檔案中寫入字串";
        out.write(str.getBytes());
        
        //關閉資料流, 釋放資源
        out.close();
        
    }
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\javaTest\\IO\\a.txt");
        
        //通過建構函式 FileOutputStream(File file, boolean append)向檔案中續寫資料,不會覆蓋
        //append為true表示續寫, 為false會建立一個新檔案覆蓋原檔案
        FileOutputStream out = new FileOutputStream(file, true);
        
        out.write("可以".getBytes());
        out.write("向檔案".getBytes());
        out.write("中".getBytes());
        
        out.write("\r".getBytes());  //換行
        
        out.write("續寫資料".getBytes());
        
        //關閉資料流, 釋放資源
        out.close();
        
    }
}

位元組輸入流——InputStream

FileInputStream

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

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        FileInputStream in = new FileInputStream("D:\\javaTest\\IO\\a.txt");
        
        int len1 = 0; 
        while((len1 = in.read()) != -1) {  //read()每次只能讀入一個位元組, 方法呼叫一次指標就後移一位
            System.out.println(len1);      
        }
        
        byte[] bytes = new byte[2];
        int len2 = 0;
        while((len2 = in.read(bytes)) != -1) {  //read(byte []bytes), 每次最多讀取byte陣列的長度個位元組 
            System.out.println(new String(bytes, 0, len2)); //讀取byte陣列中有效的位元組個數,以免出現空格或陣列之前的內容
        }
        
        //關閉資料流, 釋放資源
        in.close();
        
    }
}

字元流

字元流與包括讀(Reader)和寫(Writer),每次讀或寫一個字元。使用方式和位元組流一樣,只需要把 InputStream 和 OutputStream 替換成 Reader 和 Writer。

字元輸入流——Reader

import java.io.FileReader;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        FileReader reader = new FileReader("D:\\javaTest\\IO\\a.txt");
        
        
        int len1 = 0; 
        while((len1 = reader.read()) != -1) {  //read()每次只能讀入一個位元組, 方法呼叫一次指標就後移一位
            System.out.print((char)len1);      
        }
        
        char[] c = new char[2];
        int len2 = 0;
        while((len2 = reader.read(c)) != -1) {  //read(byte []bytes), 每次最多讀取byte陣列的長度個位元組
            System.out.print(new String(c, 0, len2)); //讀取byte陣列中有效的位元組個數,以免出現空格或陣列之前的內容
        }
        
        //關閉資料流, 釋放資源
        reader.close();
        
    }
}

字元輸出流

import java.io.FileWriter;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        FileWriter writer = new FileWriter("D:\\javaTest\\IO\\a.txt", true);
        
        writer.write("字元寫入檔案");
        
        writer.flush();  //寫完資料必須重新整理回硬碟
        
        char[] c = {'可', '以', '通', '過', '數', '組' };
        writer.write(c);
        writer.flush();
        
        //關閉資料流, 釋放資源
        writer.close();
        
        //flush()和close()都可以把緩衝重新整理回記憶體, 但是flush()使用後還可以繼續使用流, 而close則已經關閉了流
        
    }
}

參考文獻

Java IO