Java I/O流以及文件的基本操作


文件操作:

文件操作其實就是一個FIle類;我們學習文件操作就是學習File類中的方法;

文件基操:

第一部分:學習文件的基本操作(先扒源碼以及文檔)

Constructor Description
File(File parent, String child) 給定要操作的問價的父路徑和子文件名稱
File(String pathname) 給定一個要操作文件的完整路徑
Modifier and Type Method Description
boolean public boolean createNewFile() throws IOException 創建文件
boolean delete() 刪除文件
boolean exists() 判斷給定路徑是否存在

來個實例:

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

public class FIleDelCre {
    public static void main(String[] args) throws IOException {
        File file = new File("e:\\IOFileSource\\xbhog.txt");
        if(file.exists()){
            file.delete();
        }else{
            System.out.println(file.createNewFile());
        }
    }
}

createNewFile:如果指定的文件不存在且已成功創建,則為True;如果指定的文件已經存在,則為False

知識點(敲黑板):

路徑分隔符:解決不同操作系統下的路徑符號問題(windows->“\”;Linux->“/”);

File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"xbhog.txt");

注:

/**
     * The system-dependent default name-separator character, represented as a
     * string for convenience.  This string contains a single character, namely
     * {@link #separatorChar}.
*/
public static final String separator = "" + separatorChar;

對父路徑操作的方法:

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

public class FIleDelCre {
    public static void main(String[] args) throws IOException {
        File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"test"+File.separator+"demo"+File.separator+"xbhog.txt");
        if(!file.getParentFile().exists()){ //如果該文件的父目錄不存在
            /*
            file.getParentFile().mkdirs();   //進行創建多級父目錄
            mkdirs底層進行遞歸調用,實現多級目錄創建

            file.getParentFile().mkdir();   //進行創建一個父目錄
            */
        }
        if(file.exists()){
            file.delete();
        }else{
            System.out.println(file.createNewFile());
        }
    }
}

注:mkdirs與mkdir的區別,最好進入源碼中查看

文件列表顯示:

流程圖:

image-20210426215631894

import java.io.File;
public class FilePwd {
    public static void main(String[] args) {
        File file = new File("D:" + File.separator);
		listDir(file);
    }
    public static void listDir(File file){
        if(file.isDirectory()){
            File[] Dirs = file.listFiles();
            while(Dirs != null){
                for (int i = 0; i < Dirs.length; i++) {
                    listDir(Dirs[i]);  //遞歸調用
                }
            }
        }
        System.out.println(file);
    }
}

文件批量更名:

情景:

在數據采集的過程中由於操作失誤,使得xbhog-log文件夾下的所有文件后綴采用了.java,為了修正這一錯誤,要求使得該目錄下的所有文件后綴統一替換成.txt,同時也需要考慮多級目錄下的文件更名操作。

image-20210426220807195

import java.io.File;
public class FIleChangeName {
    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "xbhog-log");
        renameDir(file);

    }
    public static void renameDir(File file){
        if(file.isDirectory()){
            File[] dirs = file.listFiles(); 
            for (int i = 0; i < dirs.length; i++) {
                renameDir(dirs[i]);  //遞歸調用
            }
        }else {
            if (file.isFile()){ //判斷是否為文件
                String fileName = null;  //文件名稱
                if(file.getName().endsWith(".java")){  //判斷是否以.java為結尾
                    fileName = file.getName().substring(0,file.getName().lastIndexOf("."))+".txt";
                    File newfile = new File(file.getParentFile(), fileName);  //新的文件名稱
                    file.renameTo(newfile);  //重命名
                }
            }
        }
    }
}

字節流與字符流:

字節流:outputStream以及inputStream

字符流:Writer以及Reader

對資源操作的基本步驟:(文件為例)--嚴格按照下面步驟

  1. 如果要操作的資源是文件的話,首先需要通過File類對象找到一個要操作的文件路徑
  2. 通過字節流或者字符流的子類為字節流或字符流的對象實例化(向上轉型)
  3. 執行讀寫操作
  4. 關閉資源

OutputStream字節輸入流

常用的類普通方法:

Modifier and Type Method Description
void close() 關閉此輸出流並釋放與此流關聯的任何系統資源。
void flush() 刷新此輸出流並強制寫入任何已緩沖的輸出字節。
void write(byte[] b) 輸出單個字節數據
void write(byte[] b, int off, int len) 輸出部分字節數據
abstract void write(int b) 輸出一組字節數據

對文件的操作需要其OutputStream下的子類FileOutputStream來實現對象的實例化;

其常用的構造方法是:

Constructor Description
FileOutputStream(File file) 創建一個文件輸出流,以寫入由指定file對象表示的文件。
FileOutputStream(File file, boolean append) 創建一個文件輸出流,以寫入由指定file對象表示的文件。如果第二個參數為真,則字節將被寫到文件的末尾而不是開頭

