如何使用Java将String保存到文本文件?

Jus*_*ite 667 java file-io file text-files

在Java中,我有一个名为"text"的String变量中的文本字段的文本.

如何将"text"变量的内容保存到文件中?

Jer*_*yth 706

如果您只是输出文本而不是任何二进制数据,则以下内容将起作用:

PrintWriter out = new PrintWriter("filename.txt");
Run Code Online (Sandbox Code Playgroud)

然后,将String写入它,就像您对任何输出流一样:

out.println(text);
Run Code Online (Sandbox Code Playgroud)

你需要像往常一样处理异常处理.out.close()写完后一定要打电话.

如果您使用的是Java 7或更高版本,则可以使用" try-with-resources语句 ",它将PrintStream在您完成时自动关闭(即退出块),如下所示:

try (PrintWriter out = new PrintWriter("filename.txt")) {
    out.println(text);
}
Run Code Online (Sandbox Code Playgroud)

您仍然需要java.io.FileNotFoundException像以前一样显式抛出.

  • 在java8中你可以尝试(PrintStream ps = new PrintStream("filename")){ps.println(out); 这将为你处理 (20认同)
  • 虽然在某些时候需要关闭该文件......?http://www.codecodex.com/wiki/ASCII_file_save#Java (10认同)
  • 顺便说一句,这可以使用PrintStream自1.5以来的便利构造函数进行简化.这就足够了:PrintStream out = new PrintStream("filename.txt"); (7认同)
  • @Justin,您还可以将绝对路径(例如"/tmp/filename.txt")传递给FileOutputStream构造函数,以将文件保存到您想要的任何位置 (4认同)
  • 你想使用try {} catch(){} finally {},在最后{}你关闭文件,如果它不是null. (2认同)

Jon*_*Jon 237

Apache Commons IO包含一些很好的方法,特别是FileUtils包含以下方法:

static void writeStringToFile(File file, String data) 
Run Code Online (Sandbox Code Playgroud)

它允许您在一个方法调用中将文本写入文件:

FileUtils.writeStringToFile(new File("test.txt"), "Hello File");
Run Code Online (Sandbox Code Playgroud)

您可能还需要考虑指定文件的编码.

  • 只是一个小的修正,第二个片段应该是:FileUtils.writeStringToFile(new File("test.txt"),"Hello File"); (10认同)
  • 该函数现已弃用,您应该添加默认字符集 - >`FileUtils.writeStringToFile(new File("test.txt"),"Hello File",forName("UTF-8"));` (10认同)
  • 对于我们这些喜欢番石榴的人来说,[它也可以这样做](http://stackoverflow.com/questions/1053467/how-do-i-save-a-string-to-a-text-file-using-爪哇/ 11254277#11254277). (3认同)

Jor*_*orn 91

看一下Java File API

一个简单的例子:

try (PrintStream out = new PrintStream(new FileOutputStream("filename.txt"))) {
    out.print(text);
}
Run Code Online (Sandbox Code Playgroud)

  • 别忘了叫out.flush(); 然后out.close(); (5认同)
  • 请注意,out.close() 已经刷新了流,这意味着不需要调用 out.flush()。 (2认同)

Art*_*ger 78

刚刚在我的项目中做了类似的事情.使用FileWriter将简化部分工作.在这里你可以找到很好的教程.

BufferedWriter writer = null;
try
{
    writer = new BufferedWriter( new FileWriter( yourfilename));
    writer.write( yourstring);

}
catch ( IOException e)
{
}
finally
{
    try
    {
        if ( writer != null)
        writer.close( );
    }
    catch ( IOException e)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当异常真的发生时,吞噬这样的异常将使你的生活变得艰难.至少你应该重新抛出它们:`throw new RuntimeException(e);` (14认同)
  • 所以,展示你简单而好的解决方案.我很乐意以更好的方式学习如何做到这一点. (6认同)
  • 忽略巨魔......他们总是批评而不提供自己的解决方案.感谢您免于编写我自己的代码/下载额外的库并引入依赖... (4认同)
  • 删除所有try/catch并简化它我也可以通过执行以下操作在一行中完成:( new BufferedWriter(new FileWriter(filename))).write(str); (3认同)
  • 看起来 `.close()` 不会抛出异常(至少在 Java 7 中?),最后一个 trycatch 可能是多余的吗? (2认同)

Dan*_*lev 75

在Java 7中,您可以这样做:

String content = "Hello File!";
String path = "C:/a.txt";
Files.write( Paths.get(path), content.getBytes());
Run Code Online (Sandbox Code Playgroud)

这里有更多信息:http: //www.drdobbs.com/jvm/java-se-7-new-file-io/231600403

  • `content.getBytes(StandardCharsets.UTF_8)`可用于显式定义编码. (3认同)
  • 如果以后有人想知道,则编码将是平台标准。 (2认同)
  • 在 java 11 中,您可以简单地将字符串作为第二个参数!万岁! (2认同)

ska*_*man 60

使用FileUtils.writeStringToFile()来自Apache的百科全书IO.无需重新发明这个特殊的轮子.

  • 我不能不同意.这些库是存在的,因此我们不会在这样一个简单的解决方案中引入细微的错误. (20认同)
  • 我有,是的,但那是在我找到公地之前.自从发现以来,即使在一流的项目中,我也从未亲手编写过这类东西.如果我从第一天开始就知道它,我就从第一天就开始使用它了. (8认同)
  • 确切地说,但你是一个经验丰富的开发人员.你的生物说你的JBOSS/Spring用户,但你肯定不会在你的第一个"Hello,World"努力中遇到任何一个.我并不反对正确使用库.我说第一次尝试语言的人应该尝试在底层知道它,即使这意味着他们会在他们经验丰富并且知道得更好的情况下做一些事情. (5认同)
  • 不,显然不是.我只是不同意你的解决方案可能不是我给那些初学者Java程序员的第一件事.你并不是说你从未写过这样的东西,是吗? (3认同)
  • 我没有公共地实现了这个,并且抛出了一个不太明显的异常.然后我使用commons实现了它,它告诉我到底出了什么问题.故事的道德:如果你不需要,为什么要生活在黑暗时代? (2认同)

小智 22

您可以使用修改下面的代码从处理文本的任何类或函数中编写您的文件.人们想知道为什么世界需要一个新的文本编辑器......

import java.io.*;

public class Main {

    public static void main(String[] args) {

        try {
            String str = "SomeMoreTextIsHere";
            File newTextFile = new File("C:/thetextfile.txt");

            FileWriter fw = new FileWriter(newTextFile);
            fw.write(str);
            fw.close();

        } catch (IOException iox) {
            //do stuff with exception
            iox.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果发生异常,则不会关闭该文件. (2认同)

Mar*_*cel 18

Java 11中,java.nio.file.Files类通过两个新的实用程序方法进行了扩展,将字符串写入文件(请参阅此处此处的 JavaDoc ).在最简单的情况下,它现在是一个单行:

Files.writeString(Path.of("my", "path"), "My String");
Run Code Online (Sandbox Code Playgroud)

使用可选的Varargs参数,可以设置其他选项,例如附加到现有文件或自动创建不存在的文件(请参阅此处的 JavaDoc ).

  • 这需要更多的赞成票。答案被隐藏在该问题提供的大量答案中,但它优于其中的许多答案。*例如*只需要最少量的行,也不依赖于 Apache Commons。 (3认同)

Spi*_*ina 12

我希望尽可能依赖库来进行这种操作.这使我不太可能意外地省略了一个重要的步骤(如上面的错误狼人).上面提到了一些库,但我最喜欢的是Google Guava.Guava有一个名为Files的类,可以很好地完成这项任务:

// This is where the file goes.
File destination = new File("file.txt");
// This line isn't needed, but is really useful 
// if you're a beginner and don't know where your file is going to end up.
System.out.println(destination.getAbsolutePath());
try {
    Files.write(text, destination, Charset.forName("UTF-8"));
} catch (IOException e) {
    // Useful error handling here
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你正在使用番石榴,还有`Charsets.UTF-8`. (2认同)
  • @florian:实际上是`Charsets.UTF_8` (2认同)
  • Files.write(CharSequence from, File to, Charset charset) 在 guava 26.0 中已弃用。 (2认同)

小智 12

使用Apache Commons IO api.这很简单

使用API​​作为

 FileUtils.writeStringToFile(new File("FileNameToWrite.txt"), "stringToWrite");
Run Code Online (Sandbox Code Playgroud)

Maven依赖

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


小智 12

如果您需要基于单个字符串创建文本文件:

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

public class StringWriteSample {
    public static void main(String[] args) {
        String text = "This is text to be saved in file";

        try {
            Files.write(Paths.get("my-file.txt"), text.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Files.write(path, byte[]) 将使用 UTF-8 编码。String.getBytes() 使用默认平台编码。所以这是一个潜在的问题。使用 string.getBytes(StandardCharsets.UTF_8)! (2认同)

Ran*_*ler 11

使用它,它非常易读:

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

Files.write(Paths.get(path), lines.getBytes(), StandardOpenOption.WRITE);
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,我没有发明 java8,我不是唯一使用这一行的人。但它不是同一问题的其他答案的副本 (2认同)

Mos*_*aei 10

你可以这样做:

import java.io.*;
import java.util.*;

class WriteText
{
    public static void main(String[] args)
    {   
        try {
            String text = "Your sample content to save in a text file.";
            BufferedWriter out = new BufferedWriter(new FileWriter("sample.txt"));
            out.write(text);
            out.close();
        }
        catch (IOException e)
        {
            System.out.println("Exception ");       
        }

        return ;
    }
};
Run Code Online (Sandbox Code Playgroud)


Sea*_*ton 10

import java.io.*;

private void stringToFile( String text, String fileName )
 {
 try
 {
    File file = new File( fileName );

    // if file doesnt exists, then create it 
    if ( ! file.exists( ) )
    {
        file.createNewFile( );
    }

    FileWriter fw = new FileWriter( file.getAbsoluteFile( ) );
    BufferedWriter bw = new BufferedWriter( fw );
    bw.write( text );
    bw.close( );
    //System.out.println("Done writing to " + fileName); //For testing 
 }
 catch( IOException e )
 {
 System.out.println("Error: " + e);
 e.printStackTrace( );
 }
} //End method stringToFile
Run Code Online (Sandbox Code Playgroud)

您可以将此方法插入到类中.如果在具有main方法的类中使用此方法,请通过添加静态关键字将此类更改为static.无论哪种方式,您都需要导入java.io.*才能使其工作,否则将无法识别File,FileWriter和BufferedWriter.


Bul*_*aza 10

使用Java 7:

public static void writeToFile(String text, String targetFilePath) throws IOException
{
    Path targetPath = Paths.get(targetFilePath);
    byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
    Files.write(targetPath, bytes, StandardOpenOption.CREATE);
}
Run Code Online (Sandbox Code Playgroud)


i88*_*.ca 8

使用org.apache.commons.io.FileUtils:

FileUtils.writeStringToFile(new File("log.txt"), "my string", Charset.defaultCharset());
Run Code Online (Sandbox Code Playgroud)


bha*_*era 6

如果您只关心将一个文本块推送到文件,则每次都会覆盖它.

JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
    FileOutputStream stream = null;
    PrintStream out = null;
    try {
        File file = chooser.getSelectedFile();
        stream = new FileOutputStream(file); 
        String text = "Your String goes here";
        out = new PrintStream(stream);
        out.print(text);                  //This will overwrite existing contents

    } catch (Exception ex) {
        //do something
    } finally {
        try {
            if(stream!=null) stream.close();
            if(out!=null) out.close();
        } catch (Exception ex) {
            //do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例允许用户使用文件选择器选择文件.

  • 一旦原始问题得到解答并且OP满意并且很久以后,像这样的页面仅对从谷歌搜索登陆这里的人来说是一个有用的工具.我登陆此页面以便为文件创建一个迷你文本追加器.因此,在OP继续前进之后,与整个观众而不是OP进行对话是很好的. (2认同)

小智 6

private static void generateFile(String stringToWrite, String outputFile) {
    try {       
        FileWriter writer = new FileWriter(outputFile);
        writer.append(stringToWrite);
        writer.flush();
        writer.close();
        log.debug("New File is generated ==>"+outputFile);
    } catch (Exception exp) {
        log.error("Exception in generateFile ", exp);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码片段可能是解决方案,但 [包括解释](//meta.stackexchange.com/questions/114762/explaining-entirely-‌ code-based-answers) 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您提出代码建议的原因。 (3认同)

Bra*_*rks 6

基本上与这里的答案相同,但很容易复制/粘贴,而且它就可以工作;-)

  import java.io.FileWriter;

  public void saveToFile(String data, String filename) {
    try (
      FileWriter fw = new FileWriter(filename)) {
      fw.write(data);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
Run Code Online (Sandbox Code Playgroud)