《Java基础知识》Java IO流详解

Java IO概念

1. 用于设备之间的数据传输。

2. Java 将操作数据流的功能封装到了IO包中。

3. 数据流流向分:输入流和输出流,操作对象为文件。

4. 流按照操作数据分:字节流(通用)和字符流。

5. 将计算机语言:二进制数据转换成文件显示到电脑上。

 

IO包:继承关系图:

 

字符流:

Reader :读取字符流,方法见API。

Writer :写入字符流,方法见API。

案例(Writer ):

import java.io.*;

public class var {
    public static void main(String[] agrs){
        Writer writer = null;
        try{
            writer = new FileWriter("Demo.txt");
// writer = new FileWriter("Demo.txt",true); 文件续写功能,否则会覆盖。 writer.write(
"今天天气真好!"); writer.flush(); } catch (IOException e) { e.printStackTrace(); }finally { if(writer != null){ try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

运行结果:

 

案例(Reader):

文件数据:

import java.io.*;

public class var {
    public static void main(String[] agrs){
        Reader reader = null;
        try{
            reader = new FileReader("Demo.txt"); 
            char[] arr = new char[5];
            int red = reader.read(arr); //red是装到数组的长度。
            while(red != -1 ){
                System.out.println(new String(arr,0,red));
                red = reader.read(arr);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

 

实现一个完整的文件复制。

import java.io.*;

public class var {
    public static void main(String[] agrs){
        Reader reader = null;
        Writer writer = null;
        try{
            reader = new FileReader("Demo.txt");
            writer = new FileWriter("Dome1.txt"); //
            char[] arr = new char[5];
            int red = 0; //red是装到数组的长度。
            while((red = reader.read(arr)) != -1 ){
                writer.write(new String(arr,0,red));
                writer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

 

优化文件复制案例(缓冲流):

import java.io.*;

public class var {
    public static void main(String[] agrs){
        BufferedReader bufferedReader = null; //缓冲读取流
        BufferedWriter bufferedWriter = null; //缓冲写入流
        try{
            bufferedReader = new BufferedReader(new FileReader("Demo.txt"));
            bufferedWriter = new BufferedWriter(new FileWriter("Dome2.txt"));
            String str ;
            while((str = bufferedReader.readLine()) != null ){
                bufferedWriter.write(str);
                bufferedWriter.newLine();   //换行。
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bufferedReader != null){
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bufferedWriter != null){
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

 

上述IO无法处理视频,图片等一些文件,拷贝出来的文件也无法打开,由此我们引出字节流。

字节流:

OutputSteam:写入字节流,方法见API。

InputSteam: 读取字节流,方法见API。

案例(OutputSteam):

public class var {
    public static void main(String[] agrs){
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream("demo.txt");
            fileOutputStream.write("今天天气真好,我们去玩吧!".getBytes());
            //不需要刷新。
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fileOutputStream != null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

 

 案例(InputSteam):

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class PublicTest {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream("demo.txt");
            int ch =0;
            byte[] arr = new byte[fileInputStream.available()];  //正式写代码不要使用fileInputStream.available(),因为文件比较大的时候内存会不够用。
            while((ch = fileInputStream.read(arr)) != -1){
                System.out.println(new String(arr,0,ch));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

案例:复制一个视频文件

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

public class PublicTest {
    public static void main(String[] args) {
        FileOutputStream fileOutputStream = null;
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream("video.avi");
            fileOutputStream = new FileOutputStream("video1.avi");
            int ch =0;
            byte[] arr = new byte[fileInputStream.available()];  //正式写代码不要使用fileInputStream.available(),因为文件比较大的时候内存会不够用。
            while((ch = fileInputStream.read(arr)) != -1){
                fileOutputStream.write(arr);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fileOutputStream != null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

 

转换流(键盘输入和控制台输出作为案例):

import java.io.*;

public class var {
    public static void main(String[] agrs){
        OutputStream out = System.out;  //控制台打印
        OutputStreamWriter outputStreamWriter = null;
        outputStreamWriter = new OutputStreamWriter(out);  // outputStreamWriter = new OutputStreamWriter(out,"GBK");  可以指定写的编码
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

        InputStream in = System.in;   //键盘输入流。
        InputStreamReader inputStreamReader = new InputStreamReader(in); // InputStreamReader inputStreamReader = new InputStreamReader(in,"BGK"); 同样可以指定编码
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        try {
            String line = null;
            while((line = bufferedReader.readLine()) != null){
                if("exit".equals(line)){
                    break;
                }
                bufferedWriter.write(line);
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bufferedWriter != null){
                    bufferedWriter.close();
                }
                if(bufferedReader != null){
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

IO流先讲到这里,Java IO流还有很多有意思的类和方法见API。

参考:https://www.cnblogs.com/runningTurtle/p/7088125.html

 
posted @ 2019-09-10 23:11  加速丨世界  阅读(1946)  评论(0编辑  收藏  举报