ChatGPT解决这个技术问题 Extra ChatGPT

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

create and write to a (text) file in Java 最简单的方法是什么?

我可以问一下,当您可以编写包含所需代码的函数/过程/方法时,为什么简单很重要?那么你只需要调用那个函数/过程/方法。只是为了节省一些打字吗?

M
Matthias

请注意,下面的每个代码示例都可能抛出 IOException。为简洁起见,省略了 Try/catch/finally 块。有关异常处理的信息,请参阅 this tutorial

请注意,如果文件已经存在,下面的每个代码示例都将覆盖该文件

创建文本文件:

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

P
Peter Mortensen

在 Java 7 及更高版本中:

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

不过,有一些有用的实用程序:

来自 commons-io 的 FileUtils.writeStringtoFile(..)

来自番石榴的 Files.write(..)

另请注意,您可以使用 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*/}
}

另请参阅:Reading, Writing, and Creating Files(包括 NIO2)。


i
icza

如果您已经拥有要写入文件的内容(而不是动态生成的),那么作为原生 I/O 的一部分的 Java 7 中的 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();
}

H
Henry S.
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 ) {
            try {
                output.close();
            }catch (IOException e){
                e.printStackTrace();
            }
          }
        }
    }
}

A
Alexey Osetsky

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

file.exists())file.createNewFile() 部分完全是浪费时间和空间。
N
Nic

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

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

P
Peter Mortensen

利用:

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


P
Peter Mortensen

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

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

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


请注意,关闭 BufferedWriter 就足够了,因为它还负责关闭 FileWriter。
P
Peter Mortensen

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

首先,Java 6 普遍已经到了生命的尽头,由于作者没有说明他需要遗留兼容性,我猜它自动意味着 Java 7 或更高版本(Java 7 还没有被 IBM EoL'd)。所以,我们可以直接看文件 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("----------");
    [...]
}

这些方法只需要作者付出最小的努力,并且在写入 [text] 文件时应该优先于所有其他方法。


R
Rory O'Kane

如果您希望获得相对无痛的体验,您还可以查看 Apache Commons IO package,更具体地说是 FileUtils class

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

Java 是一门很棒的语言,但标准库有时有点低级。强大,但仍然低级。


M
Mehdi

以下是在 Java 中创建和写入文件的一些可能方法:

使用文件输出流

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
  bw.write("Write somthing to the file ...");
  bw.newLine();
  bw.close();
} catch (FileNotFoundException e){
  // File was not found
  e.printStackTrace();
} catch (IOException e) {
  // Problem when writing to the file
  e.printStackTrace();
}

使用 FileWriter

try {
  FileWriter fw = new FileWriter("myOutFile.txt");
  fw.write("Example of content");
  fw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

使用 PrintWriter

try {
  PrintWriter pw = new PrintWriter("myOutFile.txt");
  pw.write("Example of content");
  pw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

使用 OutputStreamWriter

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  OutputStreamWriter osw = new OutputStreamWriter(fos);
  osw.write("Soe content ...");
  osw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

有关如何read and write files in Java的进一步检查本教程。


D
Derek Hill

此答案以 Java 8 为中心,并试图涵盖 Java Professional Exam 所需的所有细节。它试图解释为什么存在不同的方法。它们各有各的好处,并且在给定的场景中每个都可能是最简单的。

涉及的课程包括:

.
├── OutputStream
│   └── FileOutputStream
├── Writer
│   ├── OutputStreamWriter
│   │   └── FileWriter
│   ├── BufferedWriter
│   └── PrintWriter (Java 5+)
└── Files (Java 7+)

文件输出流

此类用于写入原始字节流。以下所有 Writer 方法都依赖于此类,无论是显式还是 under the hood

try (FileOutputStream stream = new FileOutputStream("file.txt");) {
    byte data[] = "foo".getBytes();
    stream.write(data);
} catch (IOException e) {}

请注意,try-with-resources statement 负责处理 stream.close(),并且关闭流会刷新它,就像 stream.flush() 一样(下面的所有示例都使用这种方法)。

输出流编写器

这个类是从字符流到字节流的桥梁。它可以包装一个 FileOutputStream,并写入字符串:

Charset utf8 = StandardCharsets.UTF_8;
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File("file.txt")), utf8)) {
    writer.write("foo");
} catch (IOException e) {}

缓冲写入器

此类将文本写入字符输出流,缓冲字符,以便高效写入单个字符、数组和字符串。

它可以包装一个 OutputStreamWriter

try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("file.txt"))))) {
    writer.write("foo");
    writer.newLine();  // method provided by BufferedWriter
} catch (IOException e) {}

在 Java 5 之前,这是处理大文件的最佳方法(使用常规的 try/catch 块)。

文件编写器

这是 OutputStreamWriter 的子类,是编写字符文件的便利类:

boolean append = false;
try(FileWriter writer = new FileWriter("file.txt", append) ){
    writer.write("foo");
    writer.append("bar");
} catch (IOException e) {}

主要好处是它有一个可选的 append 构造函数参数,该参数确定它是附加到现有文件还是覆盖现有文件。请注意,附加/覆盖行为不受 write()append() 方法控制,它们在 nearly the same way 中运行。

注意:

没有缓冲,但要处理大文件,可以将其包装在 BufferedWriter 中。

FileWriter 使用默认编码。通常最好明确指定编码

打印作家

此类将对象的格式化表示形式打印到文本输出流。在底层它与上面的 BufferedWriter 方法 (new BufferedWriter(new OutputStreamWriter(new FileOutputStream(...)))) 相同。 PrintWriter 是在 Java 5 中作为调用此惯用语的便捷方式引入的,并添加了其他方法,例如 printf()println()

此类中的方法不会引发 I/O 异常。您可以通过调用 checkError() 检查错误。 PrintWriter 实例的目标可以是 File、OutputStream 或 Writer。以下是写入文件的示例:

try (PrintWriter writer = new PrintWriter("file.txt", "UTF-8")) {
    writer.print("foo");
    writer.printf("bar %d $", "a", 1);
    writer.println("baz");
} catch (FileNotFoundException e) {
} catch (UnsupportedEncodingException e) {}

写入 OutputStreamWriter 时,有一个可选的 autoFlush 构造函数参数,默认情况下为 false。与 FileWriter 不同,它将覆盖任何现有文件。

文件.write()

Java 7 引入了 java.nio.file.FilesFiles.write() 允许您在一次调用中创建和写入文件。

@icza's answer 展示了如何使用此方法。几个例子:

Charset utf8 = StandardCharsets.UTF_8;
List<String> lines = Arrays.asList("foo", "bar");

try {
    Files.write(Paths.get("file.txt"), "foo".getBytes(utf8));
    Files.write(Paths.get("file2.txt"), lines, utf8);
} catch (IOException e) {}

这不涉及缓冲区,因此不适合大文件。

Files.newBufferedWriter()

Java 7 还引入了 Files.newBufferedWriter(),它可以轻松获得 BufferedWriter

Charset utf8 = StandardCharsets.UTF_8;
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("file.txt"), utf8)) {
    writer.write("foo");
} catch (IOException e) {}

这类似于 PrintWriter,缺点是没有 PrintWriter 的方法,而它的好处是 doesn't swallow exceptions

概括

┌───────────────────────────┬──────────────────────────┬─────────────┬──────────────┐
│                           │        Buffer for        │ Can specify │   Throws     │
│                           │       large files?       │  encoding?  │ IOException? │
├───────────────────────────┼──────────────────────────┼─────────────┼──────────────┤
│ OutputStreamWriter        │ Wrap with BufferedWriter │ Y           │ Y            │
│ FileWriter                │ Wrap with BufferedWriter │             │ Y            │
│ PrintWriter               │ Y                        │ Y           │              │
│ Files.write()             │                          │ Y           │ Y            │
│ Files.newBufferedWriter() │ Y                        │ Y           │ Y            │
└───────────────────────────┴──────────────────────────┴─────────────┴──────────────┘

M
Mark Peters

如果您出于某种原因想要将创建和编写的行为分开,那么 touch 的 Java 等价物是

try {
   //create a file named "testfile.txt" in the current working directory
   File myFile = new File("testfile.txt");
   if ( myFile.createNewFile() ) {
      System.out.println("Success!");
   } else {
      System.out.println("Failure!");
   }
} catch ( IOException ioe ) { ioe.printStackTrace(); }

createNewFile() 进行存在性检查并以原子方式创建文件。例如,如果您想在写入文件之前确保您是文件的创建者,这将很有用。


不,它没有用。只是打开文件进行输出具有完全相同的效果。
user207421:我看到您过去曾在此处发布过相关问题以及相关问题,但不清楚您在争论什么。简单地打开文件进行写入确实会确保文件在您写入时存在,但这就是为什么我说“如果你想将创建和写入的行为分开”和“如果你想确保你是创建者”的文件。”从这个意义上说,不,只是打开文件进行输出并没有相同的效果。
P
Peter Mortensen

利用:

JFileChooser c = new JFileChooser();
c.showOpenDialog(c);
File writeFile = c.getSelectedFile();
String content = "Input the data here to be written to your file";

try {
    FileWriter fw = new FileWriter(writeFile);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.append(content);
    bw.append("hiiiii");
    bw.close();
    fw.close();
}
catch (Exception exc) {
   System.out.println(exc);
}

s
sajad abbasi

最好的方法是使用 Java7:Java 7 引入了一种使用文件系统的新方法,以及一个新的实用程序类——文件。使用 Files 类,我们也可以创建、移动、复制、删除文件和目录;它也可用于读取和写入文件。

public void saveDataInFile(String data) throws IOException {
    Path path = Paths.get(fileName);
    byte[] strToBytes = data.getBytes();

    Files.write(path, strToBytes);
}

使用 FileChannel 写入 如果您正在处理大文件,FileChannel 可以比标准 IO 更快。以下代码使用 FileChannel 将 String 写入文件:

public void saveDataInFile(String data) 
  throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();
    byte[] strBytes = data.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);
    stream.close();
    channel.close();
}

使用 DataOutputStream 写入

public void saveDataInFile(String data) throws IOException {
    FileOutputStream fos = new FileOutputStream(fileName);
    DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
    outStream.writeUTF(data);
    outStream.close();
}

使用 FileOutputStream 写入

现在让我们看看如何使用 FileOutputStream 将二进制数据写入文件。以下代码转换 String int 字节并使用 FileOutputStream 将字节写入文件:

public void saveDataInFile(String data) throws IOException {
    FileOutputStream outputStream = new FileOutputStream(fileName);
    byte[] strToBytes = data.getBytes();
    outputStream.write(strToBytes);

    outputStream.close();
}

使用 PrintWriter 写入,我们可以使用 PrintWriter 将格式化的文本写入文件:

public void saveDataInFile() throws IOException {
    FileWriter fileWriter = new FileWriter(fileName);
    PrintWriter printWriter = new PrintWriter(fileWriter);
    printWriter.print("Some String");
    printWriter.printf("Product name is %s and its price is %d $", "iPhone", 1000);
    printWriter.close();
}

使用 BufferedWriter 写入:使用 BufferedWriter 将字符串写入新文件:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    writer.write(data);

    writer.close();
}

将字符串附加到现有文件:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
    writer.append(' ');
    writer.append(data);

    writer.close();
}

P
Peter Mortensen

我认为这是最短的方法:

FileWriter fr = new FileWriter("your_file_name.txt"); // After '.' write
// your file extention (".txt" in this case)
fr.write("Things you want to write into the file"); // Warning: this will REPLACE your old file content!
fr.close();

P
Peter Mortensen

要创建文件而不覆盖现有文件:

