Java-IO流學習 課堂筆記

image-20200417220210489

JAVA-IO流

1、IO流是什麼?

IO:input和output

輸入和輸出流的意思?

​ java程序進行數據傳輸的管道!

​ 流就是管道的意思

​ 流:Stream

現實網絡操作中有沒有進行數據輸入輸出的操作?

例如:上網註冊信息的時候對圖片信息的上傳!------上傳 —輸入程序中的輸入流

​ 從網上下載數據的時候,也是數據的傳輸! — 下載 —輸出的操作

圖片


在計算機中所以的數據都是以文件的格式存儲的!

在Java中認爲文件是一個對象!!!

Java認爲所以的東西都是對象!

官方解釋:

​ 文件和目錄路徑名的抽象表示形式 (磁盤上的文件和文件夾都是File的對象)

​ 文件就是磁盤上的文件在Java語言中的表示對象!

​ Class 類—對象—>**.class 在內存中的表現形式

​ new 類();jvm----class文件 ------>class 對象

​ File類的對象 就是磁盤上所有的文件 在java語言中對象的表現形式

2、File類的構造方法

File(string pathname):根據一個路徑得到File對象

File(String parent),String child):根據一個目錄和子文件/目錄得到File對象

File(File parent,String child):根據一個父File對象和一個子文件/目錄得到File對象

package IO01;

import java.io.File;
/*
	java.io.File類
1.凡是與輸入、輸出相關的類、接口等都定義在java.io包下
2.File是一個類,可以有構造器創建其對象。此對象對應着一個文件(.txt .png .jpg .mp3 .ppt) 或是文件夾(目錄)
3.File類對象是與平臺無關的。
4.File中的方法,僅涉及到如何創建、刪除、重命名等等。
只有涉及文件內容的,File是無能爲力的,必須由IO流來完成。
5.File類的對象常作爲IO流的具體類的構造器形參。


	路徑
1.絕對路徑:包括盤符在內的完整文件路徑
2.相對路徑:在當前文件目錄下的文件的路徑
*/

public class Text {
//  File(string pathname):根據一個路徑得到File對象
//  Java中一個"\"反斜槓代表的是轉義字符的開始標誌,你要是想用“\”,就必須用兩個“\”來表示,或者一個“/”
    File file1 = new File("D:\\桌面\\Java_IO流\\IO\\b.txt");
//  File(String parent),String child):根據一個目錄和子文件/目錄得到File對象
//  java中認爲文件夾是一種特殊的文件,只不過文件夾中的內容是其他的文件或文件夾,而文件中是數據
    File file2 =new File("D:\\桌面\\Java_IO流\\IO","b.txt");
//    File(File parent,String child):根據一個父File對象和一個子文件/目錄得到File對象
    File file=new File("D:\\桌面\\Java_IO流\\IO");
    File file3=new File(file,"b.txt");


}

3、File類的成員方法

1、創建功能

public boolean createNewFile():創建文件如果存在這樣的文件,就不創建了

public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了

public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來

package IO01;

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

//public boolean createNewFile():創建文件如果存在這樣的文件,就不創建了
//public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了
//public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
public class Text1 {
    public static void main(String[] args) throws IOException {
        //public boolean createNewFile():創建文件如果存在這樣的文件,就不創建了
        File file=new File("D:\\桌面\\Java_IO流\\IO\\cc.txt");
        boolean newFile = file.createNewFile();//創建一個文件返回一個布爾類型的值
        System.out.println(newFile);

        //如果沒有指明創建文件的路徑,那麼該文件是在項目路徑下創建
        File file1=new File("dd.txt");
        boolean newFile1 = file1.createNewFile();
        System.out.println(newFile1);

        //如果路徑不存在能不能創建
        //如果調用該createNewFile方法的時候路勁必須存在
        File file2 = new File("D:\\桌面抹布\\Java_IO流\\IO");
        boolean newFile2 = file2.createNewFile();
        System.out.println(newFile2);
        //答案是不能,會報錯IOException,系統找不到指定文件

    }
}
package IO01;

import java.io.File;

