• 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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    高清免费壁纸网站推荐
    Ubuntu安装JDK8备忘
    大龄程序员的一周#3:差点“零成长”
    从零开始学习 Java:简单易懂的入门指南之网络编程(三十七)
    华为OD机考算法题:开心消消乐
    网工内推 | IT工程师,IA认证即可,五险一金,全勤奖,最高10k
    SQL Server登录及建库相关操作
    【Linux】—— 详解软硬链接
    使用Get-ADOrganizationalUnit导出指定OU下子OU列表
    RHCE学习 --- 第八次作业(ansible)
  • 原文地址:https://blog.csdn.net/m0_58154870/article/details/127914571