JAVA I/O流

JAVA I/O流

I/O流概述

I/O流(Input/Output)流,即输入输出流,是Java中实现输入输出的基础,他可以方便地实现数据的输入输出操作。

I/O流可以简单分为三类

  • 字节流和字符流

    根据流操作的数据单位的不同,可以分为字节流和字符流。字节流以字节为单位进行数据的读写,每次读写一个或多个字节数据;字符流以字符为单位进行数据的读写,每次读写一个或者多个字符数据。

    字符流只能够处理纯文本(中文)数据,其他类型数据不行,但是字符流处理文本要比字节流处理文本要方便。

  • 输入流和输出流

    根据流传输方向的不同,又可分为输入流和输出流。其中输入流只能从流中读取数据,而不能向其写入数据;输出流只能向流中写入数据,而不能从中读取数据。

  • 节点流和处理流

    根据流的功能不同,可以分为节点流和处理流。其中节点流也被称为低级流,是指可以从一个特定的I/O设备(如磁盘)读写数据的流,它只能直接连接数据源,进行数据的读写操作;处理流也被称为高级流,它用于对一个已存在的节点流进行连接和封装,通过封装后的流来实现流的读写能力。当使用处理流时,程序不会直接连接到实际的数据源,而是连接在已存在的流之上。

buy

字节流

字节流:I/O流针对字节的输入输出提供的一系列流,分为字节输入流和字节输出流。

  • inputStream:表示字节输入流所有类的超类
  • OutputStream:表示输出流所有类的超类
  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

FileInputStream和FileOutputStream

  • FileInputStream是InputStream的子类,他是操作文件的字节输入流,专门用于读取文件中的数据
  • FileOutputStream是OutputStream的子类,他是操作文件的字节输出流,专门用于写入文件中的数据
  • FileOutputStream向一个已经存在的文件中写入数据,那么该文件中的数据首先会被清空,再写入新的数据
方法声明 功能描述
InputStream
read() 从输入流中读取默认8字节,返回表示该字节的整数,当没有字节时返回-1
close() 关闭此输入流并释放与该流关联的所有系统资源
OutputStream
write() 向输出流写入默认1字节
flush() 刷新此输出流并强制写出所有缓冲的输出字节
close() 关闭此输入出流并释放与该流关联的所有系统资源

读写文件

package top.dty.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class FilePutStream01 {
   
    public static void main(String[] args) throws IOException {
   
        //创建一个文件字节输入流来读取文件
        FileInputStream fileInputStream = new FileInputStream("test.txt");
        //定义一个int类型的变量b
        int b = 0;
        //通过循环读取文件,当返回值为-1结束循环
        while ((b = fileInputStream.read())!= -1){
   
            System.out.println(b);
        }
        //I/O占用系统资源,使用完毕后要及时关闭
        //关闭流
        fileInputStream.close();

        //FileOutputStream向一个已经存在的文件中写入数据,那么该文件中的数据首先会被清空,再写入新的数据
        //创建文件输出流对象,并指定输出文件名称
        FileOutputStream fileOutputStream = new FileOutputStream("out.txt");
        //定义一个字符串
        String str = "hello";
        //将字符串转换为字节流数组进行写入
        fileOutputStream.write(str.getBytes(StandardCharsets.UTF_8));
        //关闭流
        fileInputStream.close();

        //append参数默认为false,控制文件写入是否覆盖,不覆盖为true
        FileOutputStream fileOutputStream1 = new FileOutputStream("out.txt",true);
        //定义一个字符串
        String str1 = " word";
        //将字符串转换为字节数组进行写入操作
        fileOutputStream1.write(str1.getBytes(StandardCharsets.UTF_8));
        //I/O遇到异常close()方法将无法执行
        //为了保证I/O流的方法一定执行一般把关闭流放在finally代码块中
        try {
   
            if(fileOutputStream1 != null)
                fileOutputStream1.close();
        }catch (Exception e){
   
            e.printStackTrace();
        }


    }
}

文件拷贝

package top.dty.io;

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

public class FilePutStream02 {
   
    public static void main(String[] args) throws IOException {
   
        //创建文件输入流对象读取指定目录写的文件
        FileInputStream in = new FileInputStream("C:\\Users\\段通瑶\\Desktop\\截图\\java.jpg");
        //创建文件输出流对象将读取到的文件内容写入到指定目录的文件中
        FileOutputStream out = new FileOutputStream("C:\\Users\\段通瑶\\Desktop\\截图\\666.jpg");
        //定义一个int类型的变量 len
        int len = 0;
        //获取拷贝文件前的系统时间
        long beginTime = System.currentTimeMillis();
        //通过循环将读取到的文件字节信息写入到新文件
        while ((len = in.read()) != -1){
   
            out.write(len);
        }
        //获取拷贝文件花费时间
        long endTime = System.currentTimeMillis();
        //输出拷贝文件的时间
        System.out.println((endTime-beginTime)+"ms");
        //关闭流
        in.close();
        out.close();
    }
}

字节流缓冲区

  • 一个字节地读取,需要频繁地操作文件,这种效率非常低
  • 为了提供传输效率,可以定义一个字节数组作为缓冲区
  • 一次性读取多个字节的数据,将数据先保存在字节数组中,然后将字节数组中的数据一次性写入到新的文件中
package top.dty.io;

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

public class FilePutStream03 {
   
    public static void main(String[] args) throws IOException {
   
        //创建文件输入流对象读取指定目录写的文件
        FileInputStream in = new FileInputStream("C:\\Users\\段通瑶\\Desktop\\截图\\java.jpg");
        //创建文件输出流对象将读取到的文件内容写入到指定目录的文件中
        FileOutputStream out = new FileOutputStream("C:\\Users\\段通瑶\\Desktop\\截图\\666.jpg");
        //定义一个int类型的变量 len
        int len = 0;
        //定义一个长度为1024的字节数组
        byte[] buff = new byte[1024];
        //获取拷贝文件前的系统时间
        long beginTime = System.currentTimeMillis();
        //通过循环将读取到的文件字节信息写入到新文件
        while ((len = in.read(buff)) != -1){
   
            out.write(buff,0,len);
        }
        //获取拷贝文件花费时间
        long endTime = System.currentTimeMillis();
        //输出拷贝文件的时间
        System.out.println((endTime-beginTime)+"ms");
        //关闭流
        in.close();
        out.close();
    }
}

字节缓存流(bufferedInputStream和bufferedOutputStream)

  • BufferInputStream:创建一个内部缓冲区数组,当从内读取和跳过字节时,内部缓冲区根据需要从包含的输入流重新填充,一次多个字节
  • BufferOutputStream:缓冲输出流。程序向底层输出流写字节,不必写每一个字节而导致底层系统的调用
  • 这两个流内部都定义了一个大小为8192的字节数组
  • 构造方法:
    BufferInputStream(InputStream in):字节缓冲输入流
    BufferOutputStream(OutputStream out):字节缓冲输出流
package top.dty.io
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值