字节流、字符流

IO概述

什么是IO

生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑 上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬 盘、外接设备等等。 我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出 output ,即流向内存是输入流,流出内存的输出流。 Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写 出数据。

IO的分类

根据数据的流向分为:输入流和输出流。

  • 输入流 :把数据从 其他设备 上读取到 内存 中的流。
  • 输出流 :把数据从 内存 中写出到 其他设备 上的流。

根据数据的类型分为:字节流和字符流。

  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流。

IO的流向说明图解

输入:硬盘----->内存
输出:内存------>硬盘

顶级父类们

在这里插入图片描述

字节流

字节输出流【OutputStream】

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字 节输出流的基本共性功能方法。

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。

  • public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。

  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量
    off开始输 出到此输出流。

  • public abstract void write(int b) :将指定的字节输出流。

小贴士: close方法,当完成流的操作时,必须调用此方法,释放系统资源。

FileOutputStream类

OutputStream 有很多子类,我们从最简单的一个子类开始。 java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

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

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文 件,会清空这个文件的数据。

写出字节数据
package demo10;

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

public class Demo01OutputStream {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos =new FileOutputStream("D:\\IDEA workspace\\project01\\src\\main\\java\\demo10\\a.txt");// 使用文件名称创建流对象

        fos.write(97);// 写出数据

        fos.close();// 关闭资源

    }
}

字节输入流【InputStream】

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入 流的基本共性功能方法。

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
  • public abstract int read() : 从输入流读取数据的下一个字节。
  • public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

小贴士: close方法,当完成流的操作时,必须调用此方法,释放系统资源。

FileInputStream类

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

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

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出 FileNotFoundException 。

读取字节数据
package demo10;

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

public class Demo02InputStream {

    public static void main(String[] args) throws IOException {

        FileInputStream fis=new FileInputStream("D:\\IDEA workspace\\project01\\src\\main\\java\\demo10\\a.txt");// 使用文件名称创建流对象

        int len=fis.read();// 读取数据,返回一个字节
        System.out.println(len);

        len=fis.read();// 读取到末尾,返回‐1
        System.out.println(len);

        len=fis.read();
        System.out.println(len);

        fis.close();// 关闭资源

    }

}


字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为 一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文 件。

字符输入流【Reader】

java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入 流的基本共性功能方法。

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read() : 从输入流读取一个字符。
  • public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

FileReader类

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
小贴士:

  • 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。 idea中UTF-8
  • 字节缓冲区:一个字节数组,用来临时存储字节数据。
构造方法
  • FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
    当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream 。
读取字符数据
package demo10;

import java.io.FileReader;
import java.io.IOException;

public class Demo03FileReader {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("D:\\IDEA workspace\\project01\\src\\main\\java\\demo10\\a.txt");// 使用文件名称创建流对象

//        int len=0;
//        while((len=fr.read())!=-1){
//            System.out.print((char)len);
//        }

        char cs[]=new char[1024];
        int len=0;
        /*System.out.println(fr.read(cs));
        System.out.println(fr.read(cs));*/

        while((len=fr.read(cs))!=-1){// 循环读取
            System.out.print(new String(cs,0,len));
            System.out.println();
            System.out.println(len);

        }

        fr.close();// 关闭资源
    }
}

字符输出流【Writer】

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节 输出流的基本共性功能方法。

  • void write(int c) 写入单个字符。

  • void write(char[] cbuf) 写入字符数组。

  • abstract void write(char[] cbuf, int off, int len)
    写入字符数组的某一部分,off数组的开始索引,len 写的字符个数。

  • void write(String str) 写入字符串。

  • void write(String str, int off, int len)
    写入字符串的某一部分,off字符串的开始索引,len写的字符个 数。

  • void flush() 刷新该流的缓冲。 void close() 关闭此流,但要先刷新它。

  • void close() 关闭此流,但要先刷新它。

FileWriter类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法
  • FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。

当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值