题 如何创建文件并用Java写入?


在Java中创建和写入(文本)文件的最简单方法是什么?


1134
2018-05-21 19:58


起源




答案:


请注意,下面的每个代码示例都可能抛出 IOException。为简洁起见,省略了try / catch / finally块。看到 本教程 有关异常处理的信息。

创建一个文本文件(请注意,如果文件已经存在,这将覆盖该文件):

PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();

创建二进制文件(这也会覆盖文件):

byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();

Java 7+ 用户可以使用 Files 要写入文件的类:

创建文本文件:

List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, Charset.forName("UTF-8"));
//Files.write(file, lines, Charset.forName("UTF-8"), StandardOpenOption.APPEND);

创建二进制文件:

byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);

1457
2018-05-21 20:06



值得注意的是,如果文件已经存在,PrintWriter会将文件大小截断为零 - Covar
PrintWriter可以(通常是)使用,但不是(概念上)正确的工作类。来自文档: "PrintWriter prints formatted representations of objects to a text-output stream. " Bozho的答案更正确,虽然它看起来很麻烦(你总是可以用一些实用方法包装它)。 - leonbloy
因此,在构建应用程序并在另一台PC中使用之后,将在何处创建文本文件,因为我们还没有给出路径? - Marlon Abeykoon
@MarlonAbeykoon好问题。答案是它会在中创建文本文件 工作目录。工作目录是您执行程序的任何目录。例如,如果从命令行执行程序,则工作目录将是您当时“进入”的任何目录(在Linux上,键入“pwd”以查看当前工作目录)。或者,如果我双击桌面上的JAR文件来运行它,那么工作目录将是桌面。 - Michael
writer.close()应该在最后一块 - Thierry


在Java 7及更高版本中:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(
              new FileOutputStream("filename.txt"), "utf-8"))) {
   writer.write("something");
}

但是有一些有用的实用程序:

还要注意你 能够 用一个 FileWriter,但它使用默认编码,这通常是一个坏主意 - 最好明确指定编码。

以下是Java 7之前的原始答案


Writer writer = null;

try {
    writer = new BufferedWriter(new OutputStreamWriter(
          new FileOutputStream("filename.txt"), "utf-8"));
    writer.write("Something");
} catch (IOException ex) {
    // Report
} finally {
   try {writer.close();} catch (Exception ex) {/*ignore*/}
}

也可以看看: 阅读,编写和创建文件 (包括NIO2)。


355
2018-05-21 20:09



@leonbloy我知道这是一个陈旧的评论,但如果有人看到这个,你会介意解释为什么不“永远有益”?至少在这里它说“顶级高效” docs.oracle.com/javase/1.5.0/docs/api/java/io/... - Juan
看起来像writer没有writeln()方法。它只有write() - YankeeWhiskey
如果将编写器的类型更改为BufferedWriter(实际上是),则可以使用writer.newLine() - Niek
在finally中有一个try / catch似乎是不对的。我知道原因,但它似乎是一种代码味道。 - ashes999
@Trengot确实如此。调用 close() 在任何其他流上缠绕的任何流都将关闭所有内部流。 - Nic Hartley


如果您已经拥有要写入文件的内容(而不是动态生成),那么 java.nio.file.Files 在Java 7中添加作为本机I / O的一部分,提供了实现目标的最简单,最有效的方法。

此外,基本上创建和写入文件只是一行 一个简单的方法调用

以下示例创建并写入6个不同的文件以展示如何使用它:

Charset utf8 = StandardCharsets.UTF_8;
List<String> lines = Arrays.asList("1st line", "2nd line");
byte[] data = {1, 2, 3, 4, 5};

try {
    Files.write(Paths.get("file1.bin"), data);
    Files.write(Paths.get("file2.bin"), data,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    Files.write(Paths.get("file3.txt"), "content".getBytes());
    Files.write(Paths.get("file4.txt"), "content".getBytes(utf8));
    Files.write(Paths.get("file5.txt"), lines, utf8);
    Files.write(Paths.get("file6.txt"), lines, utf8,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
    e.printStackTrace();
}

118
2018-04-22 14:01



做得很好。我喜欢file5和file6的例子。要测试file6,请确保您运行程序两次,然后您将看到它再次附加行。 - tazboy


public class Program {
    public static void main(String[] args) {
        String text = "Hello world";
        BufferedWriter output = null;
        try {
            File file = new File("example.txt");
            output = new BufferedWriter(new FileWriter(file));
            output.write(text);
        } catch ( IOException e ) {
            e.printStackTrace();
        } finally {
          if ( output != null ) {
            output.close();
          }
        }
    }
}

69
2018-05-21 20:09



将output.close()放在finally块中会不会更好? - qed
单纯的代码永远不会构成答案。你必须解释。 - user207421
实际上这不会编译, output.close() 抛出IOException - Bob Yoplait


这是一个用于创建或覆盖文件的示例程序。它是长版本,因此可以更容易理解。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class writer {
    public void writing() {
        try {
            //Whatever the file path is.
            File statText = new File("E:/Java/Reference/bin/images/statsTest.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);    
            Writer w = new BufferedWriter(osw);
            w.write("POTATO!!!");
            w.close();
        } catch (IOException e) {
            System.err.println("Problem writing to the file statsTest.txt");
        }
    }

    public static void main(String[]args) {
        writer write = new writer();
        write.writing();
    }
}

39
2018-04-09 18:05





使用:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8))) {
    writer.write("text to write");
} 
catch (IOException ex) {
    // Handle me
}  

运用 try() 将自动关闭流。此版本简短,快速(缓冲)并允许选择编码。

此功能是在Java 7中引入的。


30
2018-04-19 14:35



应该注意这是Java 7的一个特性,因此在以前的Java版本中不起作用。 - Dan Temple
人们可以使用“常数” StandardCharsets.UTF_8 而不是“utf-8”字符串(这可以防止错字错误) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...  - java.nio.charset.StandardCharsets 是在java 7中引入的 - Ralph


在Java中创建和写入文件的一种非常简单的方法:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CreateFiles {

    public static void main(String[] args) {
        try{
            // Create new file
            String content = "This is the content to write into create file";
            String path="D:\\a\\hi.txt";
            File file = new File(path);

            // If file doesn't exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);

            // Write in file
            bw.write(content);

            // Close connection
            bw.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
}

参考: 文件在java中创建示例


30
2017-11-19 16:07



该 File.exists()/createNewFile() 这里的代码既无意义又浪费。当操作系统已经完成相同的操作时 new FileWriter() 被建造。你强迫这一切发生两次。 - user207421
File.exists()/ createNewFile()并非毫无意义且浪费。我一直在寻找一种方法来根据文件是否已经存在来执行不同的代码。这非常有帮助。 - KirstieBallance
我使用了这种方法,但你必须知道它每次都会覆盖文件。如果您希望在文件存在的情况下附加它,则必须实例化 FileWriter 如下: new FileWriter(file.getAbsoluteFile(),true) - Adelin
它是 都 无意义 和 浪费,因为我说的原因。你是造成的 二 存在测试, 二 创作, 和 删除:你是 不 根据文件是否已存在,在此处执行不同的代码。 - user207421


这里我们将一个字符串输入到文本文件中:

String content = "This is the content to write into a file";
File file = new File("filename.txt");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close(); // Be sure to close BufferedWriter

我们可以轻松创建新文件并在其中添加内容。


17
2018-06-10 11:55



请注意,关闭BufferedWriter就足够了,因为它还负责关闭FileWriter。 - rbaleksandar