Java --- IO流(字节流)

一、File

1.1 介绍

File,通过一个路径代表文件或者文件夹
File类是文件(file)和目录(directory)路径名的抽象表示形式。
白话: 一个File类代表一个文件或者一个文件夹的路径
特殊之处:
但是这个路径不一定要真实存在
路径分为:
绝对路径 (带完整路径,盘符等信息)
相对路径 (没有盘符,只有文件名等信息,相对于当前项目名下)

路径: D:\\A 或者 D:/A

1.2 构造方法

File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
private static void testConstructor() {
    // 通过字符串代表文件/文件夹对象
    File file = new File("E:\\a.txt");
    System.out.println(file );


    // 通过父级路径+ 子级路径代表 一个文件/文件夹对象
    File file2 = new File("E:\\A","a.txt"); // E:\A\a.txt
    // 以上这种,比较适合后续做文件上传使用

    String fuPath = "E:\\A";
    File parent = new File(fuPath);
    File file3 = new File(parent, "a.txt"); // E:\A\a.txt
}

1.3方法

创建功能
boolean createNewFile() 当且仅当不存在此路径名表示的文件时,创建一个新的空文件。
boolean mkdir() 创建此抽象路径名指定的目录/文件夹。
boolean mkdirs() 创建多层级的文件夹。
private static void testCreate() throws IOException {
    // 通过字符串代表文件对象
    File file = new File("E:\\a.txt");

    // 创建不存在的新文件
    boolean newFile = file.createNewFile( );
    System.out.println("是否创建成功? " + newFile );


    // 创建文件夹,不能使用已经存在的文件对象去调用方法
    File file2 = new File("E:/B");
    boolean mkdir = file2.mkdir( );
    System.out.println("创建文件夹? " + mkdir );

    // 创建多层文件夹
    File file3 = new File("E:\\C\\CC\\CCC");
    boolean mkdir1 = file3.mkdirs( );
    System.out.println("创建多层文件夹? " + mkdir1 );
}

获取功能

  • File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。

  • String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。

  • String getName()返回由此抽象路径名表示的文件或目录的名称。

  • String getPath()将此抽象路径名转换为一个路径名字符串。

  • String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)

  • File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

  • long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。

  • long length() 返回由此抽象路径名表示的文件的长度。

  private static void testGet() {
        File file = new File("E:\\a.txt");// 绝对路径

        // 相对路径,相对于当前项目根路径
        File file2 = new File("a.txt");

        // - File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
        File absoluteFile = file2.getAbsoluteFile( );
        System.out.println(absoluteFile );

        // - String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
        String absolutePath = file2.getAbsolutePath( );
        System.out.println(absolutePath );

        // - String getName()返回由此抽象路径名表示的文件或目录的名称。
        System.out.println(file.getName() );
        System.out.println(file2.getName() );

        // - String getPath() 获得构造方法中的路径
        System.out.println(file.getPath() );
        System.out.println(file2.getPath() );

        System.out.println("----------------" );
        File aDir = new File("E:\\A");

        // - String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)
        String[] arr = aDir.list( );
        System.out.println(Arrays.toString(arr ) );

        // - File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
        File[] files = aDir.listFiles( );
        System.out.println(Arrays.toString(files ) );

        File aFile = new File("E:\\A\\a.txt");
        // - long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
        System.out.println(aFile.lastModified() );
        long l = aFile.lastModified( );
        // 由指定毫秒值创建Date对象
        Date lastModified = new Date(l);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        String format = sdf.format(lastModified);
        System.out.println(format );

        // - long length() 返回由此抽象路径名表示的文件的长度。
        System.out.println( aFile.length());
    }

判断功能

  • boolean exists() 测试此抽象路径名表示的文件或目录是否存在。

  • boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。

  • boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。

  • boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。

   private static void testPanduan() throws IOException {
        // - boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
        File file = new File("b.txt");
        // 如果不存在时,创建该文件
        if (!file.exists()) {
            file.createNewFile();
        }

        // - boolean isDirectory() 判断是否是文件夹
        System.out.println(file.isDirectory() );

        // - boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
        System.out.println(file.isFile() );

        // - boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
        System.out.println("是否隐藏? " + file.isHidden() );

        File file1 = new File("E:\\IDEA-WorkSpaceJava2301\\day21");
        String[] list = file1.list( );
        for (String s : list) {
            System.out.println(s );
        }
    }

删除&重命名

  • boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。

  • boolean delete() 删除此抽象路径名表示的文件或目录。

private static void test() {
        File file = new File("E:\\A");
        // - boolean delete()  删除此抽象路径名表示的文件或目录。
        // 只能删除空文件夹
        boolean delete = file.delete( );
        System.out.println(delete );

        File file1 = new File("E:\\a.txt");
        // - boolean renameTo(File dest)  重新命名此抽象路径名表示的文件。
        // 改后路径与原来一致,就是单纯重命名
        // file1.renameTo(new File("E:\\aaa.txt"));

        // 改后路径与原来不一致,那就是移动并重命名
        file1.renameTo(new File("E:\\B\\aaa.txt"));
    }

