我的晨讲:IO流-字节流-字符流

本文介绍了Java中的IO流概念,包括字节流和字符流的区别及其常用类和方法。通过实例展示了如何使用InputStream、OutputStream、Reader及Writer进行文件的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO简介

1.流Stream

在学习IO流之前,我们首先需要学习的概念就是Stream流
为了方便理解,我们可以把数据的读写操作抽象成数据在"管道"中流动,但需注意:
1.流只能单方向流动
2.输入流用来读取 → in
3.输出流用来写出 → out
4.数据只能从头到尾顺序的读写一次
所以以程序的角度来思考,In/out 相对于程序而言的输入(读取)/输出(写出)的过程.

在这里插入图片描述

 2.IO流的继承结构

在java中,根据处理的数据单位不同,可以把流分为字节流和字符流
字节流 : 针对二进制文件
字符流 : 针对文本文件
再结合对应类型的输入和输出方向,常用的流有:

File
字节流:针对二进制文件
InputStream
FileInputStream
BufferedInputStream
ObjectInputStream
OutputStream
FileOutputStream
BufferedOutputStream
ObjectOutputStream
字符流:针对文本文件
Reader
FileReader
BufferedReader
InputStreamReader
Writer
FileWriter
BufferedWriter
OutputStreamWriter
PrintWriter一行行写出

3.字节输入流InputStream

此抽象类是表示字节输入流的所有类的超类/抽象类,不可创建对象哦

常用方法:
abstract int read() 从输入流中读取数据的下一个字节
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组,off表示存时的偏移量
void close() 关闭此输入流并释放与该流关联的所有系统资源

4.字节输出流OutputStream

此抽象类是表示输出字节流的所有类的超类.输出流接受输出字节并将这些字节发送到某个接收器.

常用方法:
Void close() 关闭此输出流并释放与此流相关的所有系统资源
Void flush() 刷新此输出流并强制写出所有缓冲的输出字节
Void write(byte[ ] b) 将b.length个字节从指定的byte数组写入此输出流
Void write(byte[ ] b,int off ,int len) 将指定byte数组中从偏移量off开始的len个字节写入输出流
Abstract void write(int b) 将指定的字节写入此输出流

5.字符输入流Reader

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

常用方法:
int read() 读取单个字符
int read(char[] cbuf) 将字符读入数组
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区
abstract void close() 关闭该流并释放与之关联的所有资源

6字符输出流Writer

写入字符流的抽象类

常用方法:
Abstract void close() 关闭此流,但要先刷新它
Void write(char[ ] cbuf) 写入字符数组
Void write(int c) 写入单个字符
Void write(String str) 写入字符串
Void write(String str,int off,int len) 写入字符串的某一部分
Abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分

7.字节流代码展示

package io;

import org.junit.Test;

import java.io.*;

/**
 * 字节输入流InputStream
 * 字节输出流OutPutStream
 */
public class IODemo {
    public static void main(String[] args) throws IOException {
        InputStreamIn();
//        OutPutStreamOut();
    }

    /**
     * 字节输出流
     * 仅限写入
     */
    private static void OutPutStreamOut() throws IOException {
        //创建一个File对象
        File file = new File("E:\\first\\a.txt");
        /*
         * 创建一个字节输入流,不能直接调用OutputStream,因为OutputStream是一个抽象类
         * 所以需要调用他的子类FileOutputStream();括号里面需要传入一个文件的路径也就是File
         * 还有一个选项可写可不写,就是在后面加上一个true,意思就是追加,不写默认就是不追加
         * 但是FileInputStream这个抽象类会抱一个错误也就是:FileNotFoundException找不到文件
         * 这个错误直接抛出就可以,因为还没有学try{}catch(){}
         */
        OutputStream out = new FileOutputStream(file,true);//这句是在文本后面追加
//        OutputStream out = new FileOutputStream(file);//这句是不追加覆盖掉之前写的代码
        /*
         * out.write()方法里面需要传入一个int类型的值
         * 我传入的是97,但是97对应的是Unicode中的a
         * 所以在文本中显示的就是a
         */
        out.write(97);
        out.write(97);
        out.write(97);
        out.write(97);

        out.close();
    }

    /**
     * 字节输入流
     * 仅限读取
     */
    private static void InputStreamIn() throws IOException {
        //创建一个file文件
        File file = new File("E:\\first\\a.txt");
        /*
         * 创建一个字节输入流,不能直接调用InputStream,因为InputStream是一个抽象类
         * 所以需要调用他的子类FileInputStream();括号里面需要传入一个文件的路径也就是File
         * 但是FileInputStream这个抽象类会抱一个错误也就是:FileNotFoundException找不到文件
         * 这个错误直接抛出就可以,因为还没有学try{}catch(){}
         */
        InputStream in = new FileInputStream(file);
        //这边我们定义一个int类型的变量来接收读取的
        int b;
        /*
         * in.read();读取文本中的下一个内容返回值是一个int类型的
         * 当in.read();返回的是-1的时候证明他读完文本中的内容了
         */
        while ((b = in.read()) != -1) {
            //这便需要进行强转一下才能查看文本中的内容
            System.out.print((char) b);
        }

        in.close();
    }
}

8.字符流代码展示

package io;

import java.io.*;

/**
 * 字符输出流Reader
 * 字符输入流Writer
 */
public class RWDemo {
    public static void main(String[] args) throws IOException {
//        ReaderDemo();
        WriterDemo();
    }

    /**
     * 字符输入流
     * 用法和OutputStream同理
     */
    private static void WriterDemo() throws IOException {
        //创建一个file文件
        File file = new File("E:\\first\\a.txt");
        /*
         * 创建一个字符输入流
         * 这边也会报错:FileNotFoundException未找到文件
         * FileWriter()对象也是需要传入参数的第一个是File文件对象
         * 第二个是true,为追加,也可以不写,不写就是覆盖之前的代码
         */
        Writer out = new FileWriter(file,true);
        /*
         * out.write()方法里面需要传入一个int类型的值
         * 我传入的是98,但是98对应的是Unicode中的b
         * 所以在文本中显示的就是b
         */
        out.write(98);
        out.write(98);
        out.write(98);
        out.write(98);

        out.close();
    }

    /**
     * 字符输出流
     * 用法和InputStream同理
     */
    private static void ReaderDemo() throws IOException {
        //创建一个file文件
        File file = new File("E:\\first\\a.txt");
        /*
         * 创建一个字符输出流
         * 这边也会报错:FileNotFoundException未找到文件
         */
        Reader in = new FileReader(file);
        int b;
        //这边也会报错:IOException
        while((b=in.read())!=-1){
            System.out.print((char)b);
        }
        in.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值