欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaIO流基本操作

程序员文章站 2022-07-12 20:58:21
...

1.流的概念

定义:在 Java中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传 输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象 为各种类,方便更直观的进行数据操作。

2.输入输出流

输入 就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中。
输出 则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。

3.字节流、字符流

字节流:数据流中最小的数据单元是字节 。InputStream、OutputStream
字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节 。Reader、Writer

Java中的IO流的体系结构图:
JavaIO流基本操作

4.字节流

4.1 FileInputStream 和 FileOutputStream

FileInputStream从文件系统中的某个文件中获得输入字节。

方法 解释
FileInputStream(File file) 通过打开与实际文件的连接创建一个,该文件由文件系统中的对象命名
FileInputStream(String name) 通过打开与实际文件的连接来创建一个 FileInputStream,该文件由文件系统中的路径名 name 命名。

FileOutputStream用于读取诸如图像数据之类的原始字节流。

方法 解释
FileOutputStream(File file) 创建文件输出流以写入由指定的 File 对象表示的文件。
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件

示例:使用 FileInputStream 和 FileOutputStream 复制图片

public class Test4 {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            try {
                fileInputStream = new FileInputStream("/Users/yangtongchun/Downloads/JavaSe.png");
                fileOutputStream = new FileOutputStream("/Users/yangtongchun/Downloads/ytc.png");
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = fileInputStream.read(bytes)) != -1) {
                    fileOutputStream.write(bytes, 0, len);
                }
            } finally {
                fileInputStream.close();
                fileOutputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.2字节缓冲流 BufferedInputStream 和 BufferedOutputStream

缓冲流的作用

当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低 。文件过大时,操作 起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区 数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高。

方法 解释
BufferedInputStream(InputStream in) 创建一个BufferedInputStream 并保存其参数,输入流,供以后使用
BufferedInputStream(InputStream in, int size) 创建BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流,供以后使用

示例:使用BufferedInputStream 和 BufferedOutputStream 实现文件拷贝

public class Test4 {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            try {
                fileInputStream = new FileInputStream("/Users/yangtongchun/Downloads/JavaSe.png");
                bufferedInputStream = new BufferedInputStream(fileInputStream);
                fileOutputStream = new FileOutputStream("/Users/yangtongchun/Downloads/ytc.png");
                bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = bufferedInputStream.read(bytes)) != -1) {
                    bufferedOutputStream.write(bytes, 0, len);
                }
            } finally {
                bufferedOutputStream.flush();
                fileInputStream.close();
                fileOutputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.字符流

5.1字符流FileReader和FileWriter

※ 如果要从文件中读取内容,可以直接使用 FileReader 子类。
※ FileReader 是用于读取字符流。 要读取原始字节流,请考虑使用 FileInputStream 。

方法 解释
FileReader(File file) 创建一个新的FileReader,给出File读取
FileReader(String fileName) 创建一个新的FileReader,给定要读取的文件的名称

※ 如果是向文件中写入内容,应该使用 FileWriter 子类
※ FileWriter 是用于写入字符流。 要编写原始字节流,请考虑使用 FileOutputStream

方法 解释
FileWriter(File file) 给一个File对象构造一个FileWriter对象。
FileWriter(String fileName) 构造一个给定文件名的FileWriter对象。

示例:使用FileReader 和 FileWriter 复制文件

public class Test4 {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader(new File("/Users/yangtongchun/Downloads/JavaSe.png"));
            FileWriter fileWriter = new FileWriter(new File("/Users/yangtongchun/Downloads/ytc.png"));
            int len = 0;
            while ((len = fileReader.read()) != -1) {
                fileWriter.write(len);
            }
            fileWriter.flush();
            fileReader.close();
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.2字符缓冲流 BufferedReader 和 BufferedWriter

为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader用于加快读取字符的速度,BufferedWriter用于加快写入的速度。

方法 解释
BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流
BufferedReader(Reader in, int sz) 创建使用指定大小的输入缓冲区的缓冲字符输入流

将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。

方法 解释
BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流
BufferedWriter(Writer out, int sz) 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区

示例:使用BufferedReader 和 BufferedWriter 进行文件拷贝

public class Test4 {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("/Users/yangtongchun/Downloads/JavaSe.png");
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            FileWriter fileWriter = new FileWriter("/Users/yangtongchun/Downloads/ytc.png");
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
            String s = null;
            while ((s = bufferedReader.readLine()) != null) {
                bufferedWriter.write(s);
            }
            bufferedReader.close();
            fileReader.close();
            bufferedWriter.close();
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6.字节流与字符流对比

1.字节流操作的基本单位是字节;字符流操作的基本单位是Uncode码元。
2.字节流在操作的时候本身不会用到缓冲区,是与文件本身直接操作的;而字符流在操作的时候使用到缓冲区
3.所有文件的存储都是字节(byte)的存储,在磁盘上保留的是字节
4.在使用字节流操作中,即使没有关闭资源(close方法),也能输出;而字符流不使用close方法的话,不会输出任何内容。

7.字符字节转换流

有时候我们需要进行字节流与字符流二者之间的转换,因为这是两种不同的流,所以,在进行转换的时候我们需要用到 OutputStreamWriter 和 InputStreamReader 。

InputStreamReader 是Reader的子类,将输入的字节流转换成字符流

方法 解释
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader
InputStreamReader(InputStream in,Charset cs) 创建一个使用给定字符集的 InputStreamReader
 public static void test6() {
        //当前 Java 类实际工作目录
        try {
            System.out.println(System.getProperty("user.dir"));
            File f = new File("src/test1.txt");
            System.out.println(f.exists());
            FileInputStream fileInputStream = new FileInputStream(f);
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,
                    StandardCharsets.US_ASCII);
            char[] chars = new char[1024];
            int len = 0;
            while ((len = inputStreamReader.read(chars)) != -1) {
                System.out.println(new String(chars, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

InputStreamWriter 是Writer的子类,将输出的字符流转换成字节流。

方法 解释
OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter
OutputStreamWriter(OutputStream out, Charset cs) 创建一个使用给定字符集的OutputStreamWriter
public class Test4 {
    public static void main(String[] args) {
        try {
            FileInputStream fileInputStream = new FileInputStream("/Users/yangtongchun/Downloads/JavaSe.png");
            FileOutputStream fileOutputStream = new FileOutputStream("/Users/yangtongchun/Downloads/ytc.png");
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = fileInputStream.read(bytes)) != -1) {
                outputStreamWriter.write(len);
            }
            fileInputStream.close();
            outputStreamWriter.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
相关标签: java stream