public class Text2 {
    public static void main(String[] args) {
        //public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了
        File file = new File("D:\\桌面\\Java_IO流\\IO\\cccc");
        boolean mkdir = file.mkdir();
        System.out.println(mkdir);
        //public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了
        // 該方法不能創建多重文件夾
        File file2 = new File("D:\\桌面\\Java_IO流\\IO\\ccccc\\aaa");
        boolean mkdir2 = file2.mkdir();
        System.out.println(mkdir2);//false

        //public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
        //他是用來創建多重文件夾的
        File file3 = new File("D:\\桌面\\Java_IO流\\IO\\ccccc\\aaa");
        boolean mkdir3 = file3.mkdirs();
        System.out.println(mkdir3);//false

        //同一個項目下,文件和文件夾不能重名
        File file1 = new File("bbbb");
        file1.mkdir();

    }
}

2、刪除功能

public boolean delete(); 可以用來刪除文件和文件夾

package IO01;

import java.io.File;

//刪除功能
//public boolean delete(); 可以用來刪除文件和文件夾
public class Text3 {
    public static void main(String[] args) {
        File file = new File("dd.txt");
        File file1 = new File("bbbb");
        file.delete();
        file1.delete();
    }
}

3、重命名功能

renameTo

4、判斷功能

package IO01;

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

