IO流:常見輸入輸出流:文件輸入輸出流,字符轉換流;複製文件或多級文件夾;

IO流

一.概述及分類

A:IO流概述
	IO流用來處理設備之間的數據傳輸
	Java對數據的操作是通過流的方式
	Java用於操作流的對象都在IO包中 java.io
B:IO流分類
	a:按照數據流向 站在內存角度
		輸入流	讀入數據
		輸出流	寫出數據
	b:按照數據類型
		字節流 可以讀寫任何類型的文件 比如音頻 視頻  文本文件
		字符流 只能讀寫文本文件

二、字節輸入輸出流

InputStream:字節輸入流,輸入流所關聯的文件不存在,則會報錯
OutputStream:字節輸出流,輸出流所關聯的文件不存在,會自動創建
注意:流用完之後必須關閉以釋放資源,否則可能出現內存泄漏

1、文件輸入流(FileInputStream)

常用方法

構造方法:
FileInputStream(File|String file|name);
FileInputStream in=new FileInputStream("e.txt");
in.read();//一次讀取一個字節,如果最後讀取不到,則返回-1
in.read(new byte[1024]);//一次最多讀取1024個字節存進字節數組,返回值爲讀取到的字節長度
in.read(new byte[1024],起始索引,讀取字節長度);//從此輸入流中將最多 len 個字節的數據讀入一個 byte 數組中
in.close();//流用完之後關掉

2、文件輸出流(FileOutputStream)

常用方法

FileOutputStream out=new FileOutputStream(file|name);
//通過文件輸出流,往他所關聯的文件中,寫入數據
out.write(97);//一次寫入一個字節,超過一個字節會丟棄掉多餘字節 //寫入a
out.write(字節數組);//一次寫入一個字節數組
out.write(字節數組,起始索引,寫入字節個數);//一次寫入一個字節數組的一部分
//UTF-8編碼,一個漢字佔三個字節
out.write("\r\n".getBytes());//windows系統換行
FileOutputStream(file|name,true);//參數2爲true,追加寫入
out.close();//關閉流

3、使用文件輸入輸出流進行文件的複製

方式一:一次讀一個字節,寫一個字節(效率低,一般不使用)

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("e.txt");
        FileOutputStream out = new FileOutputStream("ee.txt");
        int len=0;
        while ((len=in.read())!=-1){//讀取字節
            out.write(len);//寫入字節
            out.flush();//刷新
        }
        out.close();//關閉輸出流
        in.close();//關閉輸入流
    }
}

方式二:一次讀寫一個字節數組(效率高)

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyFile {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("e.txt");
        FileOutputStream out = new FileOutputStream("ee.txt");
        byte[] bytes=new byte[1024*1024];//定義緩衝數組
        int len=0;
        long start = System.currentTimeMillis();
        while ((len=in.read(bytes))!=-1){//讀取字節到數組
            out.write(bytes,0,len);//將數組中的字節寫入
            out.flush();//刷新
        }
        long end = System.currentTimeMillis();
        System.out.println((end-start)+"ms");
        in.close();//關閉輸入流
        out.flush();//關閉輸出流
    }
}

4、流的異常處理

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

