java中创建写入文件的6种方式详解与源码实例

 更新时间:2022年12月10日 14:15:07   作者:啊猿  
这篇文章主要介绍了java中创建写入文件的6种方式详解与源码实例,Files.newBufferedWriter(Java 8),Files.write(Java 7 推荐),PrintWriter,File.createNewFile,FileOutputStream.write(byte[] b) 管道流,需要的朋友可以参考下

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

  • Files.newBufferedWriter(Java 8)
  • Files.write(Java 7 推荐)
  • PrintWriter
  • File.createNewFile
  • FileOutputStream.write(byte[] b) 管道流

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

以前我在写技术文章涉及到“流关闭”、“连接关闭”的时候,经常有人留言:“还写技术文章,写个流都不知道close()”,这种留言我遇到过无数回!
在本文中大量的使用到了try-with-resources语法,这个语法真的是很久的了,但是的确还有小伙伴不知道(知道的小伙伴就略过吧)。我还是说一下,下文中的管道流不是我没close,是自动关闭close的。

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

1. Java 8 Files.newBufferedWriter

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

@Test
void testCreateFile1() throws IOException {
  String fileName = "D:\\data\\test\\newFile.txt";
 
  Path path = Paths.get(fileName);
  // 使用newBufferedWriter创建文件并写文件
  // 这里使用了try-with-resources方法来关闭流,不用手动关闭
  try (BufferedWriter writer =
          Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
   writer.write("Hello World -创建文件!!");
  }
 
  //追加写模式
  try (BufferedWriter writer =
        Files.newBufferedWriter(path,
            StandardCharsets.UTF_8,
            StandardOpenOption.APPEND)){
    writer.write("Hello World -字母哥!!");
  }
}

2. Java 7 Files.write

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

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

3. PrintWriter

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

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

4. File.createNewFile()

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

@Test
void testCreateFile4() throws IOException {
  String fileName = "D:\\data\\test\\newFile4.txt";
 
  File file = new File(fileName);
 
  // 返回true表示文件成功
  // false 表示文件已经存在
  if (file.createNewFile()) {
   System.out.println("创建文件成功!");
  } else {
   System.out.println("文件已经存在不需要重复创建");
  }
 
  // 使用FileWriter写文件
  try (FileWriter writer = new FileWriter(file)) {
   writer.write("Hello World -创建文件!!");
  }
 
}

5.最原始的管道流方法

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

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

6、文件工具类

import org.apache.commons.io.FileUtils;
​​​​​​​public static void saveTxt(String filePath, String fileName, String data){
    try{
        File folder = new File(filePath);
        if(!folder.exists()){
            folder.mkdirs();
        }
        File file = new File(filePath + "/" + fileName);
        FileUtils.writeStringToFile(file,data,"UTF-8");
    }catch(IOEException e){
        log.error("error")
    }
}

以上就是6种java创建写入文件的方式,包括源码实例,更多关于JAVA创建读写文件的方法请查看下面的相关链接

相关文章

  • Django之多对多查询与操作方法详解

    Django之多对多查询与操作方法详解

    这篇文章主要介绍了Django之多对多查询与操作方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java数据导出功能之导出Excel文件实例

    Java数据导出功能之导出Excel文件实例

    这篇文章主要介绍了Java数据导出功能之导出Excel文件实例,本文给出了jar包的下载地址,并给出了导出Excel文件代码实例,需要的朋友可以参考下
    2015-06-06
  • Java如何远程调用对方接口

    Java如何远程调用对方接口

    这篇文章主要介绍了Java如何远程调用对方接口问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java读取文件内容,解析Json格式数据方式

    java读取文件内容,解析Json格式数据方式

    这篇文章主要介绍了java读取文件内容,解析Json格式数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 使用java技术抓取网站上彩票双色球信息详解

    使用java技术抓取网站上彩票双色球信息详解

    这篇文章主要介绍了使用java技术抓取网站上彩票双色球信息详解,web结果由html+js+css组成,html结构都有一定的规范,数据动态交互可以通过js实现。,需要的朋友可以参考下
    2019-06-06
  • java LinkedList的实例详解

    java LinkedList的实例详解

    这篇文章主要介绍了java LinkedList的实例详解的相关资料,通过本文希望大家能彻底了解掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Java中的泛型和泛型通配符详解

    Java中的泛型和泛型通配符详解

    这篇文章主要介绍了Java中的泛型和泛型通配符详解,泛型的作用就是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的在没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,需要的朋友可以参考下
    2023-07-07
  • java判断域名无法访问自行访问下一条

    java判断域名无法访问自行访问下一条

    这篇文章主要为大家介绍了java实现判断域名无法访问的时候自行访问下一条域名示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • spring cloud Hystrix断路器的使用(熔断器)

    spring cloud Hystrix断路器的使用(熔断器)

    这篇文章主要介绍了spring cloud Hystrix断路器的使用(熔断器),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 浅谈mac下maven的安装配置与使用

    浅谈mac下maven的安装配置与使用

    这篇文章主要介绍了浅谈mac下maven的安装配置与使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论