Java中IO流(Stream)分类介绍和基础使用

Java中IO流(Stream)分类介绍和基础使用

一、Java流的分类

1. 输入流和输出流
1.1 输入流
数据从各种输入设备(包括文件、键盘等)中流向程序的流。所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类。

1.2输出流
数据从程序流向各种输出设备的流。所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类。


2.字符流和字节流
2.1字符流
Java中的字符流处理的最基本的单元是Unicode码元(大小为2个字节),字符流使用缓冲区。它通常用来处理文本数据,例如文件读取操作等等。

2.2字节流
Java中的字节流处理的最基本单位为1个字节,字节流默认不使用缓冲区。它通常用来处理二进制数据,用于视频,图片读取等等。


3.节点流和处理流
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。
3.1结点流
可以从或向一个特定的地方(节点)读写数据。

3.2处理流
是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。


二、java基本流的使用方法(InputStream、OutputStream 、Reader 、Writer )

我们先来看一下java四个基本流的关系

抽象类 输入流 输出流
字符流 Reader Writer
字节流 InputStream OutputStream

以上四个流都是抽象类的流,然后我们来依次学习一下这四个流的使用方法

1、Reader流
输入流中的基本方法说明:

方法名及返回类型
方法说明
int read() 从输入流中读取一个字符,并把它转换为 0~65535 的整数。如果返回 -1,则表示已经到了输入流的末尾。
int read(char[] cbuf) 从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。 该方法返回读取的字符数,如果返回 -1,则表示已经到了输入流的末尾
int read(char cbuf[], int offset, int length) 从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。offset 指定在字符数组中开始保存数据的起始下标,length指定读取的字符数。该方法返回实际读取的字符数,如果返回 -1,则表示已经到了输入流的末尾

1.1 Reader流之FileReader
FileReader类的构造方法有如下两种重载方式:
1.FileReader(String fileName): fileName 表示要从中读取数据的文件的名称,表示的是一个文件的完整路径,然后在给定这个文件名的情况下创建一个FileReader对象。
2.FileReader(File file):file 表示要从中读取数据的文件,然后在给定要读取数据的文件的情况下创建一个新的 FileReader 对象。

在创建FileReader对象时,可能会触发FileNotFoundException异常,因此可以再方法中用try-catch捕获异常。

我们先来看一下demo1,demo2使用FileReader来读取文件内容

扫描二维码关注公众号,回复: 11481397 查看本文章
 	public void demo1()throws Exception{
        //创建FileReader对象
        FileReader fr=new FileReader("C:\\Users\\lenovo\\Desktop\\ReaderDemo.txt");

        //通过单个字符逐个读取
        int ch=fr.read();
        while(ch!=-1){
            System.out.print((char)ch);
            ch=fr.read();
        }
        System.out.println(" ");

        fr.close();
    }
	public void demo2()throws Exception{
        //创建FileReader对象
        FileReader fr=new FileReader("C:\\Users\\lenovo\\Desktop\\ReaderDemo.txt");

        //通过数组读取文件
        char [] buf = new char[1024];
        int len=0;
        while((len=fr.read(buf))!=-1){
            System.out.print(new String(buf,0,len));
        }
        System.out.println(" ");

        fr.close();
    }

1.2 Reader流之InputStreamReader
InputStreamReader:字节流通向字符流的桥梁,它将字节流转换为字符流.
我们一起来看一下demo3,InputStreamReader是如何将字节流转化为字符流

	public void demo3()throws Exception{
        //创建字节输入流FileInputStream
        FileInputStream fis=new FileInputStream ("C:\\Users\\lenovo\\Desktop\\ReaderDemo.txt");

        //创建字符输入流InputStreamReader,接收参数为字节流对象
        InputStreamReader isr=new InputStreamReader(fis,"utf-8");
        int ch=0;
        while((ch=isr.read()) != -1){
            System.out.print((char)ch);
        }
        System.out.println(" ");
        fis.close();
        isr.close();

    }

1.3 Reader流之BufferedReader
BufferedReader:字符缓冲流,可以先把数据放到一个缓存区里,然后在进行处理。
我们一起来看一下demo4,BufferedReader是如何使用的

 	public void demo4()throws Exception{
        //创建字节输入流FileInputStream
        FileInputStream fis=new FileInputStream ("C:\\Users\\lenovo\\Desktop\\ReaderDemo.txt");

        //创建字符输入流InputStreamReader
        InputStreamReader isr=new InputStreamReader(fis,"utf-8");
        //创建字符缓冲流BufferedReader
        BufferedReader br=new BufferedReader(isr);
        String line;
        while((line=br.readLine())!= null){
            System.out.println(line);
        }
        System.out.println(" ");
        br.close();
        fis.close();
        isr.close();

    }

2、Writer 流
输入流中的基本方法说明:

方法名及返回类型
方法说明
void write(int c) 向输出流中写入一个字符
void write(char[] cbuf) 把cbuf 字符数组中的所有字符写到输出流中
void write(char cbuf[], int off, int len) 把cbuf 指定的字符数组中的若干字符写到输出流中。其中,off 指定字符数组中的起始下标,len 表示元素个数
void write(String str) 向输出流中写入一个字符串
void write(String str, int off, int len) 向输出流中写入一个从off 开始,len个字符个数的字符串
Writer append(CharSequence csq) 将csq指定的字符序列添加到输出流中
Writer append(CharSequence csq, int start, int end) 将参数 csq指定的字符序列的子序列添加到输出流中。其中,start 指定子序列的第一个字符的索引,end 指定子序列中最后一个字符后面的字符的索引,包含start索引,不包含end索引
Writer append(char c) 将参数 c 的字符添加到输出流中
void flush() 刷新输出流,把数据马上写到输出流中

