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


Answers:


1735

请注意,下面的每个代码示例都可能抛出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);

58
值得注意的是,如果文件已存在,PrintWriter会将文件大小截断为零
Covar,2010年

34
可以(通常)使用PrintWriter,但在概念上不是合适的类。从文档:"PrintWriter prints formatted representations of objects to a text-output stream. "Bozho的答案虽然看起来很麻烦(您可以总是将其包装在某些实用程序方法中),但更正确。
leonbloy 2010年

14
那么,由于我们没有给出路径,在构建应用程序并在另一台PC中使用该文本文件后,它将在哪里创建?
Marlon Abeykoon 2014年

13
@MarlonAbeykoon好问题。答案是它将在工作目录中创建文本文件。工作目录是您从中执行程序的任何目录。例如,如果您从命令行执行程序,则工作目录将是此时您所在的目录(在Linux上,键入“ pwd”以查看当前工作目录)。或者,如果我双击桌面上的一个JAR文件来运行它,则工作目录将是桌面。
迈克尔

8
writer.close()应该在最后一个障碍中
蒂埃里(Thierry)

416

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


5
@leonbloy我知道这是一条旧评论,但是如果有人看到了,您介意解释为什么“永远不会有益”吗?至少在这里,它说“顶高效” docs.oracle.com/javase/1.5.0/docs/api/java/io/...
胡安

14
看来writer没有writeln()方法。它只有write()
YankeeWhiskey

10
如果将writer的类型更改为BufferedWriter(实际上是),则可以使用writer.newLine()
Niek

4
在体检中进行try / catch似乎不正确。我知道原因,但似乎有代码味。
ashes999

4
@Trengot确实如此。调用close()环绕其他任何流的任何流也将关闭所有内部流。
基金莫妮卡的诉讼

132

如果您已经有了要写入文件的内容(并且不是即时生成的),则java.nio.file.FilesJava 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();
}

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

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

18
将output.close()放在finally块中会更好吗?
2014年

7
仅仅代码不可能在这里构成答案。你必须解释。
user207421 '17

7
实际上,它将无法编译,并output.close()引发IOException
Bob Yoplait

43

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

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

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

7
File.exists()/createNewFile()这里的代码既没有意义又浪费。创建时,操作系统已经必须做完全相同的事情new FileWriter()。您要强迫这一切发生两次。
user207421 '16

1
File.exists()/ createNewFile()并非毫无意义且浪费。我一直在寻找一种根据文件是否已存在执行不同代码的方法。这非常有帮助。
KirstieBallance

2
我使用了这种方法,但是您必须知道它每次都会覆盖文件。如果要在文件存在的情况下附加它,则必须实例化FileWriter如下:new FileWriter(file.getAbsoluteFile(),true)
Adelin

2
这是没有意义浪费,因为我说的原因。您要进行两个存在性测试,两个创建一个删除操作:并且根据文件是否已经存在,您没有在这里执行不同的代码。
user207421 '18

34

采用:

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


5
应当注意,这是Java 7功能,因此在Java的早期版本中将无法使用。
丹·

3
一个人可以使用“常量” StandardCharsets.UTF_8而不是“ utf-8”字符串(这可以防止输入错误) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...- java.nio.charset.StandardCharsets在Java 7中引入
拉尔夫(Ralph)

20

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

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。
rbaleksandar

17

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


首先,Java 6通常已经寿终正寝,并且由于作者没有指定他需要旧版兼容性,所以我想它自动意味着Java 7或更高版本(Java尚未被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("----------");
    [...]
}

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


“如果无法写入/添加文件,则可能甚至无法知道原因”,这是不正确的。从FileNotFoundException操作失败时引发的文本中,您将确切地知道原因。
user207421 '16

“许多方法在失败时都不会引发异常,因此无法获得有用的错误消息。例如,如果文件删除失败,程序将收到“删除失败”的消息,但不知道这是因为文件不存在,用户没有权限或其他问题。”
afk5min

阅读我写的东西。“ 如果无法写入/添加文件,您甚至可能无法获得有用的错误消息”,由于我所述的原因,这是不正确的,并且仍然如此。您正在更改主题。你自己的主题。
user207421 '17

我将检查典型文件系统的内置实现(这将在OpenJDK中进行,但是我没有理由认为这部分在专有Oracle JDK中会有所不同,或者在专有IBM JDK中会显着不同)并进行更新基于这些发现我的答案。您的评论的确有道理-只是因为“许多方法”可能存在问题,作者明确指出这只是他们关心的写入/追加到文件操作。
afk5min