實例:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public class FIleOutputStearm {
    public static void main(String[] args) throws IOException {
        File file = new File("xbhog.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        OutputStream outputStearm = new FileOutputStream(file);
        String str = "歡迎來到xbhog的博客";
        outputStearm.write(str.getBytes(StandardCharsets.UTF_8));
        outputStearm.close();
    }
}

文件內容的追加:

    OutputStream stream = new FileOutputStream(file, true);
    String addStr = "-----這是追加的內容------";
    stream.write(addStr.getBytes());
    stream.close();

InputStream字節輸入流:

該類的常用方法:

Modifier and Type Method Description
void close() 關閉輸出流
abstract int read() 讀取單個字節數據,如果現在已經讀取到底了,返回-1
int read(byte[] b) 讀取一組字節數據,返回的是讀取的個數,如果沒有數據已經讀取到底則返回-1
int read(byte[] b, int off, int len) 讀取一組字節數據(只占數組的部分)
byte[] readAllBytes() 讀取輸入流全部字節數據,JDK 1.9后新增
long transferTo(OutputStream out) 輸入流轉存到輸出流,JDK 1.9之后新增

對文件的操作需要其InputStream下的子類FileInputStream來實現對象的實例化;

讀取文件的固定用法:

  1. 創建文件輸入流---InputStream input = new FileInputStream(file)
  2. 設置數據的讀取緩存區----new byte[1024]
  3. 讀取數據,將數據讀取到緩存區中並放回讀取的字節個數 ----int len = input.read(data)
  4. 字節轉換為字符流----new String(data,0,len)
  5. 關閉資源

讀取文件內容實例:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileInputStreamTest {
    public static void main(String[] args) throws IOException {
        File file = new File("xbhog.txt"); // 輸出文件路徑
        if (file.exists()) {    // 文件存在
            InputStream input = new FileInputStream(file);// 文件輸入流
            byte data[] = new byte[1024]; // 數據讀取緩沖區
            // 讀取數據,將數據讀取到緩沖區之中,同時返回讀取的字節個數
            int len = input.read(data);
            System.out.println("【" + new String(data, 0, len) + "】");// 字節轉為字符串
            input.close();    // 關閉輸入流

        }
    }
}

讀取文件中的全部內容:

byte[] bytes = input.readAllBytes();
System.out.println(new String(bytes));

Writer字符流:

為了簡化輸出的操作,提供了Writer與Reader字符流;

該類的常用方法:

Modifier and Type Method Description
Writer append(char c) 將指定的字符寫入。
Writer append(CharSequence csq) 將指定的字符序列附加到此編寫器。
Writer append(CharSequence csq, int start, int end) 將指定字符序列的子序列追加到此編寫器
abstract void close() 關閉資源
abstract void flush() 刷新資源流
void write(char[] cbuf) 寫入一組字符數組
abstract void write(char[] cbuf, int off, int len) 寫入一組字符數組的一部分
void write(int c) 寫入一個字符
void write(String str) 寫入一個字符串
void write(String str, int off, int len) 寫入一個字符串的一部分

在進行文件流的寫入時,需要引入Writer下的FileWriter子類;

類的項目結構:

FileWriter常用構造方法:

Constructor Description
FileWriter(File file) 給定File對象,構造一個FileWriter對象。
FileWriter(String fileName, boolean append) 構造一個給定文件名的FileWriter對象,該文件名帶有一個布爾值,該布爾值表示是否追加寫入的數據。

實例:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class FileWriterDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("FileWriter.txt"); // 輸出文件路徑
        if(!file.exists()){
            file.createNewFile();
        }
        Writer out = new FileWriter(file) ; // 實例化Writer類對象
        out.write("歡迎來到xbhog");	// 輸出字符串
        out.write("\n");
        out.append("Test\n");
        out.append("www.cblog.cn/xbhog") ;// 追加輸出內容
        out.close();// 關閉輸出流
    }
}

Reader字符輸入流:

該類常用的方法:

Modifier and Type Method Description
abstract void close() 關閉資源
int read() 讀取單個字符
int read(char[] cbuf) 將字符放入數組
long skip(long n) 跳過字符(幾個)
boolean ready() 判斷這個流是否已准備好了讀取了

實例測試:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class FileReaderDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("FileWriter.txt");// 輸出文件路徑
        if (file.exists()) {// 文件存在
            Reader in = new FileReader(file);  // 實例化輸入流
            char data[] = new char[1024];  // 緩沖區
            //“歡迎沒有了”
            in.skip(2);// 跨過2個字符長度
            int len = in.read(data); // 讀取數據
            System.out.println(new String(data, 0, len));
            in.close();// 關閉輸入流
        }
    }
}

轉換流:

轉換流 OutputStreamWriter InputStreamReader
繼承結構 public class OutputStreamWriterextends Writer {} public class InputStreamReaderextends Reader
構造方法 public OutputStreamWriter(OutputStream out) public InputStreamReader(InputStream in)

實現兩者的轉換操作:

將字節輸入流轉換成字符輸入流

import java.io.*;
public class ConversionOperations {
    public static void main(String[] args) throws IOException {
        File file = new File("FileWriter1.txt"); 	// 輸出文件路徑
        OutputStream output = new FileOutputStream(file) ;// 字節流
        Writer out = new OutputStreamWriter(output) ; 	// 字節流轉字符流
        out.write("測試兩者之間的轉換"); // 字符流輸出
        out.close();	// 關閉輸出流
        output.close(); 	// 關閉輸出流
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM