Java細數IO流底層原理到方法使用

一、什麼是IO流

輸入流和輸出流。

  • 輸入流:數據從數據源(文件)到程序(內存)的路徑
  • 輸出流:數據從程序(內存)到數據源(文件)的路徑

二、常用的文件操作

學習目標:創建文件對象相關構造器和方法

new File(String pathname)//根據路徑構建一個File對象

new File(File parent,String child)//根據父目錄文件+子路徑構建

new File(String parent,String child)//根據父目錄+子路徑構建

學習任務:在e盤下,創建文件news1.txt、news2.txt、news3.txt用三種不同方式創建。

三種方式簡單看一下就行,後面會經常遇到。

new File(String pathname)//根據路徑構建一個File對象

package com.file;
import java.io.*;
public class FileCreate {
    public static void main(String[] args) {
            //方式 1 new File(String pathname)
            String filePath = "e:\\news1.txt";
            File file = new File(filePath);
            try {
                //創建新文件
                file.createNewFile();
                System.out.println("文件創建成功");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}

new File(File parent,String child)//根據父目錄文件+子路徑構建

package com.file;
import java.io.*;
public class FileCreate {
    public static void main(String[] args) {
        //方式 2 new File(File parent,String child) //根據父目錄文件+子路徑構建
        //e:\\news2.txt
            File parentFile = new File("e:\\");
            String fileName = "news2.txt";
           //這裡的 file 對象,在 java 程序中,隻是一個對象
           //隻有執行瞭 createNewFile 方法,才會真正的,在磁盤創建該文件
            File file = new File(parentFile, fileName);
            try {
                file.createNewFile();
                System.out.println("創建成功~");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}

new File(String parent,String child)//根據父目錄+子路徑構建

package com.file;
import java.io.*;
public class FileCreate {
    public static void main(String[] args) {
        //方式 3 new File(String parent,String child) //根據父目錄+子路徑構建
            String parentPath = "e:\\";
            String fileName = "news3.txt";
            File file = new File(parentPath, fileName);
            try {
                file.createNewFile();
                System.out.println("創建成功~");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}

三、獲取文件的相關信息

getName、getAbsolutePath、getParent、length、exists、isFile、isDirectory

學習任務:獲取文件的大小、文件名、路徑、父File,是文件還是目錄(目錄本質也是文件,一種特殊的文件),是否存在

四、目錄的操作和文件刪除

學習任務:

  • 判斷e:\news1.txt是否存在,如果存在就刪除
  • 判斷e:\\demo02是否存在,存在就刪除,否則提示不存在
  • 判斷e:\\demo\a\b\c目錄是否存在,如果存在就提示已經存在,否則就創建
package com.collection;
import java.io.File;
public class Delete {
    public static void main(String[] args) {
        String filePath="e:\\news1.txt";
        File file=new File(filePath);
        if(file.exists()){
            file.delete();
        }else {
            System.out.println("否則文件不存在~");
        }
    }
}
package com.collection;
import java.io.File;
public class Delete {
    public static void main(String[] args) {
        String filePath="e:\\demo02";
        File file=new File(filePath);
        if(file.exists()){
            if(file.delete()){
                System.out.println(filePath+"刪除成功");
            }
            else{
                System.out.println(filePath+"刪除失敗");
            }
        }else {
            System.out.println("否則目錄不存在~");
        }
    }
}
package com.collection;
import java.io.*;
public class Delete {
    public static void main(String[] args) {
        String directoryPath="e:\\demo\\a\\b\\c";
        File file=new File(directoryPath);
        if(file.exists()) {
            System.out.println(directoryPath + "存在。。");
        }
        else {
            if (file.mkdirs()){
                System.out.println(directoryPath+"創建成功。。");
            }else{
                System.out.println(directoryPath+"創建失敗。。");
            }
        }
    }
}

按操作數據單位不同分為:字節流(8bit)二進制文件,字符流(按字符)文本文件

按數據流的流向不同分為:輸入流,輸出流

按流的角色的不同分為:節點流,處理流/包裝流

字節流:InputStream,OutputStream

字符流:Reader,Writer

五、IO流體系圖-常用的類

六、FileInputStream常用方法

學習任務:請使用 FileInputStream 讀取 hello.txt 文件,並將文件內容顯示

先在e盤下創建hello.txt輸入內容hello world

package com.FileInputStream;
import java.io.FileInputStream;
import java.io.IOException;
//字節流文件的輸入程序
public class FileInputStream_ {
    public static void main(String[] args) {
        String filePath="e:\\hello.txt";
        int readData=0;
        FileInputStream fileInputStream=null;
        try {
            //創建 FileInputStream 對象,用於讀取文件
            fileInputStream=new FileInputStream(filePath);
            //從該輸入流讀取一個字節的數據。 如果沒有輸入可用,此方法將阻止。
            //如果返回-1 , 表示讀取完畢
            while ((readData = fileInputStream.read()) != -1) {
                System.out.print((char)readData);//轉成 char 顯示
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //關閉文件流
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

七、FileOutputStream常用方法

學習任務:請使用 FileOutputStream 在 abc.txt 文件,中寫入 “hello,world”. 如果文件不存在,會創建 文件(註意:前提是目錄已經存在.)

package com.hspedu.outputstream_;
import java.io.*;
public class FileOutputStream01 {
    public static void main(String[] args) {
        String filePath = "D:\\abc.txt";
        FileOutputStream fileOutputStream = null;
        try {
            //得到 FileOutputStream 對象 對象
            //1. new FileOutputStream(filePath) 創建方式,當寫入內容是,會覆蓋原來的內容
            // 2. new FileOutputStream(filePath, true) 創建方式,當寫入內容是,是追加到文件後面
            fileOutputStream = new FileOutputStream(filePath);
            //寫入一個字節
            //fileOutputStream.write('H');
            //寫入字符串
            String str = "hello,world!";
            //str.getBytes() 可以把 字符串-> 字節數組
            //fileOutputStream.write(str.getBytes());
            /*
             write(byte[] b, int off, int len) 將 len 字節從位於偏移量 off 的指定字節數組寫入此文件輸出流
             */
            fileOutputStream.write(str.getBytes(), 0, 3);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

學習任務:編程完成圖片/音樂 的拷貝

package com.hspedu.outputstream_;
import java.io.*;
public class FileCopy {
    public static void main(String[] args) {
        String srcFilePath="e:\\9030.jpg";
        String destFilePath="e:\\9031.jpg";
        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) {
            e.printStackTrace();
        }finally {
            try{
                if(fileInputStream!=null){
                    fileInputStream.close();
                }
                if(fileOutputStream!=null){
                    fileInputStream.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

八、FileReader常用方法

  • new FileReader(File/String)
  • read:每次讀取單個字符,返回該字符,如果到文件末尾返回-1
  • read(char[]):批量讀取多個字符到數組,返回讀取到的字符數,如果到文件末尾返回-1
  • 相關API:
  • new String(char[]):將char[]轉換成String
  • new String(char[],off,len):將char[]的指定部分轉換成String

九、FileWriter常用方法

  • new FileWriter(File/String):覆蓋模式,相當於流的指針在首端
  • new FileWriter(File/String,true):追加模式,相當於流的指針在尾端
  • write(int):寫入單個字符
  • write(char[]):寫入指定數組
  • write(char[],off,len):寫入指定數組的指定部分
  • write(string):寫入單個字符
  • write(string[],off,len):寫入字符串的指定部分
  • 相關API:String類:toCharArray:將String轉換成char[]
  • FileWriter使用後,必須要關閉(close)或刷新(flush), 否則寫入不到指定的文件!

學習任務:使用 FileReader 從 story.txt ,這一步先在story.txt存在數據,然後在端口輸出數據顯示出來

package com.reader_;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile01 {
    public static void main(String[] args) {
        String filePath="e:\\story.txt";
        FileReader fileReader=null;
        int data=0;
        //創建FileReader對象
        try{
            fileReader =new FileReader(filePath);
            //循環讀取 使用 read, 單個字符讀取
            while((data=fileReader.read())!=-1){
                //data數值為整數型,強制轉換為字符
                System.out.print((char)data);
            }
        }catch(
                IOException e){
            e.printStackTrace();
        }finally {
            try{
                if(fileReader!=null){
                    //關閉文件流
                    fileReader.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

學習任務:字符數組讀取文件

package com.reader_;
import java.io.FileReader;
import java.io.IOException;
public  class ReadFile02 {
    public static void main(String[] args) {
        String filePath="e:\\story.txt";
        FileReader fileReader=null;
        int readLen=0;
        char[] buf=new char[8];
        //創建FileReader對象
        try{
            fileReader =new FileReader(filePath);
            //循環讀取 使用 read(buf), 返回的是實際讀取到的字符數
            //如果返回-1, 說明到文件結束
            while((readLen=fileReader.read(buf))!=-1){
                System.out.print(new String(buf,0,readLen));
            }
        }catch(
                IOException e){
            e.printStackTrace();
        }finally {
            try{
                if(fileReader!=null){
                    fileReader.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

學習任務:使用 FileWriter 將 “風雨之後,定見彩虹” 寫入到 note.txt 文件中

package com.hspedu.writer_;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriter_ {
    public static void main(String[] args) {
        String filePath="e:\\noth.txt";
        FileWriter fileWriter=null;
        char[] chars={'a','b','c'};
        try {
            fileWriter = new FileWriter(filePath);
            //3) write(int):寫入單個字符
            fileWriter.write('H');
            // 4) write(char[]):寫入指定數組
            fileWriter.write(chars);
            // 5) write(char[],off,len):寫入指定數組的指定部分
            fileWriter.write("程序員飛鳥".toCharArray(), 0, 3);
            // 6) write(string):寫入整個字符串
            fileWriter.write(" 你好廣州");
            fileWriter.write("風雨之後,定見彩虹");
            // 7) write(string,off,len):寫入字符串的指定部分
            fileWriter.write("上海天津", 0, 2);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                //對應 FileWriter , 一定要關閉流,或者 flush 才能真正的把數據寫入文件裡面
                fileWriter.flush();//關閉文件流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("程序結束~");
    }
}

到此這篇關於Java細數IO流基礎到方法使用的文章就介紹到這瞭,更多相關Java IO流內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: