广告
返回顶部
首页 > 资讯 > 精选 >文件写入的方法有哪些
  • 514
分享到

文件写入的方法有哪些

2023-06-15 20:06:18 514人浏览 安东尼
摘要

这篇文章主要讲解了“文件写入的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“文件写入的方法有哪些”吧!0.什么是流?Java 中的“流”是一种抽象的概念,也是一种比喻,就好比水流一

这篇文章主要讲解了“文件写入的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“文件写入的方法有哪些”吧!

0.什么是流?

Java 中的“流”是一种抽象的概念,也是一种比喻,就好比水流一样,水流是从一端流向另一端的,而在 Java  中的“水流”就是数据,数据会从一端“流向”另一端。

根据流的方向性,我们可以将流分为输入流和输出流,当程序需要从数据源中读入数据的时候就会开启一个输入流,相反,写出数据到某个数据源目的地的时候也会开启一个输出流,数据源可以是文件、内存或者网络等。

1.什么是字节流?

字节流的基本单位为字节(Byte),一个字节通常为 8 位,它是用来处理二进制(数据)的。字节流有两个基类:InputStream(输入字节流)和  OutputStream(输出字节流)。

常用字节流的继承关系图如下图所示:

文件写入的方法有哪些

其中 InputStream 用于读操作,而  OutputStream 用于写操作。

2.什么是字符流?

字符流的基本单位为 Unicode,大小为两个字节(Byte),它通常用来处理文本数据。字符流的两个基类:Reader(输入字符流)和  Writer(输出字符流)。

常用字符流的继承关系图如下图所示:

文件写入的方法有哪些

3.流的分类

流可以根据不同的维度进行分类,比如可以根据流的方向进行分类,也可以根据传输的单位进行分类,还可以根据流的功能进行分类,比如以下几个。

① 按流向分类

  • 输出流:OutputStream 和 Writer 为基类。

  • 输入流:InputStream 和 Reader 为基类。

② 根据传输数据单位分类

  • 字节流:OutputStream 和 InputStream 为基类。

  • 字符流:Writer 和 Reader 为基类。

③ 根据功能分类

  • 字节流:可以从或向一个特定的地方(节点)读写数据。

  • 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。

PS:我们通常是以传输数据的单位来为流进行分类。

4.写文件的6种方法

写入文件的方法主要源于字符流 Writer 和输出字节流 OutputStream 的子类,如下图所示:

文件写入的方法有哪些

以上标注✅号的类就是用来实现文件写入的类,除此之外,在 jdk 1.7 中还提供了 Files  类用来实现对文件的各种操作,接下来我们分别来看。

方法 1:FileWriter

FileWriter 属于「字符流」体系中的一员,也是文件写入的基础类,它包含 5  个构造函数,可以传递一个具体的文件位置,或者 File 对象,第二参数表示是否要追加文件,默认值为 false  表示重写文件内容,而非追加文件内容(关于如何追加文件,我们后面会讲)。

文件写入的方法有哪些

FileWriter 类的实现如下:

 public static void fileWriterMethod(String filepath, String content) throws ioException {     try (FileWriter fileWriter = new FileWriter(filepath)) {         fileWriter.append(content);     } }

只需要传入具体的文件路径和待写入的内容即可,调用代码如下:

public static void main(String[] args) {     fileWriterMethod("/Users/Mac/Downloads/io_test/write1.txt", "哈喽,Java中文社群."); }

然后我们打开写入的文件,实现结果如下:

文件写入的方法有哪些
  • 关于资源释放的问题:在 JDK 7 以上的版本,我们只需要使用 try-with-resource 的方式就可以实现资源的释放,就比如使用 try  (FileWriter fileWriter = new FileWriter(filepath)) {...} 就可以实现 FileWriter  资源的自动释放。

方法 2:BufferedWriter

BufferedWriter 也属于字符流体系的一员,与 FileWriter 不同的是  BufferedWriter自带缓冲区,因此它写入文件的性能更高(下文会对二者进行测试)。

小知识点:缓冲区

缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

缓冲区的优势

以文件流的写入为例,如果我们不使用缓冲区,那么每次写操作 CPU  都会和低速存储设备也就是磁盘进行交互,那么整个写入文件的速度就会受制于低速的存储设备(磁盘)。但如果使用缓冲区的话,每次写操作会先将数据保存在高速缓冲区内存上,当缓冲区的数据到达某个阈值之后,再将文件一次性写入到磁盘上。因为内存的写入速度远远大于磁盘的写入速度,所以当有了缓冲区之后,文件的写入速度就被大大提升了。