public class Demo2 {
    public static void main(String[] args) {

        FileInputStream in=null;
        FileOutputStream out=null;
        try {
            File file = new File("e.txt");
            if(file.exists()){
                in = new FileInputStream(file);
            }
            File file1 = new File("ee.txt");
            if(file1.exists()){
                out = new FileOutputStream(file1);
            }
            if(in!=null&&out!=null){
                byte[] bytes=new byte[1024*1024];//定義緩衝數組
                int len=0;
                long start = System.currentTimeMillis();
                while ((len=in.read(bytes))!=-1){//讀取字節到數組
                    out.write(bytes,0,len);//將數組中的字節寫入
                    out.flush();//刷新
                }
                long end = System.currentTimeMillis();
                System.out.println((end-start)+"ms");
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if (in != null) {
                    in.close();//關閉輸入流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (out != null) {
                    out.flush();//關閉輸出流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

5、高效(通過內部緩衝區實現)的文件輸入輸出流

BufferedInputStream:高效的文件輸入流
BufferedInputStream(InputStream in):
          創建一個 BufferedInputStream 並保存其參數,即輸入流 in,以便將來使用。
BufferedInputStream(InputStream in, int size) 
          創建具有指定緩衝區大小的 BufferedInputStream 並保存其參數,即輸入流 in,以便將來使用。
BufferedOutputStream:高效的文件輸出流
BufferedOutputStream(OutputStream out) 
          創建一個新的緩衝輸出流,以將數據寫入指定的底層輸出流。
BufferedOutputStream(OutputStream out, int size) 
          創建一個新的緩衝輸出流,以將具有指定緩衝區大小的數據寫入指定的底層輸出流。

複製文件方式三 :使用高效的文件輸入輸出流

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        BufferedInputStream bufferIn = new BufferedInputStream(new FileInputStream("a.txt"));
        BufferedOutputStream bufferOut = new BufferedOutputStream(new FileOutputStream("aa.txt"));
        int len;
        byte[] bytes=new byte[1024*8];
        while ((len=bufferIn.read(bytes))!=-1){
            bufferOut.write(bytes,0,len);
            bufferOut.flush();
        }
        bufferIn.close();
        bufferOut.close();
    }
}

三、字符輸入輸出流

Reader:用於讀取字符流的抽象類
Writer:寫入字符流的抽象類
編碼:把字符串轉成字節數組,採用默認的碼錶進行編碼,也可指定碼錶
解碼:把字節數組轉換成字符串,採用默認的碼錶進行解碼,也可指定碼錶
注意:a、編解碼使用碼錶要一致,否則會出現亂碼
	 b、寫入數據後必須刷新,否則數據寫不過去

1、InputStreamReader(字符轉換輸入流)

//字節流通向字符流的橋樑,可使用指定的碼錶解碼
InputStreamReader in=new InputStreamReader(new FileInputStream("a.txt"));//
in.read();//一次讀取一個字符,讀取不到返回-1
in.read(new char[1024]);//一次最多讀1024個字符(一個字符數組)存進字節數組,返回值是實際讀取到的字符個數
in.read(new char[1024],0,3);//將字符讀入數組中的某一部分,返回值是實際讀取到的字符個數

2、OutputStreamWriter(字符轉換輸出流)

//字符流通向字節流的橋樑,可使用指定的碼錶編碼
OutputStreamWriter out=new OutputStreamWriter(new FileOutputStream("aa.txt",true));//加true追加
out.write('你');//一次寫一個字符
out.write("你好");//一次寫一個字符串
out.write("你好",0,1);//一次寫一個字符串的一部分
out.write(new byte[]{'a','你','好'});//一次寫一個字符數組
out.write(new byte[]{'a','你','好'},1,2);//一次寫一個字符數組的一部分
out.close();//釋放資源

3、FileWriter和FileReader

FileWriter和FileReader和InputStreamReader和OutputStreamWriter區別:
FileWriter和FileReader不可指定編碼表編碼。

4、高效字符流(緩衝區)

BufferedReader bin=new BufferedReader(new FileReader("a.txt"));
bin.readLine();//一次讀一行
BufferedWriter bout=new BufferedWriter(new FileWriter("aa.txt"));
bout.newLine();//寫一個換行符

5、複製文本文件

方式一:讀一個字符數組,寫一個字符數組

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        InputStreamReader in = new InputStreamReader(new FileInputStream("a.txt"));
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("aaa.doc"));
        char[] chars = new char[1000];
        int len=0;
        while ((len=in.read(chars))!=-1){
            out.write(chars,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
}

方式二:讀一行寫一行

import java.io.*;

public class MyTest2 {
    public static void main(String[] args) throws IOException {
        BufferedReader bin = new BufferedReader(new FileReader("MyTest1.java"));
        BufferedWriter bout = new BufferedWriter(new FileWriter("Test.java"));
        String line=null;
        char[] chars = new char[1000];//充當緩衝區
        while ((line=bin.readLine())!=null){
            bout.write(line);
            bout.newLine();//換行
            bout.flush();//必須刷新
        }
        //關閉流,釋放資源
        bin.close();
        bout.close();
    }
}

6、第二種鍵盤錄入方式

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test{
    public static void main(String[] args) throws IOException {
        //Scanner scanner = new Scanner(System.in);//第一種
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("請輸入數據");
        String s = reader.readLine();
        System.out.println(s);
    }
}

四、例題

1、將多級文件夾複製到指定目錄下

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

public class CopyFolder {
    public static void main(String[] args)throws IOException {
        File sourceFile = new File("C:\\Users\\Administrator\\Desktop\\新建文件夾");
        File copyFile = new File("D:\\");
        CopyMultistageFile(sourceFile,copyFile);
    }

    private static void CopyMultistageFile(File sourceFile, File copyFile) throws IOException {
        File file = new File(copyFile, sourceFile.getName());
        if(sourceFile.isFile()){
            copyFile(sourceFile, file);
            return;
        }
        if(!file.exists()){
            file.mkdir();
        }
        File[] files = sourceFile.listFiles();
        for (File f : files) {
            if(f.isFile()){
                File file1 = new File(file, f.getName());
                copyFile(f, file1);
            }else {
                CopyMultistageFile(f,file);
            }
        }
    }

    private static void copyFile(File f, File f1) throws IOException {
        FileInputStream in = new FileInputStream(f);
        FileOutputStream out = new FileOutputStream(f1);
        int len;
        byte[] bytes=new byte[1024*1024];
        while ((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
}

2、複製多級文件夾只保留其中的.txt文件並將其修改爲.doc文件

import java.io.*;

public class CopyModify {
    public static void main(String[] args) throws IOException {
        File sourceFolder = new File("C:\\Users\\Administrator\\Desktop\\新建文件夾");
        File targetPath = new File("D:\\");
        copyModifyTheSuffixName(sourceFolder,targetPath);
    }

    private static void copyModifyTheSuffixName(File sourceFolder, File targetPath) throws IOException {
        File file = new File(targetPath, sourceFolder.getName()+"(doc)");
        if(!file.exists()){
            file.mkdir();
        }
        File[] files = sourceFolder.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                if(name.endsWith(".txt")||new File(dir,name).isDirectory()){
                    return true;
                }
                return false;
            }
        });
        for (File f : files) {
            if(f.isFile()){
                copy(f,file);
            }else {
                copyModifyTheSuffixName(f,file);
            }
        }
    }

    private static void copy(File f, File f2) throws IOException {
        FileInputStream in = new FileInputStream(f);
        File file = new File(f2, f.getName().replace(".txt", ".doc"));
        FileOutputStream out = new FileOutputStream(file);
        int len=0;
        byte[] bytes = new byte[1024 * 8];
        while ((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
}

3、合併文件:將兩首歌合併爲一首

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

public class MyDemo1 {
    public static void main(String[] args) throws IOException {
        FileInputStream in1 = new FileInputStream("許巍 - 曾經的你.mp3");
        FileInputStream in2 = new FileInputStream("許巍 - 藍蓮花.mp3");
        FileOutputStream out = new FileOutputStream("許巍大合唱.mp3");
        ArrayList<FileInputStream> list = new ArrayList<>();
        list.add(in1);
        list.add(in2);
        int len=0;
        byte[] bytes = new byte[1024 * 1024];
        for (FileInputStream in : list) {
            while ((len= in.read(bytes))!=-1){
                out.write(bytes,0,len);
                out.flush();
            }
            in.close();
        }
        out.close();
    }
}
發佈了55 篇原創文章 · 獲贊 31 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章