Java 读写一个文件

简介: Java 读写一个文件

引言



本人之前总结过一篇《Java 文件操作》博客,那篇博客更加详细。如果小伙伴遇到本篇博客不懂的地方,可以点击下方链接,去看看之前的那篇博客。


Java 文件的操作


本篇博客主要围绕着【字节流读写文件】 与 【字符流读写文件】进行展开讨论。

我们知道 Java 的读文件与写文件,都是依靠流对象来进行的,主要有【字节流】与【字符流】两类可以供我们选择,然而它们其实就是我们日常开发中,对于文件操作,最常用的选择。


一、字符流读写文件



准备工作


创建一个 TestFile2 类,里面放两个方法,一个用来读文件,一个用来写文件。

并在准备好的 " test.txt " 文件中,准备好数据。


736a4fff0b584c05a2d4241ca96902a6.png


字符流读文件


public class TestFile2 {
    /**
     * 将文件中的数据 " 以字符流的形式 " 读出来,再用一个字符串接收
     */
    public static String readFile(String filePath) {
        StringBuilder result = new StringBuilder();
        try (FileReader fileReader = new FileReader(filePath)) {
            while (true) {
                int ch = fileReader.read();
                if (ch == -1) {
                    break;
                }
                result.append((char)ch); // 一次拼接一个字符
            }
            return result.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args) {
        String filePath = "D:/文件/test.txt";
        String data = TestFile2.readFile(filePath);
        System.out.println(data);
    }
}


在上面的代码中,我们需要注意几个点:


1. 我们将读到的数据,通过一个字符串接收,但是为什么不直接用 String 类型接受呢?


① 在当前场景中," fileReader.read() " 这个方法一次只读一个字符,这里 " read " 方法的无参形式也是用的最多的形式。因为你拿一个字符数组接收,你压根不知道要 new 多大的内存。但是无参形式的 " read " 方法,只要你读到末尾了,就返回 -1.


② 利用 StringBuilder 类进行拼接更合理,而不是用 String 类的加号拼接。 因为 String 类 的实例是一个不可变对象,每次利用加号拼接,就会 new 一个新的对象,这样会让代码效率变低。而 StringBuilder 类就是不断地将字符拼接到同一个对象中。


2. 本次使用流对象后,并没有使用 " close " 方法来关闭,因为我采用了 " try with resources " 语法,不理解的小伙伴,可以点击文章引言处的链接看一下。


3. 实际上 " read " 方法中可以支持很多参数,我们可以根据不同场景,根据参数读取需要的数据。但是,可想而知,字符流读文件,里面的参数要么和字符有关,要么就跟字符串有关。


展示结果:


3e6ad45443984862b912c494477bd76b.png


字符流写文件


public class TestFile2 {
    /**
     * 将数据 " 以字符流的形式 " 写入文件
     */
    public static void writeFile(String data, String filePath) {
        // 使用 try with resource 这样的语法
        try (FileWriter fileWriter = new FileWriter(filePath)) {
            fileWriter.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        String filePath = "D:/文件/test.txt";
        String data = "Welcome to the world !";
        TestFile2.writeFile(data, filePath);
    }
}


展示结果:


fb35acb95aaa4bd6a14568bd975d41c4.png


在上面的代码中,我们需要注意的事项:


1. 和前面的思想一样," write " 方法支持的传入参数有很多,我们可以根据自己的需求来设定,上面的例子,是直接将字符串写入文件,这很方便。


2. 可以看到,上面的代码直接写入了文件,但也有一个问题,它直接就将原先的文本进行了覆盖。如果不覆盖,需要拼接改怎么办呢?


使用下面代码:


try (FileWriter fileWriter = new FileWriter(filePath, true))


将上面 new 对象的第二个参数置为 true,表示可以拼接原先的文本,如果不设置,那么默认就为 false.


假设我们依照刚刚的 main 方法,再对文件进行一次写入,看看效果:


94f3badf4c5c4d199065ddd9902244b6.png


二、字节流读写文件



public class TestFile1 {
    /**
     * 将文件中的数据 " 以字节流的形式 " 读出来,再用一个字符串接收
     */
    public static String readFile(String filePath) {
        StringBuilder result = new StringBuilder();
        try (InputStream inputStream = new FileInputStream(filePath)) {
            while (true) {
                int ch = inputStream.read();
                if (ch == -1) {
                    break;
                }
                result.append((char) ch);
            }
            return result.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 将数据 " 以字节流的形式 " 写入文件
     */
    public static void writeFile(String data, String filePath) {
        try (OutputStream outputStream = new FileOutputStream(filePath, true)) {
            outputStream.write(data.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        String filePath = "D:/文件/test.txt";
//        String data = TestFile1.readFile(filePath);
//        System.out.println(data);
        String data = "hello world";
        TestFile1.writeFile(data, filePath);
    }
}


字节流和字符流的用法相似,这里就不再展示说明了。


针对上面的代码,我们需要注意的事项:


1. 字节流读写文件和字符流读写文件的思路是一样的,只是一个单位是字节,一个单位是字符而已,所以我们使用的时候,需要明确场景需要的单位。


2. 上面代码中,字节流读写文件用到的类是 InputStream 和 OutputStream,当然,也有其他的类可供使用,这里就不展开了,只要自己会用即可。


总结



1. 在上面的代码中,可以看到【字符流】与【字节流】的用法是很相似的,这就是 Java 为我们提供流思想,只是两类流对象,使用的类不同。


2. 【字符流】和【字节流】虽然有共同之处,但是在对于读写文件上的策略还是很不相同的,因为这就是两个单位不同所引发的不同之处。虽然,我们可以利用 ( byte / char ) 进行强制转换,但是我们最好不要这么做,因为这可能会造成数据丢失的情况。


3. 【字符流】常用于读写文本文件,因为文本文件,不同的操作系统可能有不同的编码,你压根不知道多少个字节对应着一个字符,所以使用对于文本文件,我们应该使用【字符流】,简单又方便。


4. 【字节流】常用于读取 HTTP 请求中的正文,对于 HTTP 协议中的 " header " 中 Content - Length,它表示正文的 " 字节数 ",我们就可以利用这一点,一次性读取所有字节的数据。


综上所述,【字符流】与【字节流】读写文件并无好坏之分,哪种场景下方便,就使用哪种方案。另外,多熟悉它们的类以及类提供的方法,也利于我们日常开发。


目录
相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
68 9
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
2月前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
465 2
|
11天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
73 34
|
28天前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
40 3
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
70 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
51 4
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
47 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
44 5
下一篇
DataWorks