了解了缓存区的优点之后,咱们回到本文的主题,接下来我们用 BufferedWriter 来文件的写入,实现代码如下:

 public static void bufferedWriterMethod(String filepath, String content) throws IOException {     try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filepath))) {         bufferedWriter.write(content);     } }

调用代码和方法 1 类似,这里就不再赘述了。

方法 3:PrintWriter

PrintWriter  也属于字符流体系中的一员,它虽然叫“字符打印流”,但使用它也可以实现文件的写入,实现代码如下:

 public static void printWriterMethod(String filepath, String content) throws IOException {     try (PrintWriter printWriter = new PrintWriter(new FileWriter(filepath))) {         printWriter.print(content);     } }

从上述代码可以看出,无论是 PrintWriter 还是 BufferedWriter 都必须基于 FileWriter 类来完成调用。

方法 4:FileOutputStream

上面 3 个示例是关于字符流写入文件的一些操作,而接下来我们将使用字节流来完成文件写入。我们将使用 String  自带的 getBytes() 方法先将字符串转换成二进制文件,然后再进行文件写入,它的实现代码如下:

 public static void fileOutputStreamMethod(String filepath, String content) throws IOException {     try (FileOutputStream fileOutputStream = new FileOutputStream(filepath)) {         byte[] bytes = content.getBytes();         fileOutputStream.write(bytes);     } }

方法 5:BufferedOutputStream

BufferedOutputStream 属于字节流体系中的一员,与 FileOutputStream  不同的是,它自带了缓冲区的功能,因此性能更好,它的实现代码如下:

 public static void bufferedOutputStreamMethod(String filepath, String content) throws IOException {     try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(             new FileOutputStream(filepath))) {         bufferedOutputStream.write(content.getBytes());     } }

方法 6:Files

接下来的操作方法和之前的代码都不同,接下来咱们就使用 JDK 7 中提供的一个新的文件操作类 Files 来实现文件的写入。

Files 类是 JDK 7  添加的新的操作文件的类,它提供了提供了大量处理文件的方法,例如文件复制、读取、写入,获取文件属性、快捷遍历文件目录等,这些方法极大的方便了文件的操作,它的实现代码如下:

 public static void filesTest(String filepath, String content) throws IOException {     Files.write(Paths.get(filepath), content.getBytes()); }

以上这些方法都可以实现文件的写入,那哪一种方法性能更高呢?接下来我们来测试一下。

5.性能测试

我们先来构建一个比较大的字符串,然后分别用以上 6 种方法来测试文件写入的速度,最后再把结果打印出来,测试代码如下:

import java.io.*; import java.NIO.file.Files; import java.nio.file.Paths;  public class WriteExample {     public static void main(String[] args) throws IOException {         // 构建写入内容         StringBuilder stringBuilder = new StringBuilder();         for (int i = 0; i < 1000000; i++) {             stringBuilder.append("ABCDEFGHIGKLMNOPQRSEUVWXYZ");         }         // 写入内容         final String content = stringBuilder.toString();         // 存放文件的目录         final String filepath2 = "/Users/mac/Downloads/io_test/write1.txt";         final String filepath3 = "/Users/mac/Downloads/io_test/write2.txt";         final String filepath4 = "/Users/mac/Downloads/io_test/write3.txt";         final String filepath5 = "/Users/mac/Downloads/io_test/write4.txt";         final String filepath6 = "/Users/mac/Downloads/io_test/write5.txt";         final String filepath7 = "/Users/mac/Downloads/io_test/write6.txt";          // 方法一:使用 FileWriter 写文件         long stime1 = System.currentTimeMillis();         fileWriterTest(filepath2, content);         long etime1 = System.currentTimeMillis();         System.out.println("FileWriter 写入用时:" + (etime1 - stime1));          // 方法二:使用 BufferedWriter 写文件         long stime2 = System.currentTimeMillis();         bufferedWriterTest(filepath3, content);         long etime2 = System.currentTimeMillis();         System.out.println("BufferedWriter 写入用时:" + (etime2 - stime2));          // 方法三:使用 PrintWriter 写文件         long stime3 = System.currentTimeMillis();         printWriterTest(filepath4, content);         long etime3 = System.currentTimeMillis();         System.out.println("PrintWriterTest 写入用时:" + (etime3 - stime3));          // 方法四:使用 FileOutputStream  写文件         long stime4 = System.currentTimeMillis();         fileOutputStreamTest(filepath5, content);         long etime4 = System.currentTimeMillis();         System.out.println("FileOutputStream 写入用时:" + (etime4 - stime4));          // 方法五:使用 BufferedOutputStream 写文件         long stime5 = System.currentTimeMillis();         bufferedOutputStreamTest(filepath6, content);         long etime5 = System.currentTimeMillis();         System.out.println("BufferedOutputStream 写入用时:" + (etime5 - stime5));          // 方法六:使用 Files 写文件         long stime6 = System.currentTimeMillis();         filesTest(filepath7, content);         long etime6 = System.currentTimeMillis();         System.out.println("Files 写入用时:" + (etime6 - stime6));      }           private static void filesTest(String filepath, String content) throws IOException {         Files.write(Paths.get(filepath), content.getBytes());     }           private static void bufferedOutputStreamTest(String filepath, String content) throws IOException {         try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(                 new FileOutputStream(filepath))) {             bufferedOutputStream.write(content.getBytes());         }     }           private static void fileOutputStreamTest(String filepath, String content) throws IOException {         try (FileOutputStream fileOutputStream = new FileOutputStream(filepath)) {             byte[] bytes = content.getBytes();             fileOutputStream.write(bytes);         }     }           private static void printWriterTest(String filepath, String content) throws IOException {         try (PrintWriter printWriter = new PrintWriter(new FileWriter(filepath))) {             printWriter.print(content);         }     }           private static void bufferedWriterTest(String filepath, String content) throws IOException {         try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filepath))) {             bufferedWriter.write(content);         }     }           private static void fileWriterTest(String filepath, String content) throws IOException {         try (FileWriter fileWriter = new FileWriter(filepath)) {             fileWriter.append(content);         }     } }

在查看结果之前,我们先去对应的文件夹看看写入的文件是否正常,如下图所示:

文件写入的方法有哪些

从上述结果可以看出,每种方法都正常写入了 26  MB 的数据,它们最终执行的结果如下图所示:

文件写入的方法有哪些

从以上结果可以看出,字符流的操作速度最快,这是因为我们本次测试的代码操作的是字符串,所以在使用字节流时,需要先将字符串转换为字节流,因此在执行效率上不占优势。

从上述结果可以看出,性能最好的是带有缓冲区的字符串写入流 BufferedWriter,性能最慢的是 Files。

PS:以上的测试结果只是针对字符串的操作场景有效,如果操作的是二进制的文件,那么就应该使用带缓冲区的字节流  BufferedOutputStream。

6.扩展知识:内容追加

以上代码会对文件进行重写,如果只想在原有的基础上追加内容,就需要在创建写入流的时候多设置一个 append 的参数为 true,比如如果我们使用  FileWriter 来实现文件的追加的话,实现代码是这样的:

public static void fileWriterMethod(String filepath, String content) throws IOException {     // 第二个 append 的参数传递一个 true = 追加文件的意思     try (FileWriter fileWriter = new FileWriter(filepath, true)) {         fileWriter.append(content);     } }

如果使用的是 BufferedWriter 或 PrintWriter,也是需要在构建 new FileWriter 类时多设置一个 append  的参数为 true,实现代码如下:

try (BufferedWriter bufferedWriter = new BufferedWriter(     new FileWriter(filepath, true))) {     bufferedWriter.write(content); }

相比来说 Files 类要想实现文件的追加写法更加特殊一些,它需要在调用 write 方法时多传一个 StandardOpenOption.APPEND  的参数,它的实现代码如下:

Files.write(Paths.get(filepath), content.getBytes(), StandardOpenOption.APPEND);

感谢各位的阅读,以上就是“文件写入的方法有哪些”的内容了,经过本文的学习后,相信大家对文件写入的方法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 文件写入的方法有哪些

本文链接: https://www.lsjlt.com/news/281512.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 文件写入的方法有哪些
    这篇文章主要讲解了“文件写入的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“文件写入的方法有哪些”吧!0.什么是流Java 中的“流”是一种抽象的概念,也是一种比喻,就好比水流一样...
    99+
    2023-06-15
  • php写入文件内容的方法有哪些
    在PHP中,可以使用以下方法来写入文件内容:1. 使用`file_put_contents()`函数:该函数将一个字符串写入文件中。如果文件不存在,则创建新文件。如果文件已存在,则覆盖文件内容。示例代码如下:```php$file = ...
    99+
    2023-08-11
    php
  • python把字典写入文件的方法有哪些
    Python有几种方法可以将字典写入文件:1. 使用文件对象的write方法逐行写入字典的键值对。首先将字典转换为字符串格式,然后将...
    99+
    2023-08-08
    python
  • SQL注入中文件读写的方法有哪些
    这篇文章主要介绍了SQL注入中文件读写的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、MySQL读文件常见的读文件,可以用16...
    99+
    2022-10-18
  • linux写文件的方法有哪些
    本文小编为大家详细介绍“linux写文件的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux写文件的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2023-03-10
    linux
  • python文件读写的方法有哪些
    Python文件读写的方法有以下几种:1. 使用open()函数打开文件,并通过read()方法读取文件内容。```pythonfi...
    99+
    2023-09-13
    python
  • C#读取写入文件的方式有哪些
    这篇“C#读取写入文件的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#读取写入文件的方式有哪些”文章吧。1:二...
    99+
    2023-07-02
  • java创建写入文件的方式有哪些
    本篇内容主要讲解“java创建写入文件的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java创建写入文件的方式有哪些”吧!在本文中大量的使用到了try-with-resources语...
    99+
    2023-07-04
  • win10无法写入文件的原因有哪些
    以下是可能导致Windows 10无法写入文件的几个常见原因:1. 文件或文件夹权限不正确:如果你没有足够的权限来写入指定的文件或文...
    99+
    2023-08-19
    win10
  • Nodejs读写文件的操作方法有哪些
    这篇“Nodejs读写文件的操作方法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Nodejs读写文件的操作方法有哪些...
    99+
    2023-07-04
  • pandas写入excel有哪些方法
    pandas写入excel的方法有:1、安装所需的库;2、读取数据集;3、写入Excel文件;4、指定工作表名称;5、格式化输出;6、自定义样式。Pandas是一个流行的Python数据分析库,提供了许多强大的数据清洗和分析功能,要将Pan...
    99+
    2023-11-22
    Pandas Excel
  • CMD命令行将当前磁盘所有文件名写入到文本文件的方法有哪些
    这篇文章主要介绍“CMD命令行将当前磁盘所有文件名写入到文本文件的方法有哪些”,在日常操作中,相信很多人在CMD命令行将当前磁盘所有文件名写入到文本文件的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-08
  • Python读写EXCEL文件常用方法有哪些
    本篇文章给大家分享的是有关Python读写EXCEL文件常用方法有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python读写excel...
    99+
    2022-10-19
  • c语言文件读写的操作方法有哪些
    本篇内容介绍了“c语言文件读写的操作方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!c语言的文件读写操作:1、用fgetc()和fp...
    99+
    2023-07-04
  • sql注入写文件都有哪些函数
    sql注入写文件的函数有:文件写入使用into outfile函数,例如:union select 1,"",3,4,5 into outfile 'C:/Inetpub/wwwroot/cc.php'...
    99+
    2022-10-08
  • 引入CSS文件的方式有哪些
    这篇文章给大家介绍引入CSS文件的方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。css的三种引入方式1.行内样式,最直接最简单的一种,直接对HTML标签使用style=""。2.内嵌样式,...
    99+
    2023-06-08
  • Python中的文件读写方式有哪些?
    Python中的文件读写方式有多种,可以根据实际需要选择不同的方式。下面将介绍几种常用的文件读写方式,并给出代码示例。使用open()函数open()函数是Python提供的用于打开文件的内置函数。它可以接受文件名和打开模式作为参数,并返回...
    99+
    2023-10-22
    文件
  • Go语言zip文件的读写操作方法有哪些
    这篇文章主要介绍“Go语言zip文件的读写操作方法有哪些”,在日常操作中,相信很多人在Go语言zip文件的读写操作方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言zip文件的读写操作方法有哪些...
    99+
    2023-07-05
  • Vue导入excel文件的方式有哪些
    这篇文章主要介绍“Vue导入excel文件的方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue导入excel文件的方式有哪些”文章能帮助大家解决问题。前言两种导入文件的方法:form表单...
    99+
    2023-07-04
  • Go语言中JSON文件的读写操作方法有哪些
    这篇文章主要介绍“Go语言中JSON文件的读写操作方法有哪些”,在日常操作中,相信很多人在Go语言中JSON文件的读写操作方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中JSON文件的读写操...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作