Java进阶,file类,IO流

本文详细介绍了Java中File类的使用,包括创建File对象、判断文件类型、获取及修改文件信息、遍历文件夹等。同时,讲解了字符集的基本概念和编码解码操作。此外,还探讨了IO流的原理,如字节流的输入输出,特别是如何避免字节输入流读取中文时出现乱码的问题,并提到了资源释放的最佳实践,如try-catch-finally和try-with-resource语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java进阶,file类,IO流

一.File类

File类概述

  • File类的对象代表操作系统的文件(文件、文件夹),File类在java.io.File包下。
  • File类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功能

1.创建File对象

File类创建对象

方法名称说明
public File(String pathname)根据文件路径创建文件对象
public File(String parent, String child)根据父路径名字符串和子路径名字符串创建文件对象
public File(File parent, String child)根据父路径对应文件对象和子路径名字符串创建文件对象

注意

  • File对象可以定位文件和文件夹
  • File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的。

绝对路径和相对路径

  • 绝对路径:从盘符开始 File file1 = new File(“D:\itheima\a.txt”);

  • 相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。 File file3 = new File(“模块名\a.txt”);

public class FileDemo1 {
    public static void main(String[] args) {
        //1.绝对路径创建一个文件对象
        File f1 = new File("E:/demo/xaioren.jpg");
        //a.获取它的绝对路径。
        System.out.println(f1.getAbsolutePath());
        //b.获取文件定义的时候使用的路径。
        System.out.println(f1.getPath());
        //c.获取文件的名称:带后缀
        System.out.println(f1.getName());
        //d.获取文件的大小:字节个数
        System.out.println(f1.length());//字节大小
        //e.获取文件的最后修改时间
        long time = f1.lastModified();
        System.out.println("最后修改的时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time));
        //f.判断文件是文件还是文件夹
        System.out.println(f1.isFile());//true
        System.out.println(f1.isDirectory());//false
    }
}

2.常用方法:判断文件类型、获取文件信息

File类的判断文件类型、获取文件信息功能

方法名称说明
public boolean isDirectory()判断此路径名表示的File是否为文件夹
public boolean isFile()判断此路径名表示的File是否为文件
public boolean exists()判断此路径名表示的File是否存在
public long length()返回文件的大小(字节数量)
public String getAbsolutePath()返回文件的绝对路径
public String getPath()返回定义文件时使用的路径
public String getName()返回文件的名称,带后缀
public long lastModified()返回文件的最后修改时间(时间毫秒值)

3.常用方法:创建文件、删除文件功能

File类创建文件的功能

方法名称说明
public boolean createNewFile()创建一个新的空的文件
public boolean mkdir()只能创建一级文件夹
public boolean mkdirs()可以创建多级文件夹

File类删除文件的功能

方法名称说明
public boolean delete()删除由此抽象路径名表示的文件或空文件夹

注意delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站

public class FileDemo2 {
    public static void main(String[] args) throws IOException {
        File f = new File("file-io-app/src/data.txt");
        //a.创建新文件,创建成功返回true,反之,不需要这个,以后文件写出去的时候都会自动创建
        System.out.println(f.createNewFile());
        File f1 = new File("file-io-app/src/data1.txt");
        System.out.println(f1.createNewFile());

        //b.mkdir创建一级目录
        File f2 = new File("E:/demo/aaa");
        System.out.println(f2.mkdir());

        //c.mkdirs创建多级目录
        File f3 = new File("E:/demo/bbb/ccc/vvv");
        System.out.println(f3.mkdirs());

        //d.删除文件或者空文件夹
        System.out.println(f1.delete());

        //e.只能删除空文件夹,不能删除非空文件夹
        File f4 = new File("E:/demo");
        System.out.println(f4.delete());
    }
}

4.常用方法:遍历文件夹

File类的遍历功能

方法名称说明
public String[] list()获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。
public File[] listFiles()(常用)获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)