1.4练习

设计方法,传入文件路径.列出该文件夹下的所有记事本文件 (单层文件夹)

public static void findTxt(String path){
    File file = new File(path);
    if(!file.exists()) {
        System.out.println("该路径指定的文件不存在!");
        return;
    }
     if(!file.isDirectory()) {
        System.out.println("该路径指定的文件不是文件夹!");
        return;
    }
    String[] nameArr = file.list();
    for(String name : nameArr) {
        if(name.endsWith("txt")) {
            System.out.println("记事本文件: " + name);
        }
    }
}

设计方法,传入文件路径.删除该文件夹下的所有文件(只是删文件,不删文件夹)

public static void deleteFile(String path){
    File file = new File(path);
    if(!file.exists()) {
        System.out.println("该路径指定的文件不存在!");
        return;
    }
     if(!file.isDirectory()) {
        System.out.println("该路径指定的文件不是文件夹!");
        return;
    }
    File[] fileArr = file.listFiles();
    for(File f : fileArr) {
        if(f.isFile()) {
           f.delete();
        }
    }
}

二、IO流

流的概念:
在程序中,数据需要传输(移动),⽐如磁盘上的数据需要出现在显⽰器上,就需要进⾏数据传输。 在Java中进⾏数据传输的技术就是“流”.
IO按类型分类
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
IO按方向分类
输入流
输出流

三、字节输入&输出流

字节输入流和字节输出流顶层设计是抽象类
InputStream 输入字节流
一般使用其子类FileInputStream
OutputStream 输出字节流
一般使用其子类FileOutputStream

3.1 FileInputStream

FileInputStream 用于读取诸如图像数据之类的原始字节流(二进制文件)
构造方法
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
        FileInputStream in = new FileInputStream("a2.txt");

        File file = new File("a2.txt");
        FileInputStream in2 = new FileInputStream(file);

方法

  • int read() 一次读取一个字节

  • void close() 关流

  // 以文件创建流
        FileInputStream in = new FileInputStream("a.txt");

        // 开始读取
        // 一次读取一个字节
        // int i1 = in.read();
        // System.out.println((char)i1 );
        //
        // int i2 = in.read( );
        // System.out.println((char)i2 );
        //
        // int i3 = in.read( );
        // System.out.println((char)i3 );
        //
        // // 读到末尾(读完了)返回-1
        // int i4 = in.read( );
        // System.out.println(i4 );

        int r = -1;
        while((r = in.read()) != -1) {
            System.out.println((char)r );
        }

        // 关流,释放资源
        in.close();

read() 一次读一个,有点"慢"

read(byte[] ) 一次读取一个数组大小的数据,比较快

 public static void main(String[] args) throws IOException {
        // 以文件创建流
        FileInputStream in = new FileInputStream("a.txt");

        byte[] bytes = new byte[4];
        System.out.println(Arrays.toString(bytes ) );

        // 可以将元素一次读取到数组中
        in.read(bytes);

        System.out.println(Arrays.toString(bytes ) );
    }

3.2 FileOutputStream

FileOutputStream是文件输出流,用于将数据写入 File 适合用于写入诸如图像数据之类的原始字节的流(二进制)
构造方法
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
方法
void write(int b) 将指定字节写入此文件输出流。
void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
 // FileOutputStream fos = new FileOutputStream("a.txt");
        // 构造方法中参数2, boolean append,意思是是否对该文件内容追加写入
        // 指定true,追加内容到原文件
        // 指定false,覆盖原文件内容
        // 不指定的话默认是false

        // 特殊的,写出的文件即使不存在,也会先创建文件再写入
        FileOutputStream fos = new FileOutputStream("c.txt",true);

        // 写一个
        //fos.write(67);

        // 支持一次写多个数据
        byte[] bytes = {65,66,67,68,69};
        fos.write(bytes);

        fos.close();

四、缓冲字节流

缓冲区字节输入流 BufferedInputStream,缓冲区字节输出流 BufferedOutputStream

之所以快,是因为它们内部有一个缓冲区数组(长度8192),在一次读取或者写出的时候通过数组完成,即一次读取或者写出多个

使用缓存区输入/输出流,需要给构造方法传入对应输入/输出流

内部是数组传输数据,最后一次输出数据时,数组不一定装满,如果数组不满的时候就不会写出数组,就会“丢失数据”,如果执行close,会关流的同时会强制刷新剩余数据输出

(有缓冲区,不关流的话有些数据无法输出; 没有达到缓冲区大小,也不会输出)

也可以执行flush手动刷新: bos.flush();

五、 总结

file 关于文件操作

会创建文件对象,创建文件夹/文件,判断文件夹/文件

输入/输出字节流

6行标准代码

        FileInputStream inputStream = new FileInputStream("D:/A/a.txt");
        FileOutputStream outputStream = new FileOutputStream("D:/A/b.txt"); 
        while ((r = inputStream.read()) != -1) {
            outputStream.write(r);
        }
        inputStream.close();
        outputStream.close();

会说: 什么是IO, 怎么分类,分别适合场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值