System.out.println("Choose folder to create file");
JFileChooser c = new JFileChooser();
c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
c.showOpenDialog(c);
c.getSelectedFile();
f = c.getSelectedFile(); // File f - global variable
String newfile = f + "\\hi.doc";//.txt or .doc or .html
File file = new File(newfile);

try {
    //System.out.println(f);
    boolean flag = file.createNewFile();

    if(flag == true) {
        JOptionPane.showMessageDialog(rootPane, "File created successfully");
    }
    else {
        JOptionPane.showMessageDialog(rootPane, "File already exists");
    }
    /* Or use exists() function as follows:
        if(file.exists() == true) {
            JOptionPane.showMessageDialog(rootPane, "File already exists");
        }
        else {
            JOptionPane.showMessageDialog(rootPane, "File created successfully");
        }
    */
}
catch(Exception e) {
    // Any exception handling method of your choice
}

createNewFile()确实覆盖现有文件。
P
Peter Mortensen

Java 7+ 值得一试:

 Files.write(Paths.get("./output.txt"), "Information string herer".getBytes());

看起来很有希望...


p
praveenraj4ever

在 Java 8 中使用文件和路径并使用 try-with-resources 构造。

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class WriteFile{
    public static void main(String[] args) throws IOException {
        String file = "text.txt";
        System.out.println("Writing to file: " + file);
        // Files.newBufferedWriter() uses UTF-8 encoding by default
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(file))) {
            writer.write("Java\n");
            writer.write("Python\n");
            writer.write("Clojure\n");
            writer.write("Scala\n");
            writer.write("JavaScript\n");
        } // the file will be automatically closed
    }
}

