JavaSE笔记15.4-IO流-字节流

本文深入讲解Java中的IO流概念,包括OutputStream和InputStream的常见子类及使用方法,如FileOutputStream、BufferedOutputStream、FileInputStream和BufferedInputStream。通过具体示例,阐述了如何创建、使用这些流对象进行文件读写操作。

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

一. OutputStream

OutputStream类是所有字节输出流的父类,是一个抽象类,不能直接通过new进行实例化,可通过实例化子类创建对象。

1. OutputStream的常见子类

  • ByteArrayOutputStream:字节数组输出流,用于向内存缓冲区的字节数组中写数据,缓冲区会随着数据的不断写入而自动增长
  • FileOutputStream:文件字节输出流,用于将字节写入到指定的打开的文件中
  • ObjectOutputStream :对象输出流,它和ObjectInputStream一起对基本数据或者对象做持久存储
  • PipedOutputStream:管道字节输出流,和PipedInputStream一起使用,能实现多线程间的管道通信
  • BufferedOutputStream:缓冲字节输出流,为其他字节输出流提供写缓冲区
  • DataOutputStream:数据输出流,用来装饰其他的输出流,用于操作基本数据类型
  • PrintStream:字节打印流,用来装饰其他输出流,为其他输出流添加功能,方便的打印各种数据值

2. OutputStream的常用方法

//写入一个字符
//要写入的字节包含在给定整数值的8个低位中,24个高位被忽略
abstract void write(int b)throws IOException
//写入一个字节数组
void write(byte[] b)throws IOException
//写入一个字节数组的若干字节,off 指定字节数组中的起始下标,len 表示元素个数
void write(byte[] b,int off,int len)throws IOException

//为了提高效率,在写数据时,数据一般会先保存到内存缓冲区中,只有当缓冲区中的数据达到一定程度时,缓冲区中的数据才会被写入预期目的地
//使用 flush() 方法则可以强制将缓冲区中的数据写入预期目的地
void flush()throws IOException
//关闭输出流,并且在关闭之前会先将缓冲区中的数据刷新到预期目的地
void close()throws IOException

3. FileOutputStream

(1)概述
  • FileOutputStream是文件字节输出流,用于将字节写入到指定的打开的文件中,FileOutputStream的创建不依赖于文件存在与否
  • 文件字节输出流内部无缓冲区,不需要刷新动作
(2)构造方法
//在指定 File 对象的情况下构造一个 FileOutputStream 对象,file 表示要写入数据的 File 对象
FileOutputStream(File file)throws IOException
//在指定 File 对象的情况下构造一个 FileOutputStream 对象,如果 append 的值为 true,则将字节写入文件末尾,而不是写入文件开始处
FileOutputStream(File file,boolean append)throws IOException
//在指定文件名的情况下构造一个 FileOutputStream 对象,name 表示要写入字节的文件名,表示的是完整路径
FileOutputStream(String name)throws IOException
//在指定文件名的情况下构造一个 FileOutputStream 对象,如果 append 的值为 true,则将字节写入文件末尾,而不是写入文件开始处
FileOutputStream(String name,boolean append)throws IOException

FileOutputStream的创建不依赖于文件存在与否:

  • 如果目标文件不存在,则会自动创建目标文件
  • 如果目标文件已存在,默认情况会先清空文件中的数据,然后再写入数据;如果需要在原来的基础上追加数据,需要使用构造方法FileOutputStream(File,boolean)并将第2个参数设为true
(3)使用FileOutputStream的步骤

创建输出流对象–进行写操作–关闭输出流通道

