Java文件读写数据流

1.按照读写方式来分

以下这几个类都是抽象类.并且都有对于文件操作的具体实现类.File+类名就是具体的实现类

1.1.二进制方式读写

1.1.1.InputStream

以二进制方式读.有两个主要方法.

1.read();

该方法有三个版本

  1. 无参: read() 读取一个字节的数据,返回 -1 表示读取结束
  2. 一个参数: read(byte[] b) 最多读取 b.length 字节的数据到 b 中,返回值是实际读到的数量;返回 -1 表示读取结束.读取到的内容会存储在传入的数组参数中.
  3. 三个参数: read(byte[] b, int off, int len) 最多读取 (len-off)个字节的数据到 b 中,放在byte数组中,从 off 开始,返回实际读到的数量;返回 -1 表示读取结束.读取到的内容会存储在传入的数组参数中.
2.close();

关闭字节流.Java的数据流在使用结束时都需要手动关闭字节流.否则长时间未关闭会产生内存泄漏的危险.

1.1.2.OutputStream

以二进制方式写.有三个主要方法.默认此操作每次都会清空旧的内容.向内部写入新的内容.如果需要追加需要添加参数,

1.write();

该方法同样有三个版本

  1. 一个int型的参数: write(int b) 写入一个字节
  2. 一个字节数组的参数: write(byte[] b) 将 b 这个字符数组中的数据全部写入 os 中
  3. 三个参数: write(byte[] b, int off, int len) 将 b 这个字符数组中从 off 开始写入 len 个长度的数据
2.close();

与InputStream流相同,使用结束需要关闭流.否则会产生危险.

3.flash();

清空缓存区.

因为I/O 的速度是很慢的,所以大多的 OutputStream 为了减少设备操作的次数,就先将I/O内容先写到一片内存中(缓冲区).等到缓冲区满了,或者达成一定条件时才真正将数据写入设备中.

这样的操作提升了一定的效率,但造成一个后果.就是我们写的数据,很可能会遗留一部分在缓冲区中.所以我们就需要这样一个操作.在合适的时候,让缓冲区中的内容全部写入设备(清空缓冲区).

1.2.字符方式读写

用法和以字节读写类似,不同的是操作对象: 一个操作字节,一个操作字符.

1.2.1.Reader

以字符方式读.与InputStream类似.有 read()和close() 方法.并且用法也类似.

1.read();

该方法有三个版本

  1. 无参: read()
  2. 一个参数: read(char[] b)
  3. 三个参数: read(char[] b, int off, int len)
2.close();

关闭字符流.

1.2.2.Writer

以字符方式写.与OutputStream类似.有 write(),close()和flash() 方法.并且用法也类似.

1.write();

该方法同样有三个版本

  1. 一个int型的参数: write(int b)
  2. 一个字符数组的参数: write(char[] b)
  3. 三个参数: write(char[] b, int off, int len)
2.close();

关闭字符流.

3.flash();

清空缓存区.

2.具体的实现类

  1. FileInputStream
  2. FileOutputStream
  3. FIleReader
  4. FileWriter

2.1构造方法

这几个实现类的构造方法类似.这里以FileInputStream为例.

  1. FileInputStream(File file) : 利用 File 构造文件输入流
  2. FileInputStream(String name) : 利用文件路径构造文件输入流

需要注意的是,这几个写入流都是清空原有文件数据,重新写入新的数据.如果想要追加数据的话.需要在构造方法参数后面添加true.

FileOutputStream(String name,boolean bo);这里的第二个参数为true时就是向文件中追加内容.

3.复制文件案例

import java.io.*;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要拷贝的源路径");
        String src = scanner.next();
        System.out.println("请输入要拷贝的目标路径");
        String dest = scanner.next();

        File srcFile = new File(src);
        if (!srcFile.isFile()) {
            System.out.println("输入源路径有误");
            return;
        }

        try (InputStream inputStream = new FileInputStream(src)) {
            try (OutputStream outputStream = new FileOutputStream(dest)) {
                byte[] buffer = new byte[1024];
                while (true) {
                    int len = inputStream.read(buffer);
                    if (len == -1) {
                        break;
                    }
                    outputStream.write(buffer, 0, len);
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

魚小飛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值