JavaIO流 文件的讀寫

1. 文件的寫入

package my;

import java.io.*;

public class TestWrite {
    public static void main(String[] args) throws IOException {
        byte[] data = {0, 2, 4, 6, 8, 10, 12, 14};

        // 寫入文件
        File file = new File("example.123");  // 指定保存的路徑
        OutputStream outputStream = new FileOutputStream(file);   // 創建文件
        outputStream.write(data, 0, 8); // 8個字節 data[0] - data[7]
        outputStream.close();

        System.out.println("exit.");
    }
}

在這裏插入圖片描述
可以發現多了個123文件, 可以用UltraEdit這個工具打開,切換到十六進制查看
在這裏插入圖片描述
這幾個數就是剛剛寫入的

2. 文件的讀取

package my;

import java.io.*;

public class TestRead {
    public static void main(String[] args) throws IOException {
        // 用於接收數據的緩存區, 需要足夠大
        byte[] buffer = new byte[1000];
        // 這裏可以使用絕對路徑或者相對路徑來定義文件
        File file = new File("example.123");

        // 從文件中讀取數據,加載到緩存區
        InputStream inputStream = new FileInputStream(file);
        //buffer表示緩存區, 0表示從第一個字節開始讀取, 1000表示一共讀取1000個字節
        // 返回值res表示讀取了多少個字節
        int res = inputStream.read(buffer, 0, 1000);
        inputStream.close();
        System.out.printf("讀取了%d個字節\n", res);
        System.out.println("exit..");
    }
}

與文件的寫入基本步驟差不多, 只不過這次是用一個buffer緩衝區來接收讀取的文件裏的字節數

3. 文本的寫入

如何將一個字符串寫入到文件, 我們需要先把字符串轉換爲字節數據, 文件的寫入只能接收字節數據,我們要把string類型轉換爲byte[]類型

package my;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class WriteFile {
    public static void main(String[] args) throws IOException {
        String s = "你好世界";
        byte[] buffer = s.getBytes(StandardCharsets.UTF_8);

        File file = new File("test.txt");
        OutputStream outputStream = new FileOutputStream(file);
        outputStream.write(buffer);
        outputStream.close();
        System.out.println("Exit..");
    }
}

與前邊的字節讀入基本無異, 就是把string類型轉了一下byte類型,以UTF-8的格式轉

4. 文本的讀取

文本的讀取就是和文本的寫入反過來, 文本讀取先讀取到字符數據,然後再把字符數據轉換爲String類型即可

package my;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class TextRead {
    public static void main(String[] args) throws IOException {

        byte[] buffer = new byte[1000];

        // 定義文本路徑
        File file = new File("test.txt");

        // 從文本中讀取並加載到緩衝區
        InputStream inputStream = new FileInputStream(file);
        int res = inputStream.read(buffer, 0, 1000);
        /**
         * 這裏吧讀取的byte字節類型轉換爲字符串類型
         */
        String s = new String(buffer, StandardCharsets.UTF_8);
        System.out.println(s);
    }
}

5. 二進制編碼

對於基本類型,比如int, double ,float如何存入文件
對於Java, 他有一個ByteBuffer ,一個基於字節得二進制編碼器, 可以對這些類型進行編碼

package my;

import java.nio.ByteBuffer;

public class OtherType {
    public static void main(String[] args) {
        // 創建一個100個字節得二進制編碼器
        ByteBuffer bf = ByteBuffer.allocate(100); // allicate 既是申請的意思,表示靜態申請空間
        // 把 一個整數和小數放進去
        bf.putInt(1234);
        bf.putDouble(56.78);

        // 查看實際佔用了多少字節,實際是一個指針, 指向第一個空閒的字節,所以可以用來表示總字節個數
        int size = bf.position();
        // 利用array方法來獲取它內部得數據
        byte[] data = bf.array();
        // 獲取內部數據的容量
        int capacity = bf.capacity();

        System.out.printf("實際佔用的字節數爲 %d \n", size);
        System.out.printf("總共的字節的容量 %d \n", capacity);
        for (int i = 0; i < size; i++) {
            System.out.printf("%02x ",data[i]);
        }
    }
}

在這裏插入圖片描述
當然寫進去的都是亂碼
在這裏插入圖片描述
用編碼工具即可看到二進制結果

6. 二進制解碼

編碼: Encode
解碼: Decode
將字節數據byte[]再恢復爲原始數據int, double
解碼過程還是用ByteBuffer來實現

package my;

import java.io.*;
import java.nio.ByteBuffer;

public class OtherRead {
    public static void main(String[] args) throws IOException {

        // 讀取二進制文件中的字符
        File file = new File("number.txt");
        InputStream inputStream = new FileInputStream(file);
        byte[] buffer = new byte[100];
        int res = inputStream.read(buffer, 0, 100);

        // 二進制解碼, 這裏利用wrap
        ByteBuffer bf = ByteBuffer.wrap(buffer, 0, res);
        bf.position(0); // 這一步, 有點意思, 就是把指針移動到最前邊的位置, 來從頭讀取
        int a = bf.getInt();
        float b = bf.getFloat();

        System.out.printf("a = %d, b = %f\n",a,b);
        System.out.println("exit..");
    }
}

二進制編碼的時候我們用的allocate來申請空間, 這裏區分wrap
allocate() 是再內存中,自己創建了 byte[]空間
wrap()則是利用外部讀取進來的現成的byte[]空間,而不用自己創建

另外我們可以利用 getInt(). getFloat(), getDouble()等這些函數來提取相應的字符數目來解碼
getInt()會依次讀取4個字節來組成int類型數, getFloat() 也是讀取四個字節, 而getDouble() 則是讀取8個字節

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