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

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

答案

请注意,下面的每个代码示例都可能抛出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, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);

创建一个二进制文件:

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

在 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)。

如果您已经具有要写入文件的内容(并且不是即时生成的),那么 Java 7 中作为本地 I / O 的java.nio.file.Files附加功能提供了最简单,最有效的方法你的目标。

基本上,创建和写入文件仅一行,而且一个简单的方法调用

以下示例创建并写入 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();
}
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();
          }
        }
    }
}

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

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();
    }
}

用 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);
        }
    }
}

采用:

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 中引入的。

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

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

我们可以轻松地创建一个新文件并向其中添加内容。

如果您希望获得相对轻松的体验,还可以查看Apache Commons IO 软件包 ,更具体地说是FileUtils

永远不要忘记检查第三方库。 Joda-Time用于日期操作, Apache Commons Lang StringUtils用于常见的字符串操作,此类操作可使您的代码更具可读性。

Java 是一种很棒的语言,但是标准库有时有点底层。功能强大,但水平较低。

由于作者没有指定他们是否需要针对已经 EoL 的 Java 版本(Sun 和 IBM 都使用,从技术上讲,它们是最广泛的 JVM)的解决方案,并且由于大多数人似乎已经回答了在指定作者是文本(非二进制)文件之前的问题,我决定提供答案。


首先,Java 6 通常已经寿终正寝,并且由于作者没有指定他需要旧版兼容性,所以我想它会自动意味着 Java 7 或更高版本(Java 7 尚未被 IBM 终止)。因此,我们可以直接查看文件 I / O 教程: https : //docs.oracle.com/javase/tutorial/essential/io/legacy.html

在 Java SE 7 发行版之前,java.io.File 类是用于文件 I / O 的机制,但是它有几个缺点。

  • 许多方法在失败时都不会引发异常,因此无法获得有用的错误消息。例如,如果文件删除失败,则程序将收到 “删除失败” 信息,但不知道是否是由于文件不存在,用户没有权限或其他问题。
  • 重命名方法在跨平台上无法始终如一地工作。
  • 没有对符号链接的真正支持。
  • 需要对元数据的更多支持,例如文件权限,文件所有者和其他安全属性。访问文件元数据效率低下。
  • 许多 File 方法无法扩展。在服务器上请求大型目录列表可能会导致挂起。大目录还可能导致内存资源问题,从而导致拒绝服务。
  • 如果存在圆形符号链接,则不可能编写可靠的代码来递归遍历文件树并做出适当响应。

哦,那排除了 java.io.File。如果无法写入 / 添加文件,您甚至可能不知道为什么。


我们可以继续查看该教程: https : //docs.oracle.com/javase/tutorial/essential/io/file.html#common

如果您具有所有行,则将提前写入(附加)到文本文件 ,建议的方法是https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# write-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-

这是一个示例(简化):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, StandardCharsets.UTF_8);

另一个示例(附加):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE);

如果您想随手编写文件内容https : //docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-

简化示例(Java 8 或更高版本):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file)) {
    writer.append("Zero header: ").append('0').write("\r\n");
    [...]
}

另一个示例(附加):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {
    writer.write("----------");
    [...]
}

这些方法所需的工作量很小,在写入 [文本] 文件时应优先于所有其他方法。