listFiles方法注意事项:

  • 当文件不存在时或者代表文件时,返回null
  • 当文件对象代表一个空文件夹时,返回一个长度为0的数组
  • 当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
  • 当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
  • 当没有权限访问该文件夹时,返回null
public class FileDemo3 {
    public static void main(String[] args) {
        //1.定位一个文件夹
        File f1 = new File("E:/demo");
        String[] names = f1.list();
        for (String name : names) {
            System.out.println(name);
        }

        //2.一级文件对象
         File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file.getAbsolutePath());
        }

        //注意事项

    }
}

二.字符集

1.常见字符集介绍

字符集基础知识:

  • 字符集(Character Set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:

​ ASCII字符集

​ GBK字符集

​ Unicode(UTF-8)字符集等。

  • 英文和数字等在任何国家的字符集中都占1个字节
  • GBK字符中一个中文字符占2个字节
  • UTF-8编码中一个中文1般占3个字节

注意:编码前和编码后需要一致,否则会乱码

​ 英文和数字不会

2.字符集的编码、解码操作

String编码

方法名称说明
byte[] getBytes()使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName)使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中

String解码

构造器说明
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName)通过指定的字符集解码指定的字节数组来构造新的 String

三.IO流

1.概述

  • I表示intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
  • O表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。

总结流的四大类:

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
  • 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。

1.IO流的作用?

  • 读写文件数据的

2.IO流是怎么划分的,大体分为几类,各自的作用?

  • 字节输入流 InputStream(读字节数据的)
  • 字节输出流 OutoutStream(写字节数据出去的)
  • 字符输入流 Reader(读字符数据的)
  • 字符输出流 Writer(写字符数据出去的)

2.字节流

1.字节输入流:每次读取一个字节,每次读取一个字节数组

文件字节输入流:FileInputStream

  • 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
构造器说明
public FileInputStream(File file)创建字节输入流管道与源文件对象接通
public FileInputStream(String pathname)创建字节输入流管道与源文件路径接通
方法名称说明
public int read()每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

1.使用字节流读取中文输出乱码,如何使用字节输入流读取中文输出不乱码呢?

  • 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。

2.直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,字节数组可能引起内存溢出。
2.字节输入流:读取文件的全部字节

方式一

  • 自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成。
方法名称说明
public int read(byte[] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

方式二

  • 官方为字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
方法名称说明
public byte[] readAllBytes() throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回

1.如何使用字节输入流读取中文内容输出不乱码呢?

  • 一次性读取完全部字节。
  • 可以定义与文件一样大的字节数组读取,也可以使用官方API.

2.直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,定义的字节数组可能引起内存溢出。
3.字节输出流:写字节数据到文件

文件字节输出流:FileOutputStream

  • 作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。
构造器说明
public FileOutputStream(File file)创建字节输出流管道与源文件对象接通
public FileOutputStream(File file,boolean append)创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream(String filepath)创建字节输出流管道与源文件路径接通
public FileOutputStream(String filepath,boolean append)创建字节输出流管道与源文件路径接通,可追加数据

文件字节输出流(FileOutputStream)写数据出去的API

方法名称说明
public void write(int a)写一个字节出去
public void write(byte[] buffer)写一个字节数组出去
public void write(byte[] buffer , int pos , int len)写一个字节数组的一部分出去。

流的关闭与刷新

方法说明
flush()刷新流,还可以继续写数据
close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

1.字节输出流如何实现写出去的数据能换行

  • os.write(“\r\n”.getBytes())

3.IO流:资源释放的方式

1.try-catch-finally
  • finally:放在try-catch后面的,无论是正常执行还是异常执行代码,最后一定要执行,除非JVM退出。
  • 作用:一般用于进行最后的资源释放操作(专业级做法)

格式:

try {
FileOutputStream fos = new FileOutputStream(“a.txt”);
fos.write(97);
} catch (IOException e) {
e.printStackTrace();
} finally{}

2.try-with-resource
  • 自动释放资源、代码简洁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值