首頁 > 軟體

Java I/O流使用範例詳解

2022-08-04 22:02:51

1.java IO包

Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。

Java.io 包中的流支援很多種格式,比如:基本型別、物件、在地化字元集等等。

一個流可以理解為一個資料的序列。輸入流表示從一個源讀取資料,輸出流表示向一個目標寫資料。

檔案依靠流進行傳輸,就像快遞依託於快遞員進行分發

Java 為 I/O 提供了強大的而靈活的支援,使其更廣泛地應用到檔案傳輸和網路程式設計中。

下圖是一個描述輸入流和輸出流的類層次圖。

2.建立檔案

方式一:

/**
 * 建立檔案,第一種方式
 */
@Test
public void createFile01() {
    String filePath = "D://1.txt";
    File file = new File(filePath);
    try {
        file.createNewFile();
        System.out.println("檔案建立成功!");
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

第二種方式:

/**
 * 建立檔案,第二種方式
 */
@Test
public void createFile02() {
    File parentFile = new File("D:\");
    String fileName = "news.txt";
    File file = new File(parentFile, fileName);
    try {
        file.createNewFile();
        System.out.println("檔案建立成功!");
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

第三種方式:

/**
 * 建立檔案,第三種方式
 */
@Test
public void createFile03() {
    String parentPath = "D:\";
    String fileName = "my.txt";
    File file = new File(parentPath, fileName);
    try {
        file.createNewFile();
        System.out.println("檔案建立成功!");
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

3.獲取檔案資訊

範例程式碼:

/**
 * 獲取檔案資訊
 */
@Test
public void info() {
    // 建立檔案物件
    File file = new File("D:\news.txt");
    // 獲取檔案名字
    System.out.println(file.getName());
    // 獲取檔案路徑
    System.out.println(file.getAbsolutePath());
    // 獲取檔案父親目錄
    System.out.println(file.getParent());
    // 獲取檔案大小(位元組)
    System.out.println(file.length());
    // 檔案是否存在
    System.out.println(file.exists());
    // 是不是一個檔案
    System.out.println(file.isFile());
    // 是不是一個目錄
    System.out.println(file.isDirectory());
}

4.目錄操作

案例一:判斷指定目標是否存在,如果存在就刪除

// 判斷指定目標是否存在,如果存在就刪除
String filePath = "D:\news.txt";
File file = new File(filePath);
if (file.exists()) {
    if (file.delete()) {
        System.out.println("刪除成功!");
    } else {
        System.out.println("刪除失敗!");
    }
} else {
    System.out.println("檔案不存在!");
}

案例二:判斷目錄是否存在,如果存在即刪除

// 判斷目錄是否存在,如果存在即刪除
String dirPath = "D:\demo";
File file1 = new File(dirPath);
if (file1.exists()) {
    if (file1.delete()) {
        System.out.println("刪除成功!");
    } else {
        System.out.println("刪除失敗!");
    }
} else {
    System.out.println("目錄不存在!");
}

案例三:判斷指定目錄是否存在,不存在就建立目錄

// 判斷指定目錄是否存在,不存在就建立目錄
String persondir = "D:\demo\a\b\c";
File file2 = new File(persondir);
if (file2.exists()) {
    System.out.println("該目錄存在!");
} else {
    if (file2.mkdirs()) {
        System.out.println("目錄建立成功!");
    } else {
        System.out.println("目錄建立失敗!");
    }
}

注意:建立多級目錄,使用mkdirs,建立一級目錄使用mkdir

5.位元組輸入流InputStream

InputStream抽象類是所有類位元組輸入流的超類

  • FileInputStream 檔案輸入流
  • BufferedInputStream 緩衝位元組輸入流
  • ObjectInputStream 物件位元組輸入流

FileInputStream

檔案輸入流,從檔案中讀取資料,範例程式碼:

單個位元組的讀取,效率較低:

/**
 * read()讀檔案
 */
@Test
public void readFile01() throws IOException {
    String filePath = "D:\hacker.txt";
    int readData = 0;
    FileInputStream fileInputStream = null;
    try {
        fileInputStream = new FileInputStream(filePath);
        // 讀檔案,一個字元一個字元讀取,返回字元的ASCII碼,檔案尾部返回-1
        while ((readData = fileInputStream.read()) != -1) {
            System.out.print((char)readData);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        // 關閉流資源
        fileInputStream.close();
    }
}

注意:使用位元組流的方式,無法讀取檔案中的中文字元,如需讀取中文字元,最好使用字元流的方式

使用byte陣列的方式讀取,這使得可以讀取中文,並且有效的提升讀取效率:

/**
 * read(byte[] b)讀檔案
 * 支援多位元組讀取,提升效率
 */
@Test
public void readFile02() throws IOException {
    String filePath = "D:\hacker.txt";
    int readData = 0;
    int readLen = 0;
    // 位元組陣列
    byte[] bytes = new byte[8]; // 一次最多讀取8個位元組

    FileInputStream fileInputStream = null;
    try {
        fileInputStream = new FileInputStream(filePath);
        // 讀檔案,從位元組陣列中直接讀取
        // 如果讀取正常,返回實際讀取的位元組數
        while ((readLen = fileInputStream.read(bytes)) != -1) {
            System.out.print(new String(bytes, 0, readLen));
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        // 關閉流資源
        fileInputStream.close();
    }
}

6.位元組輸出流FileOutputStream

使用範例:(向hacker.txt檔案中加入資料)

/**
 * FileOutputStream資料寫入檔案
 * 如果該檔案不存在,則建立該檔案
 */
@Test
public void writeFile() throws IOException {
    String filePath = "D:\hacker.txt";
    FileOutputStream fileOutputStream = null;
    try {
        fileOutputStream = new FileOutputStream(filePath);
        // 寫入一個位元組
        // fileOutputStream.write('G');
        // 寫入一個字串
        String s = "hello hacker!";
        // fileOutputStream.write(s.getBytes());
        // 寫入字串指定範圍的字元
        fileOutputStream.write(s.getBytes(),0,3);
    } catch (FileNotFoundException e) {
        throw new RuntimeException(e);
    } finally {
        assert fileOutputStream != null;
        fileOutputStream.close();
    }
}

我們發現,使用這樣的FileOutputStream構造器無法實現向檔案中追加內容,只能進行覆蓋,我們可以在初始化物件的時候這樣解決:

fileOutputStream = new FileOutputStream(filePath,true);

7.模擬檔案拷貝

我們可以結合位元組輸入和輸出流模擬一個檔案拷貝的程式:

/**
 * 檔案拷貝
 * 思路:
 * 建立檔案的輸入流,將檔案讀取到程式
 * 建立檔案的輸出流,將讀取到的檔案資料寫入到指定的檔案
 */
@Test
public void Copy() throws IOException {
    String srcFilePath = "D:\hacker.txt";
    String destFilePath = "D:\hello.txt";
    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;
    try {
        fileInputStream = new FileInputStream(srcFilePath);
        fileOutputStream = new FileOutputStream(destFilePath);
        // 定義位元組陣列,提高效率
        byte[] buf = new byte[1024];
        int readLen = 0;
        while ((readLen = fileInputStream.read(buf)) != -1) {
            // 邊讀邊寫
            fileOutputStream.write(buf, 0, readLen);
        }
        System.out.println("拷貝成功!");
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        if (fileInputStream != null){
            fileInputStream.close();
        }
        if (fileOutputStream != null) {
            fileOutputStream.close();
        }
    }
}

8.字元輸入流FileReader

字元輸入流FileReader用於從檔案中讀取資料

範例:

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

/**
 * 字元輸出流
 */
public class FileWriteTest {
    public static void main(String[] args) throws IOException {
        String filePath = "D:\hacker.txt";
        // 建立物件
        FileWriter fileWriter = null;
        try {
            char[] chars = {'a', 'b', 'c'};
            fileWriter = new FileWriter(filePath, true);
            // 寫入單個字元
            // fileWriter.write('H');
            // 寫入字元陣列
            // fileWriter.write(chars);
            // 指定陣列的範圍寫入
            // fileWriter.write(chars, 0, 2);
            // 寫入字串
            // fileWriter.write("解放軍萬歲!");
            // 指定字串的寫入範圍
            fileWriter.write("hacker club", 0, 5);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // FileWriter是需要強制關閉檔案或重新整理流的,否則資料會儲存失敗
            fileWriter.close();
        }
    }
}

9.字元輸出流FileWriter

字元輸出流FileWrite用於寫資料到檔案中:

範例:

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

/**
 * 字元輸出流
 */
public class FileWriteTest {
    public static void main(String[] args) throws IOException {
        String filePath = "D:\hacker.txt";
        // 建立物件
        FileWriter fileWriter = null;
        try {
            char[] chars = {'a', 'b', 'c'};
            fileWriter = new FileWriter(filePath, true);
            // 寫入單個字元
            // fileWriter.write('H');
            // 寫入字元陣列
            // fileWriter.write(chars);
            // 指定陣列的範圍寫入
            // fileWriter.write(chars, 0, 2);
            // 寫入字串
            // fileWriter.write("解放軍萬歲!");
            // 指定字串的寫入範圍
            fileWriter.write("hacker club", 0, 5);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // FileWriter是需要強制關閉檔案或重新整理流的,否則資料會儲存失敗
            fileWriter.close();
        }
    }
}

使用FileWriter,記得關閉檔案或者重新整理流!

到此這篇關於Java I/O流使用範例詳解的文章就介紹到這了,更多相關Java I/O流內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com