Java基礎知識學習——I/O流

知識點彙總

流:1.操作數據單位:字節流、字符流
2.數據的流向:輸入流、輸出流
3.流的角色:節點流、處理流
流的結構:
抽象基類:InputStream、OutputStream、Reader、Writer。
節點流/文件流:FileInputStream、FileOutputStream、FileReader FileWriter。
緩衝流(處理流):BufferedInputStream、BufferedOutputStream、
BufferedReader、BufferedWriter。
注意:對於文本文件使用字符流去處理;對於非文本文件使用字節流去處理。
代碼示例:

public class FileIOTest {
    public static void main(String[] args) throws IOException {
        //實例化File類的對象
        File file=new File("Day18\\hi.txt");
        System.out.println(file.getAbsoluteFile());
        //提供具體的字符流
        FileReader fileReader=new FileReader(file);
        //數據的讀入
        int flag=fileReader.read();
        while(flag!=-1){
            System.out.print((char) flag);
            flag=fileReader.read();
        }
        System.out.println();
        //流的關閉
        fileReader.close();
        /*
        * 使用read()的重載方法
        * */
        File file1=new File("Day18\\hello.txt");
        //提供具體的流
        FileReader fileReader1=new FileReader(file1);
        //數據的讀入
        char[] chars=new char[5];
        int len;
        while((len=fileReader1.read(chars))!=-1){
            //錯誤的寫法
//            for (int i = 0; i < chars.length; i++) {
//                System.out.println(chars[i]);
//            }
            //方式一:
//            for(int i=0;i<len;i++){
//                System.out.print(chars[i]);
//            }
            //方式二:
            String string=new String(chars,0,len);
            System.out.print(string);
        }
        //資源關閉
        fileReader1.close();
        System.out.println("讀出寫入");
        /*
        * 從內存寫出到指定文件中
        * 輸出操作:如果文件不存在會自動創建文件,如果存在會依據append:(true/false)選擇覆蓋文件還是追加
        *
        * */
        //提供File對象
        File file2=new File("Day18\\he.txt");
        //創建FileWriter的對象
        FileWriter fileWriter=new FileWriter(file2);
        //寫出數據
        fileWriter.write("I am Roy");
        fileWriter.write("hope regain powerful urge to learn");
        //關閉數據流
        fileWriter.close();
        //文件的讀取並輸出到文件中
        //1.創建輸出輸入文件對象
        File src=new File("Day18\\hello.txt");
        File dest=new File("Day18\\copy.txt");
        //2.創建輸入輸出流對象
        FileReader srcRead=new FileReader(src);
        FileWriter destWrite=new FileWriter(dest);
        //3.數據讀出和寫入
        char[] trans=new char[5];
        int size;
        while((size=srcRead.read(trans))!=-1){
             destWrite.write(trans,0,size);
        }
        //4.關閉數據流
        destWrite.close();
        srcRead.close();
        System.out.println("************************");

    }
}

知識點彙總二

1.FileInputStream和FileOutputStream的使用
2.緩衝流的使用:處理字節的BufferedInputStream、BufferedOutputStream,處理字符的BufferedReader、BufferedWriter
其作用是提高讀取和寫入的效率。

public class FileInputOutputTest {
    public static void main(String[] args) {
        //使用字節流處理文本文件可能會亂碼
        FileInputStream fis = null;
        try {
            //創建文件對象
            File file = new File("Day18\\hello.txt");
            //創建字節流
            fis = new FileInputStream(file);
            //讀取數據
            byte[] bytes = new byte[5];
            int size;
            while ((size = fis.read(bytes)) != -1) {
                String s = new String(bytes, 0, size);
                System.out.print(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //關閉數據流
            try {
                if(fis!=null)
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //緩衝流的示例
        BufferedInputStream bis= null;
        BufferedOutputStream bos= null;
        try {
            //創建文件對象
            File firstFile=new File("Day18\\copy.txt");
            File copyFile=new File("Day18\\copies.txt");
            //創建流
            //1.創建字節流
            FileInputStream in=new FileInputStream(firstFile);
            FileOutputStream out=new FileOutputStream(copyFile);
            //2.創建緩衝流
            bis = new BufferedInputStream(in);
            bos = new BufferedOutputStream(out);
            //實現數據的讀取
            byte[] buffer=new byte[10];
            int length;
            while ((length=bis.read(buffer))!=-1){
                bos.write(buffer,0,length);
            }
            System.out.println("copies.txt複製成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        //關閉數據流(只關閉外層則內層會自動關閉)
            if(bis!=null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bos!=null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
    *@ClassName FileInputOutputTest
    *@Description 用字節流實現對文件的複製操作
    *@Param [srcPath, destPath]
    *@Return void
    *@Date 2020/2/9 13:00
    *@Author Roy
    */
    public void copyTest(String srcPath,String destPath){
        FileInputStream srcStream= null;
        FileOutputStream destStream= null;
        try {
            //創建file對象
            File srcFile=new File(srcPath);
            File destFile=new File(destPath);
            //創建字節流
            srcStream = new FileInputStream(srcFile);
            destStream = new FileOutputStream(destFile);
            //讀取字節
            byte[] trans=new byte[1024];
            int size;
            while ((size=srcStream.read(trans))!=-1){
                destStream.write(trans,0,size);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        //關閉數據流
            try {
                if(srcStream!=null)
                srcStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(destStream!=null)
                destStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

知識點彙總三

轉換流的使用
1.轉換流:屬於字符流
InputSteamReader:將一個字節的輸入流轉換爲字符的輸入流。
OutputStreamWriter:將一個字符的輸出流轉換爲字節的輸出流。
作用是字節流和字符流之間的轉換。
代碼示例:

public class transferTest {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("Day18\\hello.txt");
        FileOutputStream fos=new FileOutputStream("Day18\\trans.txt");
        InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
        OutputStreamWriter osw=new OutputStreamWriter(fos,"gbk");
        char[] buf=new char[10];
        int size;
        while((size=isr.read(buf))!=-1){
            osw.write(buf,0,size);
            String str=new String(buf,0,size);
            System.out.print(str);
        }
        isr.close();
        osw.close();
    }
}

其他流的使用示例:

public class filterTest {
    public static void main(String[] args) {
        /*
        * 1.標準的輸入輸出流
        * 1.1 System.in:標準的輸入流默認從鍵盤輸入
        *     System.out:標準的輸出流默認從控制檯輸出
        *1.2System類的setIn/setOut方式重新指定輸入輸入流
        * */
        BufferedReader bfr= null;
        try {
            InputStreamReader  isr=new InputStreamReader(System.in);
            bfr = new BufferedReader(isr);
            while(true){
                System.out.print("請輸入字符串:");
                String data=bfr.readLine();
                if("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)){
                    System.out.println("程序退出");
                    break;
                }
                String upStrings=data.toUpperCase();
                System.out.println(upStrings);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
       if(bfr!=null) {
           try {
               bfr.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
        }
   /*
   *打印流:實現將基本數據類型的數據格式轉化爲字符串輸出
   * PrintStream
   * PrintWriter
   *
   * */
        /*FileOutputStream fos=new FileOutputStream(new File("Day18\\print.txt"));
        PrintStream ps=new PrintStream(fos,true);
        if(ps!=null){//把標準輸出流(控制檯輸出)改成文件
            System.setOut(ps);
        }*/
        /*
        * 數據流:DataInputStream和DataOutputStream
        * 作用是用來讀取和寫出基本數據類型的變量和 字符串
        *
        * */
    }
}

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