(4)使用FileOutputStream的例子
import java.io.*;
public class FileOutputStreamDemo {
    public static void main(String[] args) {
        FileOutputStream fos=null;
        try{
            //1. 创建输出流对象,与目标文件相关联
            fos=new FileOutputStream("fos.txt",true);
            //2. 进行写操作,写入一个字节数组
            fos.write("abcde".getBytes());
            fos.write("ABCDE".getBytes());
            //文件字节输出流内部无缓冲区,不需要刷新动作
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                //3. 关闭资源
                if(fos!=null)
                    fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4. BufferedOutputStream

(1)概述
  • BufferedOutputStream是缓冲字节输出流,它的作用是为其他字节输出流添加缓冲功能。可以先将一批数据写入缓冲区,当缓冲区满了以后,再将缓冲区的数据一次性写到字节输出流,可提高对数据的写效率
  • BufferedOutputStream要结合流才可以使用
(2)构造方法
//创建一个BufferedOutputStream对象来修饰参数out指定的字节输出流
BufferedOutputStream(OutputStream out)throws IOException
//创建一个BufferedOutputStream对象来修饰参数out指定的字节输出流,参数sz用于指定缓冲区的大小
BufferedOutputStream(OutputStream out,int sz)throws IOException
(3)使用BufferedOutputStream的步骤

创建底层字节输出流对象–创建缓冲字节输出流对象–写数据到缓冲区中–关闭资源

二. InputStream

InputStream类是所有字节输入流的父类,是一个抽象类,不能直接通过new进行实例化,可通过实例化子类创建对象。

1. InputStream的常见子类

  • ByteArrayInputStream:字节数组输入流,将内存缓冲区中的字节数组转换为字节输入流,从中读取字节
  • FileInputStream 类:文件字节输入流,从文件中读取数据
  • ObjectInputStream:对象输入流,它和ObjectOutputStream一起对基本数据或者对象做持久存储
  • PipedInputStream:管道字节输入流,和PipedOutputStream一起使用,能实现多线程间的管道通信
  • BufferedInputStream:缓冲字节输入流,为其他字节输入流提供读缓冲区
  • DataInputStream:数据输入流,用于操作基本数据类型

2. InputStream的常用方法

//从输入流中读取一个 8 位的字节,并把它转换为 0~255 的整数,如果返回 -1,则表示已经到了输入流的末尾
abstract int read()throws IOException
//从输入流中读取若干字节,并把它们保存到参数 b 指定的字节数组中,并返回读取的字节数
//如果返回 -1,则表示已经到了输入流的末尾
int read(byte[] b)throws IOException
//从输入流中读取若干字节,并把它们保存到参数 b 指定的字节数组中,off 指定在字节数组中开始保存数据的起始下标,len 指定读取的字节数
//该方法返回实际读取的字节数
//如果返回 -1,则表示已经到了输入流的末尾
int read(byte[] b,int off,int len)throws IOException

//返回可以从输入流中读取的字节数
int available()throws IOException
//关闭该流并释放与之关联的所有资源
void close()throws IOException

3. FileInputStream

(1)概述
  • FileInputStream以字节为单位读取文本文件
  • FileInputStream对象关联的文件要保证存在,否则会发生FileNotFoundException异常
(2)构造方法
//在给定要读取数据的文件的情况下创建一个新的FileInputStream对象,file表示要从中读取数据的文件
FileInputStream(File file) throws FileNotFoundException
//在给定要读取数据的文件名的情况下创建一个新的FileReader对象,fileName表示要从中读取数据的文件的名称,表示的是一个文件的完整路径
FileInputStream(String fileName) throws FileNotFoundException
(3)使用FileInputStream的步骤

创建输入流对象–进行读操作–关闭输入流通道

(4)使用FileInputStream的例子
import java.io.*;
public class FileInputStreamDemo {
    public static void main(String[] args) {
        try{
            //一次读取一个字节
            fileRead_1();
            //一次读取一个字节数组
            fileRead_2();

        } catch (IOException e) {
            throw new RuntimeException("读取文件失败");
        }

    }
    //一次读取一个字节数组,数组大小由available()获取
    public static void fileRead_2() throws IOException {
        //1. 创建输入流对象,与目标文件相关联
        FileInputStream fis=new FileInputStream("fos.txt");
        //2. 进行读操作,一次读取一个字节数组,数组大小由available()获取
        byte[] buf=new byte[fis.available()];
        int len=0;
        while ((len=fis.read(buf))!=-1){
            System.out.println(new String(buf,0,len));
        }
        //3. 关闭资源
        fis.close();
    }

    //一次读取一个字节
    public static void fileRead_1() throws IOException {
        //1. 创建输入流对象,与目标文件相关联
        FileInputStream fis=new FileInputStream("fos.txt");
        //2. 进行读操作,一次读取一个字节
        int ch=0;
        while ((ch=fis.read())!=-1){
            System.out.println((char)ch);
        }
        //3. 关闭资源
        fis.close();
    }
}

4. BufferedInputStream

(1)概述
  • BufferedInputStream是缓冲字节输入流,它的作用是为其他字节输入流添加缓冲功能。可以先将一批数据读到缓冲区,当缓冲区满了以后,再将缓冲区的数据一次性读到字节输入流,可提高对数据的读效率
  • BufferedInputStream要结合流才可以使用
(2)构造方法
//创建一个BufferedInputStream对象来修饰参数in指定的字节输入流
BufferedInputStream(InputStream in)
//创建一个BufferedInputStream对象来修饰参数in指定的字节输入流,参数sz用于指定缓冲区的大小
BufferedInputStream(InputStream in,int sz)
(3)使用BufferedInputStream的步骤

创建底层字节输入流对象–创建缓冲字节输入流对象–读数据到缓冲区中–关闭资源

(4)使用BufferedInputStream的例子

演示MP4的复制,通过缓冲区

import java.io.*;
public class BufferedStreamDemo {
    public static void main(String[] args) {
        try{
            copy_1();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void copy_1() throws IOException {
        //创建缓冲字节输入流对象
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("1.mp4"));
        //创建缓冲字节输出流对象
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("2.mp4"));

        byte[] buf=new byte[1024];
        int len=0;
        //读取数据
        while ((len=bis.read(buf))!=-1){
            //写入数据
            bos.write(buf,0,len);
        }

        //关闭资源
        bis.close();
        bos.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值