s
suresh manda
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String [] args) {
        FileWriter fw= null;
        File file =null;
        try {
            file=new File("WriteFile.txt");
            if(!file.exists()) {
                file.createNewFile();
            }
            fw = new FileWriter(file);
            fw.write("This is an string written to a file");
            fw.flush();
            fw.close();
            System.out.println("File written Succesfully");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

close() 之前的 flush() 是多余的。
y
yole
package fileoperations;
import java.io.File;
import java.io.IOException;

public class SimpleFile {
    public static void main(String[] args) throws IOException {
        File file =new File("text.txt");
        file.createNewFile();
        System.out.println("File is created");
        FileWriter writer = new FileWriter(file);

        // Writes the content to the file
        writer.write("Enter the text that you want to write"); 
        writer.flush();
        writer.close();
        System.out.println("Data is entered into file");
    }
}

P
Peter Mortensen

我能找到的最简单的方法:

Path sampleOutputPath = Paths.get("/tmp/testfile")
try (BufferedWriter writer = Files.newBufferedWriter(sampleOutputPath)) {
    writer.write("Hello, world!");
}

它可能只适用于 1.7+。


J
Jonas Czech

只有一条线! pathline 是字符串

import java.nio.file.Files;
import java.nio.file.Paths;

Files.write(Paths.get(path), lines.getBytes());

P
Peter Mortensen

使用输入输出流读写文件:

//Coded By Anurag Goel
//Reading And Writing Files
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class WriteAFile {
    public static void main(String args[]) {
        try {
            byte array [] = {'1','a','2','b','5'};
            OutputStream os = new FileOutputStream("test.txt");
            for(int x=0; x < array.length ; x++) {
                os.write( array[x] ); // Writes the bytes
            }
            os.close();

            InputStream is = new FileInputStream("test.txt");
            int size = is.available();

            for(int i=0; i< size; i++) {
                System.out.print((char)is.read() + " ");
            }
            is.close();
        } catch(IOException e) {
            System.out.print("Exception");
        }
    }
}

P
Peter Mortensen

只需包含此软件包:

java.nio.file

然后您可以使用此代码编写文件:

Path file = ...;
byte[] buf = ...;
Files.write(file, buf);

a
akhil_mittal

如果我们使用 Java 7 及以上版本并且知道要添加(附加)到文件中的内容,我们可以使用 NIO 包中的 newBufferedWriter 方法。

public static void main(String[] args) {
    Path FILE_PATH = Paths.get("C:/temp", "temp.txt");
    String text = "\n Welcome to Java 8";

    //Writing to the file temp.txt
    try (BufferedWriter writer = Files.newBufferedWriter(FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
        writer.write(text);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

有几点需要注意:

指定字符集编码总是一个好习惯,为此我们在 StandardCharsets 类中有常量。该代码使用 try-with-resource 语句,其中资源在尝试后自动关闭。

虽然 OP 没有询问,但如果我们想搜索具有某些特定关键字的行,例如 confidential,我们可以在 Java 中使用流 API:

//Reading from the file the first line which contains word "confidential"
try {
    Stream<String> lines = Files.lines(FILE_PATH);
    Optional<String> containsJava = lines.filter(l->l.contains("confidential")).findFirst();
    if(containsJava.isPresent()){
        System.out.println(containsJava.get());
    }
} catch (IOException e) {
    e.printStackTrace();
}

J
Jan Bodnar

使用 Google 的 Guava 库,我们可以非常轻松地创建和写入文件。

package com.zetcode.writetofileex;

import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;

public class WriteToFileEx {

    public static void main(String[] args) throws IOException {

        String fileName = "fruits.txt";
        File file = new File(fileName);

        String content = "banana, orange, lemon, apple, plum";

        Files.write(content.getBytes(), file);
    }
}

该示例在项目根目录中创建一个新的 fruits.txt 文件。


P
Peter Mortensen

有一些简单的方法,例如:

File file = new File("filename.txt");
PrintWriter pw = new PrintWriter(file);

pw.write("The world I'm coming");
pw.close();

String write = "Hello World!";

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

fw.write(write);

fw.close();

P
Peter Mortensen

您甚至可以使用系统属性创建一个临时文件,该文件与您使用的操作系统无关。

File file = new File(System.*getProperty*("java.io.tmpdir") +
                     System.*getProperty*("file.separator") +
                     "YourFileName.txt");

s
shareef

至少有几种创建文件和写入文件的方法:

小文件 (1.7)

您可以使用其中一种写入方法将字节或行写入文件。

Path file = Paths.get("path-to-file");
byte[] buf = "text-to-write-to-file".getBytes();
Files.write(file, buf);

这些方法为您处理大部分工作,例如打开和关闭流,但不适用于处理大文件。

使用缓冲流 I/O 写入更大的文件 (1.7)

java.nio.file 包支持通道 I/O,它在缓冲区中移动数据,绕过一些可能成为流 I/O 瓶颈的层。

String s = "much-larger-text-to-write-to-file";
try (BufferedWriter writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
    writer.write(s, 0, s.length());
}

由于其高效的性能,尤其是在完成大量写入操作时,这种方法是首选的。缓冲操作具有这种效果,因为它们不需要为每个字节调用操作系统的写入方法,从而减少了昂贵的 I/O 操作。

使用 NIO API 复制(并创建一个新的)带有输出流的文件(1.7)

Path oldFile = Paths.get("existing-file-path");
Path newFile = Paths.get("new-file-path");
try (OutputStream os = new FileOutputStream(newFile.toFile())) {
    Files.copy(oldFile, os);
}

还有其他方法允许将所有字节从输入流复制到文件。

FileWriter(文本)(<1.7)

直接写入文件(性能较低),仅应在写入次数较少时使用。用于将面向字符的数据写入文件。

String s= "some-text";
FileWriter fileWriter = new FileWriter("C:\\path\\to\\file\\file.txt");
fileWriter.write(fileContent);
fileWriter.close();

FileOutputStream (二进制) (<1.7)

FileOutputStream 用于写入原始字节流,例如图像数据。

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

使用这种方法,应该考虑始终写入一个字节数组,而不是一次写入一个字节。加速可能非常显着 - 高达 10 倍或更多。因此,建议尽可能使用 write(byte[]) 方法。