总结Java中创建并写文件的5种方式

新闻 后端
在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法。

 在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法。

  1. Files.newBufferedWriter 
  2. Files.write 
  3. PrintWriter 
  4. File.createNewFile 
  5. FileOutputStream.write(byte[] b) 

实际上不只这5种,通过管道流的排列组合,其实有更多种,但是笔者总结的这五种可以说是最常用及最佳实践,

前提小知识

以前我在写技术文章涉及到“流关闭”、“连接关闭”的时候,经常有人留言:“还写技术文章,写个流都不知道close()”,这种留言我遇到过无数回!

在本文中大量的使用到了try-with-resources语法,这个语法真的是很久的了,但是的确还有小伙伴不知道(知道的小伙伴就略过吧)。我还是说一下,下文中的管道流不是我没close,是自动关闭close的。

  1. try(管道流、连接等实现了Closeable接口的类){ 
  2.     //这里使用类对象操作 
  3. //用try()包含起来,就不用在finally里面自己手动的去 Object.close()了,会自动的关闭 

1. Java 8 Files.newBufferedWriter

java8 提供的newBufferedWriter可以创建文件,并向文件内写入数据。可以通过追加写模式,向文件内追加内容。

  1. @Test 
  2. void testCreateFile1() throws IOException { 
  3.    String fileName = "D:\\data\\test\\newFile.txt"
  4.  
  5.    Path path = Paths.get(fileName); 
  6.    // 使用newBufferedWriter创建文件并写文件 
  7.    // 这里使用了try-with-resources方法来关闭流,不用手动关闭 
  8.    try (BufferedWriter writer = 
  9.                    Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { 
  10.       writer.write("Hello World -创建文件!!"); 
  11.    } 
  12.  
  13.    //追加写模式 
  14.    try (BufferedWriter writer = 
  15.                 Files.newBufferedWriter(path, 
  16.                         StandardCharsets.UTF_8, 
  17.                         StandardOpenOption.APPEND)){ 
  18.        writer.write("Hello World -字母哥!!"); 
  19.    } 

2. Java 7 Files.write

下面的这种方式 Files.write ,是笔者推荐的方式,语法简单,而且底层是使用Java NIO实现的。同样提供追加写模式向已经存在的文件种追加数据。这种方式是实现文本文件简单读写最方便快捷的方式。

  1. @Test 
  2. void testCreateFile2() throws IOException { 
  3.    String fileName = "D:\\data\\test\\newFile2.txt"
  4.  
  5.    // 从JDK1.7开始提供的方法 
  6.    // 使用Files.write创建一个文件并写入 
  7.    Files.write(Paths.get(fileName), 
  8.                "Hello World -创建文件!!".getBytes(StandardCharsets.UTF_8)); 
  9.  
  10.    // 追加写模式 
  11.    Files.write( 
  12.          Paths.get(fileName), 
  13.          "Hello World -字母哥!!".getBytes(StandardCharsets.UTF_8), 
  14.          StandardOpenOption.APPEND); 

3. PrintWriter

PrintWriter是一个比较古老的文件创建及写入方式,从JDK1.5就已经存在了,比较有特点的是:PrintWriter的println方法,可以实现一行一行的写文件。

  1. @Test 
  2. void testCreateFile3() throws IOException { 
  3.    String fileName = "D:\\data\\test\\newFile3.txt"
  4.  
  5.    // JSD 1.5开始就已经存在的方法 
  6.    try (PrintWriter writer = new PrintWriter(fileName, "UTF-8")) { 
  7.       writer.println("Hello World -创建文件!!"); 
  8.       writer.println("Hello World -字母哥!!"); 
  9.    } 
  10.  
  11.    // Java 10进行了改进,支持使用StandardCharsets指定字符集 
  12.    /*try (PrintWriter writer = new PrintWriter(fileName, StandardCharsets.UTF_8)) { 
  13.  
  14.       writer.println("first line!"); 
  15.       writer.println("second line!"); 
  16.  
  17.    } */ 
  18.  

4. File.createNewFile()

createNewFile()方法的功能相对就比较纯粹,只是创建文件不做文件写入操作。 返回true表示文件成功,返回 false表示文件已经存在.可以配合FileWriter 来完成文件的写操作。

  1. @Test 
  2. void testCreateFile4() throws IOException { 
  3.    String fileName = "D:\\data\\test\\newFile4.txt"
  4.  
  5.    File file = new File(fileName); 
  6.  
  7.    // 返回true表示文件成功 
  8.    // false 表示文件已经存在 
  9.    if (file.createNewFile()) { 
  10.       System.out.println("创建文件成功!"); 
  11.    } else { 
  12.       System.out.println("文件已经存在不需要重复创建"); 
  13.    } 
  14.  
  15.    // 使用FileWriter写文件 
  16.    try (FileWriter writer = new FileWriter(file)) { 
  17.       writer.write("Hello World -创建文件!!"); 
  18.    } 
  19.  

5.最原始的管道流方法

最原始的方式就是使用管道流嵌套的方法,但是笔者觉得这种方法历久弥新,使用起来非常灵活。你想去加上Buffer缓冲,你就嵌套一个BufferedWriter,你想去向文件中写java对象你就嵌套一个ObjectOutputStream。但归根结底要用到FileOutputStream。

  1. @Test 
  2. void testCreateFile5() throws IOException { 
  3.    String fileName = "D:\\data\\test\\newFile5.txt"
  4.    try(FileOutputStream fos = new FileOutputStream(fileName); 
  5.       OutputStreamWriter osw = new OutputStreamWriter(fos); 
  6.       BufferedWriter bw = new BufferedWriter(osw);){ 
  7.       bw.write("Hello World -创建文件!!"); 
  8.       bw.flush(); 
  9.    } 

 

责任编辑:张燕妮 来源: 博客园
相关推荐

2019-11-21 11:10:21

云迁移云计算

2022-03-18 09:42:54

JavaString

2022-11-17 15:17:12

Java数据结构Map

2019-05-16 13:00:18

异步编程JavaScript回调函数

2012-02-16 10:36:43

Java

2019-05-29 19:00:35

HTML5存储方式前端

2019-01-14 05:09:03

5G网络4G

2023-07-05 11:14:35

IT领导者IT咨询

2022-07-22 08:18:28

JARJava对象

2017-06-14 16:44:15

JavaScript原型模式对象

2010-03-18 15:31:13

Java创建线程

2019-10-10 11:50:38

Java线程开发

2021-06-17 10:33:29

IT首席意见企业实践

2020-10-27 18:47:30

物联网环境IOT

2021-05-06 16:19:36

物联网IoT

2024-01-10 08:20:50

Linux编辑器pico

2020-04-26 22:22:10

物联网广告IOT

2020-06-17 08:12:05

Kubernetes容器

2021-12-01 15:40:40

节日开源剪贴画

2011-03-23 11:22:14

oracle dbli
点赞
收藏

51CTO技术栈公众号