这样做的原因是,您所调用的方法都不会抛出包含适当错误消息的适当异常。如果您有支持您的断言的反例,则应由您提供。
user207421 '17

16

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

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

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


1
中最简单的文件写入方法FileUtilsstatic void write(File file, CharSequence data)。用法示例:import org.apache.commons.io.FileUtils; FileUtils.write(new File("example.txt"), "string with data");FileUtils还具有writeLines,需要Collection一行。
罗里·奥肯

12

如果您出于某种原因想要将创建和写入操作分开,则Java的等效项touch

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()进行存在检查并自动创建文件。例如,如果您想确保自己是文件的创建者,这将很有用。


1
[touch]还会更新文件的时间戳,这是一个副作用(如果已经存在)。这也有副作用吗?
Ape-in​​ago13年

@ Ape-in​​ago:在我的系统上肯定没有(它只会返回false,并且对文件没有影响)。我并不是touch一般意义上的意思,而是其常见的次要用法是创建文件而不向其写入数据。记录的触摸目的是更新文件上的时间戳。如果不存在则创建文件确实是副作用,可以通过开关禁用该文件。
马克·彼得斯

由于什么原因?这些exists()/createNewFile()序列实际上是在浪费时间和空间。
user207421 '16

12

以下是一些使用Java创建和写入文件的可能方式:

使用FileOutputStream

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

有关进一步的内容,请参见有关如何在Java中读取和写入文件的本教程。


只是不知道......不应该FileWriterOutputStreamWriter在封闭finally块?
Wolfgang Schreurs,

@WolfgangSchreurs,是的,甚至更好,我必须将变量声明移到try bloc之外才能执行该操作。
Mehdi

我只是想知道,即使更干净,也可以使用自动关闭功能,无需在块外声明变量,即使发生异常(需要显式添加finally块),资源也会自动关闭。请参阅:docs.oracle.com/javase/tutorial/essential/exceptions/...
沃尔夫冈Schreurs的

我将try-with-resources作为一个单独的示例添加(以分隔不同的可能性)。您知道SOF是一个协作网站,如果希望,请继续修改答案。
Mehdi

10

采用:

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

这是我找到的最简单的方法...这里解决了所有问题,只需要插入文本
Rohit ZP 2014年

10

最好的方法是使用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();
}

9

我认为这是最短的方法:

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

8

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

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
}

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

这些exists()/createNewFile()序列实际上是在浪费时间和空间。
user207421 '16

6
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");
    }
}

这些exists()/createNewFile()序列实际上是在浪费时间和空间。
user207421 '16

5

仅一行! path并且line是字符串

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

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

哎呀,作者明确指定了“文本”文件。文本文件由字符组成。二进制文件由字节组成。除此之外,还不清楚是什么lines。如果为java.lang.String,则调用getBytes()将使用平台默认编码生成字节,这在通常情况下不是很好。
afk5min 2015年

5

我可以找到的最简单方法:

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

它可能仅适用于1.7+。


5

Java 7+值得一试:

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

看起来很有希望...


4

如果我们使用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();
    }
}

有几点要注意:

  1. 指定charset编码始终是一个好习惯,为此我们在类中具有常量StandardCharsets
  2. 该代码使用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();
}

4

使用输入和输出流进行文件读写:

//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");
        }
    }
}

4

只需包括以下软件包:

java.nio.file

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

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

4

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

3

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

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

bw未使用。
user207421 '16

并且没有说明用新内容覆盖文件的要点。
user207421 '18

3

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

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

2

使用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在项目根目录中创建一个新文件。


2

使用JFilechooser与客户一起阅读收藏并保存到文件中。

private void writeFile(){

    JFileChooser fileChooser = new JFileChooser(this.PATH);
    int retValue = fileChooser.showDialog(this, "Save File");

    if (retValue == JFileChooser.APPROVE_OPTION){

        try (Writer fileWrite = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileChooser.getSelectedFile())))){

            this.customers.forEach((c) ->{
                try{
                    fileWrite.append(c.toString()).append("\n");
                }
                catch (IOException ex){
                    ex.printStackTrace();
                }
            });
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

2

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

小文件(1.7)

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

Path file = Paths.get("path-to-file");
byte[] buf = "text-to-write-to-file".;
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());
}

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

使用NIO API复制(并创建一个新文件)具有Outputstream(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[])方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.