Java IO流之字节流详解

一、OutputStream输出流

FileOutputStream概述:

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中

书写步骤:
① 创建字节输出流对象

细节1:参数一是字符串表示的路径或者File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
细节3:如果文件已经存在,则会清空文件
细节4:参数二表示是否开启续写功能(不会清空文件内容),默认是false

//字符串路径、开启续写功能
FileOutputStream fos = new FileOutputStream("day11\\a.txt",true);
//File对象创建输出流
FileOutputStream fos1 = new FileOutputStream(new File("day11\\a.txt"));

② 写数据

细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符,FileOutputStream写数据的3种方式:
在这里插入图片描述
注意1:字符串也可以通过getBytes()方法转换成字节数组进行写入数据。
注意2:写入数据时如果想换行写入,使用\r\n或单写\r和\n即可。

package com.liming.myio;

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

public class ByteOutStreamDemo02 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("day11\\a.txt");

        fos.write(97);
        fos.write(98);

        byte[] arr = {97,98,99,100};
        fos.write(arr);

        byte[] arr1 = {97, 98, 99, 100};
        fos.write(arr1,1,3);

        String str1 = "Hello FileOutStream";
        byte[] bytes1 = str1.getBytes();
        fos.write(bytes1);

        //换行\r\n 或者单写\r或\n
        String str = "\r\n";
        byte[] Bytes = str.getBytes();
        fos.write(bytes1);

        fos.close();
    }
}

③ 释放资源关闭流

细节1:每次使用完流之后都要释放资源
细节2:建议先创建的流后关闭,后创建的流先关闭

// 关闭流
fos.close();

二、InputStream输入流

FileIntputStream概述:

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来

书写步骤:
① 创建字节输入流对象

细节:如果文件不存在,就直接报错

//1. 创建字节输入流对象
FileInputStream fis = new FileInputStream("day11\\a.txt");
FileInputStream fis1 = new FileInputStream(new File("day11\\a.txt"));

② 读数据

细节1:一次读取一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1
在这里插入图片描述
重点:循环读取数据

//2. 读数据
int read = fis.read();
System.out.println((char) read);

//2. 循环读取一个字节数据
int b;
while ((b = fis.read()) != -1) {
     System.out.print((char) b);
}

//2. 循环读取一个字节数组数据
int len;//读取的字节个数
byte[] bytes = new byte[1024*1024*5];//一次读取5MB
while ((len = fis.read(bytes)) != -1) {
    //2.1 写入数据、读取几个字节就写入几个字节
    fos.write(bytes,0,len);
}

③ 释放资源关闭流

//释放资源
fos.close();

三、拷贝文件案例

要求:

文件拷贝
把D:\aaa\movie.mp4文件拷贝到当前模块下

方式一:

利用循环从磁盘文件读取一个字节数据写入当前模块下
文件 -->(读取) 程序 -->(写入) 文件

代码演示:

package com.liming.myio;

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

public class ByteStreamTest01 {
    public static void main(String[] args) throws IOException {
        long startTime = System.currentTimeMillis();
        //1. 创建字节输入流用于读取数据
        FileInputStream fis = new FileInputStream("D:\\aaa\\movie.mp4");
        //2. 创建字节输出流用于写入数据
        FileOutputStream fos = new FileOutputStream("day11\\copy.mp4");
        //3. 循环读取数据
        int b;
        while ((b = fis.read()) != -1) {
            //4. 写入数据
            fos.write(b);
        }
        //4. 释放资源
        fos.close();
        fis.close();

        long endTime = System.currentTimeMillis();
        System.out.println("总时间:" + (endTime - startTime) + "毫秒");

    }
}

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

我们可以发现这种循环读取方式效率非常慢,所有我们利用循环读取一个字节数组的方式对程序进行改进。

方式二:

package com.liming.myio;

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

public class ByteStreamTest02 {
    public static void main(String[] args) throws IOException {
        /*
         * 文件拷贝
         * 把D:\aaa\movie.mp4文件拷贝到当前模块下
         * */
        long startTime = System.currentTimeMillis();

        //1. 创建字节输入流用于读取数据
        FileInputStream fis = new FileInputStream("D:\\aaa\\movie.mp4");
        //2. 创建字节输出流用于写入数据
        FileOutputStream fos = new FileOutputStream("day11\\copy.mp4");
        //3. 循环读取数据
        int len;//读取的字节个数
        byte[] bytes = new byte[1024*1024*5];//一次读取5MB
        while ((len = fis.read(bytes)) != -1) {
            //4. 写入数据、读取几个字节就写入几个字节
            fos.write(bytes,0,len);
        }
        //4. 释放资源
        fos.close();
        fis.close();
        long endTime = System.currentTimeMillis();
        System.out.println("总时间:" + (endTime - startTime)+"毫秒");

    }
}

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小钟不想敲代码

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值