带你快速学习JavaIO流

学习过程:先分清IO流的分类,在从最简单的类开始,然后比较每个类的优点,记得手敲一遍

一、Java的IO流分类:

  • 按照数据流向
    输入流 : 读数据
    输出流 : 写数据
  • 按照数据类型
    字节流: 字节输入流、字节输出流
    字符流:字符输入流、字符输出流
    如下图:
    在这里插入图片描述

一般情况,我们都是按照 IO 流的分类是按照数据类型来说的,windows自带的记事本打开后,我们可以读懂的使用字符流,否则使用字节流,不知道使用什么的时候就直接使用字节流 😮

输入流的超类:  InputStream
输出流的超类:   OutputStream

字节流可以处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据


😮 😮 😮到这里,你应该记住字节流字符流是如何区分。看下图:
在这里插入图片描述

二、Java中的 字节流

InputStream 字节输入流的所有类的超类
OutputStream 字节输出流的所有类的超类
两个类都为抽象类,子类都是以父类类名为后缀

(当你知道这个类的超类规范的时候,学习其中一个子类,对比其它子类解决的问题就好了 )

字节输出流 FileOutputStream 为例详解点击链接查看

构造函数初始化:

FileInputStream(String name) 
通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
  • FileOutputStream三种写入文件方式:


public class FileOutputStreamDemo01 {
    public static void main(String[] args) throws IOException {
        //创建文件输入流 指定写入文件:
       // FileOutputStream fos=new FileOutputStream(new File("D:\\桌面\\毕业\\基本信息.txt"));
        FileOutputStream fos=new FileOutputStream("D:\\桌面\\毕业\\基本信息.txt");

        /**
         * 方式一:将指定字节写入文件
         */
        fos.write(97);
        fos.write(98);
        fos.write(99);

        /**
         * 方式二:将指定字节数组写入此文件
         */
        byte[] by={'H','E','L','L','O'};
        fos.write(by);

        /**
         * 方式三:指定片段写入
         */
        //最后一定记得关闭,释放资源
        fos.write(by,1,2);
        fos.close();
    }
}

运行结果:
在这里插入图片描述

相对于文件来说,这里叫写入,所以是写入文件!相对于内存条,是输出,也就是上面说的字节输出流
接下来了解字节输入流

与之对应的:
字节输入流 FileInputStream详解点击链接)学习直接看里面的样例代码,了解构造函数就好了

为了提高速度,所以有了子类的子类 BufferedInputStream ,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(与之对应的BufferedOutputStream)

还有几个子类可以参照 JavaAPI 查看类的详情


😮 😮 😮 到这里 你应该掌握了字节流中最基本的读写数据
三个代码样例可以学习一下增加印象:复制文本、复制图片、复制视频


三、Java 中的 字符流

Reader 用于读取字符流的抽象类。

子类必须实现的唯一方法是read(char []intint)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。 

Writer 用于写入字符流的抽 象类。

子类必须实现的唯一方法是write(char []intint),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。 

解读:这里的 Reader 是内存读取了硬盘文件中的字符所以是读取字符流,Writer 从内存中向硬盘文件中写入字符


字符输入流以OutputStreamReader为例:

构造函数初始化:

OutputStreamWriter(OutputStream out) 
创建一个使用默认字符编码的OutputStreamWriter。 

五中写数据方式:(提醒:往硬盘文件写数据)

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class OutputStreamWriteDemo {
    public static void main(String[] args)throws Exception {
        //OutputStreamWriter(OutputStream out)创建一个使用默认字符编码的OutputStreamWriter
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\桌面\\基本信息.txt"));
        //写入单个字符
        osw.write(97);
        osw.flush();    //刷新流
        //写入字符数组
        char [] chars={'a','b','c','d'};
        osw.write(chars);
        osw.flush();
        //字符数组写入一部分
        osw.write(chars,1,3);
        osw.flush();
        //写入字符串
        osw.write(new String(chars));
        osw.flush();
        //写入字符串的一部分
        osw.write(new String(chars),1,3);
        osw.flush();
        osw.close();
        //close关闭时会先刷新流再关闭;
    }
}

与之相对的 InputStreamReader 字符流读数据

InputStreamReader(InputStream in) 
创建一个使用默认字符集的InputStreamReader。 

两种读数据方式:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderDemo02 {
    public static void main(String[] args)throws IOException {
        InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\桌面\\基本信息.txt"));
        //一次读取一个字符
//        int ch;
//        while((ch=isr.read())!=-1){
//            System.out.print((char)ch);
//        }
//        isr.close();
        //一次读取一个字符数组
        char[] chars=new char[1024];
        int len;
        while ((len=isr.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
    }
}

😮 😮 😮 相对于上面的 InputStreamReaderOutputStreamWriter 太长,容易拼错,所以可以使用他们的子类 FileReaderFileWriter

FileReader类

FileReader(File file) 
创建一个新的 FileReader ,给出 File读取。 

FileWriter 类

FileWriter(File file) 
给一个File对象构造一个FileWriter对象。 

使用FileReader、FileWriter 代替InputStreamReader、OutputStreamWriter方便我们写代码,但是如果需要解决字符流中的编码问题,还是需要使用OutputStreamWriter、InputStreamReader中的方法

为了提高字符流的读写速度,可以使用字符缓冲流
BufferedReaderBufferedWriter

具体方法的使用可以查看API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr小布懂

谢谢那么帅还对我这么好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值