//刪除功能
//public boolean delete(); 可以用來刪除文件和文件夾
public class Text3 {
    public static void main(String[] args) {
        File file = new File("dd.txt");
        //判斷這個文件是否存在 exists
            boolean newFile = file.exists();
            if(newFile){
                System.out.println("文件已存在");
            }else {
                try {
                    boolean newFile1 = file.createNewFile();
                    System.out.println(newFile1?"創建成功":"創建失敗");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
    }
}

image-20200427143829628

5、查詢文件

package IO01;

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

//刪除功能
//public boolean delete(); 可以用來刪除文件和文件夾
public class Text3 {
    public static void main(String[] args) {
        File file = new File("dd.txt");
            boolean newFile = file.exists();
            if(newFile){
                System.out.println("文件已存在");
            }else {
                try {
                    boolean newFile1 = file.createNewFile();
                    System.out.println(newFile1?"創建成功":"創建失敗");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            //獲取文件大小
        File file1 = new File("dd.txt");
        long length = file1.length();
        System.out.println("size="+length);
        //獲取文件名
        String name = file1.getName();
        System.out.println("filename="+name);
        //獲取文件的路徑
        String path = file1.getPath();
        System.out.println("path="+path);
    }
}

String字符串:length(),返回字符串的個數

數組: 數組名.length ,是屬性,獲取數組中元素的個數

集合:集合對象名.size() ,返回集合中元素的個數

6、遞歸*

方法自己調用自己。。

isDirectory():判斷文件是否是文件夾

listFiles():查詢某個文件夾下的所有文件

遍歷 for(數據類型 變量名:數組/集合)

package IO01;


import java.io.File;

//遞歸:找出某個文件夾下所有的文件
public class Text4 {
    public static void showFile(String patname){
        File file = new File(patname);
        //1、判斷文件是否是文件夾
        boolean directory = file.isDirectory();
        //選擇某個文件夾下所有文件
        if (directory){//是文件夾
            File[] files = file.listFiles();
            for (File tempFile:files){
                boolean directory1 = tempFile.isDirectory();
                if(directory1){
                    showFile(tempFile.getPath());
                }else{
                    String path = file.getPath();
                    System.out.println("普通文件----"+path);
                    //            file.delete();  //刪除
                }
            }
        }else{//不是文件夾
            //獲取此文件的路徑
            String path = file.getPath();
            System.out.println("普通文件----"+path);
//            file.delete(); //刪除
        }

    }
    public static void main(String[] args) {
        Text4.showFile("D:\\");
    }
}

4、File類成員方法—重置版筆記

圖片

4.1、訪問文件名

  • getName() //獲取文件名

  • getPath() //獲取文件路徑

  • getAbsoluteFile() //絕對文件名

  • getAbsolutePath() //絕對文件路徑

  • getParent() //獲取上一層文件路徑

  • renameTo(File newName) //把一個文件改成另一個文件

package IO01;

import java.io.File;

public class FileMet {
    public static void main(String[] args) {
        FileMet fileMet = new FileMet();
        fileMet.test1();
    }
    /*
    * getName() //獲取文件名
    * getPath() //獲取文件路徑
    * getAbsoluteFile() //絕對文件名
    * getAbsolutePath() //絕對文件路徑
    * getParent() //獲取上一層文件路徑
    * renameTo(File newName) //把一個文件改成另一個文件
    * */
    public void test1(){
        File file1 = new File("D:\\桌面\\Java工程\\IO\\Hello.txt");
        File file2 = new File("Hello.txt");


        File file3 = new File("D:\\桌面\\Java工程\\IO");

        System.out.println(file1.getName());
        System.out.println(file1.getPath());
        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getParent());

        System.out.println();

        System.out.println(file2.getName());
        System.out.println(file2.getPath());
        System.out.println(file2.getAbsoluteFile());
        System.out.println(file2.getAbsolutePath());
        System.out.println(file2.getParent());

        System.out.println();

        System.out.println(file3.getName());
        System.out.println(file3.getPath());
        System.out.println(file3.getAbsoluteFile());
        System.out.println(file3.getAbsolutePath());
        System.out.println(file3.getParent());

        //renameTo(File newName): 重命名
        //file1.renameTo(file2): 將file1重命名爲file2
        //要求file1文件一定存在,file2一定不存在
        //同是文件或文件目錄
        boolean b = file1.renameTo(file2);
        System.out.println(b);

    }
}

4.2、文件檢測&獲取常規文件信息

  • exists() //判斷這個文件是否存在

  • canWrite() //判斷是否可寫

  • canRead() //判斷是否可讀

  • isFile() //判斷是否爲文件

  • isDirectory() //判斷是否爲文件目錄(文件夾)

  • lastModified() //返回文件最後修改時間

  • length() //返回文件的大小

package IO01;



import java.util.Date;
import java.io.File;

public class FileTest {
    public static void main(String[] args) {
        FileTest fileTest = new FileTest();
        fileTest.test();
    }
    /*
    exists() //判斷這個文件是否存在
    canWrite() //判斷是否可寫
    canRead() //判斷是否可讀
    isFile() //判斷是否爲文件
    isDirectory() //判斷是否爲文件目錄(文件夾)

    lastModified() //返回文件最後修改時間
    length() //返回文件的大小

    */


    public void test(){
        File file1 = new File("D:\\桌面\\Java工程\\IO\\Hello.txt");
        File file2 = new File("D:\\桌面\\Java工程\\IO");


        System.out.println(file1.exists());
        System.out.println(file1.canWrite());
        System.out.println(file1.canRead());
        System.out.println(file1.isFile());
        System.out.println(file1.isDirectory());
        System.out.println(new Date(file1.lastModified()));
        System.out.println(file1.length());

        System.out.println();

        System.out.println(file2.exists());
        System.out.println(file2.canWrite());
        System.out.println(file2.canRead());
        System.out.println(file2.isFile());
        System.out.println(file2.isDirectory());
        System.out.println(new Date(file2.lastModified()));
        System.out.println(file2.length());
    }
}

4.3、文件操作相關&目錄操作相關

package IO01;

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

public class CreateFile {
    public static void main(String[] args) throws IOException {
        CreateFile createFile = new CreateFile();
        createFile.test();
    }
        /*
文件相關      createNewFile() :創建一個文件
文件夾相關    |delete()  //刪除成功返回true

             mkDir() :創建一個文件目錄,只有在上層文件目錄存在的情況下,才能返回true
             mkDirs() :創建一個文件目錄,若上層文件目錄不存在,一併創建
             list() : 字符串形式保存
             listFiles()
         */

    public void test() throws IOException {
        File file1 = new File("D:\\桌面\\Java工程\\IO\\Hello.txt");
        System.out.println(file1.delete());

        if (!file1.exists()){
            boolean newFile = file1.createNewFile();
            System.out.println(newFile);
        }

        File file2 = new File("D:\\桌面\\Java工程\\IO\\IO02");
        if (!file2.exists()){
            boolean mkdir = file2.mkdir();
            System.out.println(mkdir);
            //上層文件目錄不存在,無法創建。如果用mkdirs,上層目錄不在,也創建
        }


        File file3 = new File("D:\\桌面");
        String[] list = file3.list();
        for (int i = 0; i < list.length; i++) {
            System.out.println(list[i]);
        }
        System.out.println();
        File[] files = file3.listFiles();
        for (int i = 0; i < files.length; i++) {
            System.out.println(files[i].getName());
        }
    }

}

5、IO流

輸入input

輸出output

分類:

  • 數據單位:字節流(8 bit),字符流(16 bit)

  • 流向:輸入流,輸出流

  • 角色:節點流,處理流

[抽象基類] 字節流 字符流
輸入流 InputStream Reader
輸出流 OutputStream Writer

圖片

在這裏插入圖片描述

1、字節流

FileInputStream

輸入流:InputStream

package Z$IO;



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


public class TestFileInputOutputStream {
    public static void main(String[] args) throws Exception {
        TestFileInputOutputStream test = new TestFileInputOutputStream();
//        test.testFileInputStream1();
//        test.testFileInputStream2();
        test.testFileInputStream3();
    }
    /*
    1.流的分類
    按照流向的不同,分爲輸入輸出流
    按照處理數據的單位不同,字節流,字符流(處理的文本文件)
    按照角色不同,節點流(直接作用於文件上),處理流
    1.IO的體系
    抽象基類            節點流(文件流)//訪問文件//
    InputStream         FileInputStream
    OutputStream        FileOutputStream
    Reader              FileReader
    Writer              FileWriter
    */
    public void testFileInputStream3(){
        FileInputStream fis = null;
        try {
            File file = new File("Hello.txt");
            fis = new FileInputStream(file);
            byte[] b = new byte[5];//要讀取到的數據要寫入的數組
            int len; //每次讀入到byte中的字節的長度
            while ((len=fis.read(b))!=-1){
                for (int i = 0; i < len; i++) {
                    System.out.print((char) b[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis!=null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    //使用try-catch的方式處理如下的異常更合理!:保證流的關閉操作一定可以執行
    public void testFileInputStream2(){
        FileInputStream FIS = null;
        try {
            //1.創建一個File類的對象
            File file = new File("Hello.txt");
            //2.創建一個FileInputStream類的對象
            FIS = new FileInputStream(file);
            //3.調用FileInputStream的方法,實現file文件的讀取。
            int b;
            while ((b=FIS.read())!=-1){
                System.out.print((char) b);
            }//一次一個字節,想辦法一次多送幾個字節 詳情見方法3
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            System.out.println("123");
            try {
                if (FIS!=null) {
                    //4.關閉相應的流
                    FIS.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    //從硬盤存在的一個文件中,讀取其內容到程序中。使用FileInputStream
    //要讀取的文件一定要存在,否則拋FileNoFoundException異常
    public void testFileInputStream1() throws Exception {
        //1. 創建一個File類的對象。
        File file = new File("Hello.txt");
        //2. 創建一個FileInputStream類的對象
        FileInputStream fileInputStream = new FileInputStream(file);
        //3. 調用FileInputStream的方法,實現file文件的讀取。
        /*
        read():讀取文件的一個字節。當執行到文件結尾時返回-1

        */
//        int b=fileInputStream.read();
//        while (b!=-1){
//            System.out.print((char)b);
//            b=fileInputStream.read();
//        }        //讀取操作
        // 簡寫
        int b;
        while ((b=fileInputStream.read())!=-1){
            System.out.print((char)b);
        }
        //4.關閉相應的流
        fileInputStream.close();
    }
}

FileOutputStream

輸出流:OutputStream

package Z$IO;

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

public class TestFileOutputStream {
    public static void main(String[] args) {
        TestFileOutputStream test = new TestFileOutputStream();
        test.testFileOutputStream();

    }
     /*
    1.流的分類
    按照流向的不同,分爲輸入輸出流
    按照處理數據的單位不同,字節流,字符流(處理的文本文件)
    按照角色不同,節點流(直接作用於文件上),處理流
    1.IO的體系
    抽象基類            節點流(文件流)//訪問文件//
    InputStream         FileInputStream
    OutputStream        FileOutputStream
    Reader              FileReader
    Writer              FileWriter
    */
    public void testFileOutputStream(){
        //1.創建一個File對象,表明要寫入的文件位置
        //輸出的物理文件可以不存在,當執行過程中,若不存在,會自動創建
        File file = new File("HelloWord.txt");
        //2.創建一個FileOutputStream的對象,將file的對象作爲形參傳遞給FileOutputStream的構造器中
        FileOutputStream fos=null;
        try {
            fos = new FileOutputStream(file);
            //3.寫入的操作
            fos.write(new String("I love China").getBytes());
            //將一個字符串轉換成字符數組
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.關閉輸出流
            if(fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

2、字符流

輸入流:Reader

輸出流:Writer

Reader&Writer

package Z$IO;

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

public class TestFileReader {
    public static void main(String[] args) {
        TestFileReader testFileReader = new TestFileReader();
//        testFileReader.testFileReader();
        testFileReader.testFileReaderWriter();
    }
    /*
    使用FileReader FileWriter 可以實現文本文件的複製
    對於非文本文件(視頻文件,音頻,圖片等),只能使用字節流!
    */
    public void testFileReaderWriter(){
        //1.輸入流對應的文件src一定要存在,否則拋異常
        //輸出流對應的文件file可以不存在,執行過程中會自動創建
        FileReader fr=null;
        FileWriter fw=null;
        try{
            File src = new File("ABC.txt");
            File file = new File("ABCD.txt");
            //2.
            fr=new FileReader(src);
            fw = new FileWriter(file);
            //3.
            char[] chars = new char[24];
            int len;
            while ((len=fr.read(chars))!=-1){
                fw.write(chars,0,len);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(fw!=null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fr!=null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void testFileReader(){
        FileReader fr = null;
        try {
            File file = new File("ABC.txt");
            fr = new FileReader(file);
            char[] chars = new char[24];//每次讀24個
            int len;//記錄長度
            while ((len=fr.read(chars))!=-1){
                String s = new String(chars, 0, len);
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fr!=null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}

3、RandomAccessFile類

  • RandomAccessFile類支持“隨機訪問”的方式,程序可以直接跳到文件的任意地方來讀、寫文件

    • 支持只訪問文件的部分內容
    • 可以向已存在的文件後追加內容
  • RandomAccessFile對象包含一個記錄指針,用以標示當前讀寫處的位置。RandomAccessFile類對象可以自由移動記錄指針:

    • long getFilePointer():獲取文件記錄指針的當前位置
    • void seek(long pos):將文件記錄指針定位到pos位置
  • 構造器

    • public RandomAccessFile(File file,String mode)
    • public RandomAccessFile(String name,String mode)
  • 創建RandomAccessFile類實例需要指定一個mode參數,該參數指定RandomAccessFile的訪問模式:

    • r:以只讀方式打開
    • rw:打開以便讀取和寫入
    • rwd:打開以便讀取和寫入:同步文件內容的更新
    • rws:打開以便讀取和寫入:同步文件內容和元數據的更新
package Z$IO;

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

/*
* RandomAccessFile:支持隨機訪問
*
* 特點:
* 1. 既可以充當一個輸入流,又可以充當一個輸出流
* 2. 支持從文件的開頭讀取、寫入
* 3. 支持從任意位置的讀取、寫入(插入)
* */
public class TestRandomAccessFile {
    public void test4(){
        //相比於test3更通用
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(new File("HelloWord.txt"),"rw");
            raf.seek(4);
            byte[] bytes = new byte[10];
            int len;
            StringBuffer sb = new StringBuffer();
            while ((len=raf.read(bytes))!=-1){
                sb.append(new String(bytes,0,len));
            }
            raf.seek(4);
            raf.write("xy".getBytes());
            raf.write(sb.toString().getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (raf!=null) {
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //實現插入的效果,在D字符後面插入"XY"  //文本只有一行的時候
    public void test3(){
        //long getFilePointer():獲取文件記錄指針的當前位置
        //void seek(long pos):將文件記錄指針定位到pos位置
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(new File("HelloWord.txt"),"rw");
            raf.seek(4);
            //把D後邊的取出來
            String s = raf.readLine();//讀一行 EFJGhina
//            long filePointer = raf.getFilePointer();//獲取當前指針位置
//            System.out.println(filePointer);

            raf.seek(4);
            raf.write("XY".getBytes());
            raf.write(s.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (raf!=null) {
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //實現了實際上是覆蓋效果
    public void test2(){
        //long getFilePointer():獲取文件記錄指針的當前位置
        //void seek(long pos):將文件記錄指針定位到pos位置
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(new File("HelloWord.txt"),"rw");
            raf.seek(3);
            raf.write("XY".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (raf!=null) {
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //進行文件的讀、寫
    public void test1(){
        RandomAccessFile raf1 = null;//r 只讀
        RandomAccessFile raf2 = null;
        try {
            raf1 = new RandomAccessFile(new File("Hello.txt"),"r");
            raf2 = new RandomAccessFile(new File("HelloWord.txt"),"rw");


            byte[] bytes = new byte[20];
            int len;
            while ((len=raf1.read(bytes))!=-1){
                raf2.write(bytes,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (raf2!=null) {
                try {
                    raf2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (raf1!=null) {
                try {
                    raf1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        TestRandomAccessFile tRAF = new TestRandomAccessFile();
//        tRAF.test1();
//        tRAF.test2();
//        tRAF.test3();
        tRAF.test4();
    }
}

//部分圖片來自網絡,若有侵犯了您的合法權益,請聯繫我刪除

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