2.1 Writer流之FileWriter
FileWriter:文件字符输出流,该类对象调用write()方法将数据写入流中
FileWriter在写入流时,如果文件不存在,则会自动创建对应的文件
下面看一下demo1,学习一下FileWriter的使用

	public void demo1()throws Exception{
        //创建FileWriter
        FileWriter fw=new FileWriter("C:\\Users\\lenovo\\Desktop\\WriterDemo.txt");
        //调用write()方法
        fw.write("Hellow world");

        char[] arr = {'J','a','v','a'};
        fw.write(arr);

        fw.write(arr,1,2);

        //关闭流
        fw.close();
    }

2.2 Writer流之OutputStreamWriter
OutputStreamWriter:将字节流转换为字符流,是字节流通向字符流的桥梁。
我们一起来看一下demo2,学习一下OutputStreamWriter是如何将字节流转化为字符流

    public void demo2()throws Exception{
        //创建FileOutputStream字节流
        FileOutputStream fos=new FileOutputStream("C:\\Users\\lenovo\\Desktop\\WriterDemo.txt");
        //创建OutputStreamWriter字符输出流,将字节输出流转化为字符输出流
        OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");

        //写入数据
        osw.write("Hellow world");

        //关闭流
        osw.close();
        fos.close();

    }

2.3 Writer流之BufferedWriter
BufferedWriter:字符缓冲流,它利用了缓冲区来提高写的效率
我们一起来看一下demo3,BufferedReader是如何使用的

	public void demo3()throws Exception{
        //创建FileOutputStream字节流
        FileOutputStream fos=new FileOutputStream("C:\\Users\\lenovo\\Desktop\\WriterDemo.txt");
        //创建OutputStreamWriter字符输出流,将字节输出流转化为字符输出流
        OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
        //创建字符缓冲输出流
        BufferedWriter bw=new BufferedWriter(osw);

        //写入数据
        bw.write("Hellow world");
        bw.newLine();
        bw.write("Hellow");

        //关闭流
        bw.close();
        osw.close();
        fos.close();

    }

3、InputStream流

3.1 InputStream流之FileInputStream
FileInputStream:文件字节输入流,它除了可以使用基类定义的函数外,它还实现了基类的read()函数。
下面我们看一下demo1,学习一下FileInputStream的使用

	public void demo1()throws Exception{
        //创建字节输入流FileInputStream
        FileInputStream fis=new FileInputStream ("C:\\Users\\lenovo\\Desktop\\ReaderDemo.txt");

        byte[] bytes=new byte[1024];
        int len;
        while ((len=fis.read(bytes))!=-1)
            System.out.println(new String(bytes,0,len));
		
		fis.close();
    }

3.2 InputStream流之BufferedInputStream
BufferedInputStream :BufferedInputStream已经提前将数据封装到内存中,内存中操作数据要快,所以它的效率要要非缓冲的要高
下面我们看一下demo2,学习一下BufferedInputStream的使用

 	public void demo2()throws Exception{
        //创建字节输入流FileInputStream
        FileInputStream fis=new FileInputStream ("C:\\Users\\lenovo\\Desktop\\ReaderDemo.txt");

        //创建字节输入缓冲流BufferedInputStream
        BufferedInputStream bis=new BufferedInputStream(fis);
        byte[] bytes=new byte[1024];
        int len;
        while ((len=bis.read(bytes))!=-1)
            System.out.println(new String(bytes,0,len));

        bis.close();
        fis.close();
    }

4、OutputStream流

4.1 OutputStream流之FileOutputStream
FileOutputStream:是用于写文件的输出流,它需要一个文件作为实例化参数,如果文件不存在则自动创建
下面我们看一下demo1,学习一下FileOutputStream的使用

 public void demo1()throws Exception{
        //创建字节输出流FileOutputStream
        FileOutputStream fos=new FileOutputStream("C:\\Users\\lenovo\\Desktop\\WriterDemo.txt");
        //写入数据
        fos.write("Hellow world".getBytes());

        //关闭流
        fos.close();
    }

4.2 OutputStream流之BufferedOutputStream
BufferedOutputStream:也是从缓存中操作数据,所以效率非常高
下面我们看一下demo2,学习一下BufferedOutputStream的使用

 	public void demo2()throws Exception{
        //创建字节输出流FileOutputStream
        FileOutputStream fos=new FileOutputStream("C:\\Users\\lenovo\\Desktop\\WriterDemo.txt");

        //创建字节输出缓冲流BufferedOutputStream
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        //写入数据
        bos.write("Hellow world".getBytes());
        
        //关闭流
        bos.close();
        fos.close();
    }

以上就是java中各种流的介绍及使用了,这里基本包含了java常用的所有流,希望大家看了能有收获^_^

猜你喜欢

转载自blog.csdn.net/wrlovesmile/article/details/107523409