【Java教程】Day10-11 IO:简化的 Files 工具类使用

从 Java 7 开始,Java 引入了 Files 类,它位于 java.nio.file 包下,为我们提供了许多简便的文件读写方法。Files 类是基于 NIO (New Input/Output) 库的,使得文件操作更加高效和简单,尤其是在处理小文件时。本文将深入探讨如何使用 Files 类进行常见的文件操作。

 

1. Files 类概述

Files 类为文件操作提供了一组静态方法,用于读写文件、复制文件、删除文件、检查文件是否存在等操作。通过这些方法,我们可以避免手动管理文件输入输出流,从而使代码更加简洁。

 

 

2. 文件读取

Files 类提供了多种方法来读取文件内容,根据不同需求,可以读取为 byte[]String 或者逐行读取。

2.1 读取整个文件为 byte[]

如果需要读取文件的全部内容为字节数组,可以使用 readAllBytes() 方法。该方法会将文件内容一次性读取到内存中,因此适合读取小文件。

javabyte[] data = Files.readAllBytes(Path.of("/path/to/file.txt"));

 

2.2 读取文本文件为 String

对于文本文件,Files 还提供了 readString() 方法。默认情况下,它会使用 UTF-8 编码来读取文件内容。如果需要使用其他编码,可以通过指定 Charset 来实现。

java// 使用默认 UTF-8 编码读取文件内容String content1 = Files.readString(Path.of("/path/to/file.txt"));// 使用 ISO-8859-1 编码读取文件内容String content2 = Files.readString(Path.of("/path", "to", "file.txt"), StandardCharsets.ISO_8859_1);

 

2.3 按行读取文件

如果文件较大,逐行读取会更加高效。Files.readAllLines() 方法可以将文件的每一行读取为 List<String>,并返回包含所有行的列表。

javaList<String> lines = Files.readAllLines(Path.of("/path/to/file.txt"));

 

3. 文件写入

Files 类也提供了几种简洁的写入文件的方法,包括写入二进制数据、文本内容以及按行写入。

3.1 写入二进制数据

如果你需要将字节数组写入文件,可以使用 write() 方法,它会将数据写入指定路径的文件。

javabyte[] data = ...;Files.write(Path.of("/path/to/file.txt"), data);

 

3.2 写入文本内容

要写入文本内容,可以使用 writeString() 方法。它默认使用 UTF-8 编码来写入文本内容,但你也可以指定其他编码。

javaFiles.writeString(Path.of("/path/to/file.txt"), "文本内容...");

 

3.3 按行写入文本

如果你需要按行写入文本数据,可以传入一个 List<String> 来逐行写入文件。

javaList<String> lines = ...;Files.write(Path.of("/path/to/file.txt"), lines);

 

4. 文件和目录操作

Files 类不仅可以进行读写操作,还提供了常见的文件操作方法,如复制、移动、删除文件以及检查文件或目录是否存在。

  • 复制文件:

javaFiles.copy(Path.of("/path/to/source.txt"), Path.of("/path/to/destination.txt"));

 

  • 删除文件:

javaFiles.delete(Path.of("/path/to/file.txt"));

 

  • 检查文件或目录是否存在:

javaboolean exists = Files.exists(Path.of("/path/to/file.txt"));

 

  • 移动文件:

javaFiles.move(Path.of("/path/to/source.txt"), Path.of("/path/to/destination.txt"));

 

5. 注意事项

虽然 Files 类极大地简化了文件的读写操作,但它也有一定的局限性。特别是,当你需要处理大文件时,Files 提供的方法可能会因内存限制而导致程序崩溃。它们通常适用于小文件(例如配置文件、日志文件等)的读取和写入。

对于大文件的读写,建议使用传统的文件流方法,通过逐步读取或写入文件的方式来避免内存溢出。例如,使用 BufferedReader 和 BufferedWriter 进行逐行处理,或者使用 FileChannel 进行大文件的高效读写。

 

6. 小结

Files 类是 Java 7 引入的一个非常强大的工具类,极大地方便了文件操作。它提供了许多简便的方法,适用于大多数简单的文件读写任务。通过 Files.readAllBytes()Files.readString()Files.write() 等方法,我们可以简洁地读取和写入文件内容。对于小文件的操作,Files 类的表现非常出色,但对于大文件,我们仍然需要依赖传统的流操作来进行处理。

总的来说,Files 是一个简化 Java 文件操作的利器,它帮助开发者减少了很多样板代码,使得文件读写变得更加高效和直观。

 

 

 

分析报错信息并解决问题: I:\Java\JDK\jdk-17\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\lib\idea_rt.jar=63569:C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Why\Desktop\day01\day01\代码\day01\day01\rocketmq\target\classes;I:\repository\org\apache\rocketmq\rocketmq-client\4.5.2\rocketmq-client-4.5.2.jar;I:\repository\org\apache\rocketmq\rocketmq-common\4.5.2\rocketmq-common-4.5.2.jar;I:\repository\org\apache\rocketmq\rocketmq-remoting\4.5.2\rocketmq-remoting-4.5.2.jar;I:\repository\com\alibaba\fastjson\1.2.51\fastjson-1.2.51.jar;I:\repository\io\netty\netty-all\4.0.42.Final\netty-all-4.0.42.Final.jar;I:\repository\org\apache\rocketmq\rocketmq-logging\4.5.2\rocketmq-logging-4.5.2.jar;I:\repository\io\netty\netty-tcnative-boringssl-static\1.1.33.Fork26\netty-tcnative-boringssl-static-1.1.33.Fork26.jar;I:\repository\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar com.itheima.base.Consumer Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 at io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:694) at io.netty.channel.nio.NioEventLoop$4.run(NioEventLoop.java:171) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:167) at io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:149) at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:102) at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:64) at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:49) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:70) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:65) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:56) at org.apache.rocketmq.remoting.netty.NettyRemotingClient.<init>(NettyRemotingClient.java:122) at org.apache.rocketmq.client.impl.MQClientAPIImpl.<init>(MQClientAPIImpl.java:187) at org.apache.rocketmq.client.impl.factory.MQClientInstance.<init>(MQClientInstance.java:135) at org.apache.rocketmq.client.impl.MQClientManager.getAndCreateMQClientInstance(MQClientManager.java:53) at org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl.start(DefaultMQPushConsumerImpl.java:582) at org.apache.rocketmq.client.consumer.DefaultMQPushConsumer.start(DefaultMQPushConsumer.java:693) at com.itheima.base.Consumer.main(Consumer.java:33) Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjectException: Unable to make field long java.nio.Buffer.address accessible: module java.base does not "opens java.nio" to unnamed module @7cf10a6f [in thread "main"] at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) at io.netty.util.internal.PlatformDependent0$1.run(PlatformDependent0.java:64) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:59) at io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:694) at io.netty.util.internal.PlatformDependent.isAndroid0(PlatformDependent.java:711) at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:76) at io.netty.util.Signal.<clinit>(Signal.java:31) at io.netty.util.concurrent.DefaultPromise.<clinit>(DefaultPromise.java:42) at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:35) ... 11 more
最新发布
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值