如何使用 Java 将字符串保存到文本文件中?

Posted

技术标签:

【中文标题】如何使用 Java 将字符串保存到文本文件中?【英文标题】:How do I save a String to a text file using Java? 【发布时间】:2010-11-06 09:51:30 【问题描述】:

在 Java 中,我在名为“text”的字符串变量中的文本字段中有文本。

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

【问题讨论】:

【参考方案1】:

如果您只是输出文本,而不是任何二进制数据,则可以使用以下方法:

PrintWriter out = new PrintWriter("filename.txt");

然后,将您的字符串写入它,就像您对任何输出流一样:

out.println(text);

您将一如既往地需要异常处理。写完后请务必致电out.close()

如果您使用的是 Java 7 或更高版本,您可以使用“try-with-resources statement”,它会在您完成后自动关闭您的PrintStream(即退出块),如下所示:

try (PrintWriter out = new PrintWriter("filename.txt")) 
    out.println(text);

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

【讨论】:

@Justin,您还可以将绝对路径(例如“/tmp/filename.txt”)传递给 FileOutputStream 构造函数,以将文件保存在您想要的任何位置 顺便说一句,这可以使用 PrintStream 自 1.5 以来的便利构造函数进行简化。这样就足够了: PrintStream out = new PrintStream("filename.txt"); 需要在某个时候关闭该文件...? codecodex.com/wiki/ASCII_file_save#Java 您想使用 try catch()finally,如果文件不为 null,则在 finally 中关闭文件。 在java8中你可以试试(PrintStream ps = new PrintStream("filename")) ps.println(out); 这将为您处理关闭【参考方案2】:

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

static void writeStringToFile(File file, String data) 

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

FileUtils.writeStringToFile(new File("test.txt"), "Hello File");

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

【讨论】:

只是一个小修正,第二个片段应该是:FileUtils.writeStringToFile(new File("test.txt"), "Hello File"); 对于我们这些喜欢番石榴的人,it can do this too。 该功能现已弃用,您应该添加默认字符集 --> FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));【参考方案3】:

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

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

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

【讨论】:

如果后来有人想知道,编码将是平台标准。 content.getBytes(StandardCharsets.UTF_8) 可用于明确定义编码。 请注意,StandardOpenOption.CREATE 不是默认的 StandardOpenOption.CREATE 和 StandardOpenOption.TRUNCATE_EXISTING 是默认的。要使用默认值,只需删除第三个参数。 请参阅 Tinus Tate 的评论!编辑此示例的过程是什么?我想知道有多少人照原样采取了这个例子,却发现当他们用较短的字符串覆盖文件时会出现意想不到的结果。正如 Tinus 指出的那样,TRUNCATE_EXISTING 至关重要,除非您完全理解并且有实际理由不想在用较短的字符串覆盖时截断现有文件。 在 java 11 中,您可以简单地将字符串作为第二个参数!万岁!【参考方案4】:

看看Java File API

一个简单的例子:

try (PrintStream out = new PrintStream(new FileOutputStream("filename.txt"))) 
    out.print(text);

【讨论】:

@XP1 我知道,这是一个很大的改进。我在 Java 6 中为此使用了 Lombok:只需转到 @Cleanup new FileOutputStream(...) 即可。 别忘了调用 out.flush();然后 out.close(); @AlexByrth 他为什么要这么做? 大文件记录在后台(另一个线程),需要时间来记录。调用 flush() 确保所有内容都已写入下一行,同步操作。但这是可选的,但如果您处理大文件(如日志),这是一种很好的做法。 请注意,out.close() 已经刷新了流,这意味着不需要调用 out.flush()。【参考方案5】:

刚刚在我的项目中做了类似的事情。使用FileWriter 将简化您的部分工作。在这里你可以找到不错的tutorial。

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)
    
    

【讨论】:

删除所有 try/catch 并简化它我也可以通过以下方式在一行中完成:(new BufferedWriter(new FileWriter(filename))).write(str); 在单个 write() 调用中写出整个文件时,将 FileWriter 包装在 BufferedWriter 中是多余的。 看来.close() 不会抛出(至少在Java 7 中?),最后的trycatch 可能是多余的吗? 当异常确实发生时,吞下这样的异常会让你的生活变得艰难。至少你应该重新抛出它们:throw new RuntimeException(e);【参考方案6】:

使用Apache Commons IO 中的FileUtils.writeStringToFile()。无需重新发明这个特定的***。

【讨论】:

我完全不同意。这些库已经存在,因此我们不会在如此简单的解决方案中引入细微的错误。 不,显然不是。我只是不同意您的解决方案可能不是我向初学者 Java 程序员抛出的第一件事。你不是在暗示你从来没有写过这样的东西,是吗? 我有,是的,但那是在我找到 commons-io 之前。自从发现这一点以来,我从来没有手写过那种东西,即使是在一个类项目中也是如此。如果我从第一天就知道它,我会从第一天开始使用它。 没错,但您是一位经验丰富的开发人员。你的简历说你是一个 JBOSS/Spring 用户,但你肯定不会在你的第一次“Hello, World”工作中达到任何一个。我并不反对正确使用库。我的意思是,第一次尝试一门语言的人应该尝试从根本上了解它,即使这意味着他们会做一些他们以后会在他们有经验和更了解时放弃的事情。 我在没有公共资源的情况下实现了这个,并且抛出了一个不太明显的异常。然后我使用 commons 实现了这个,它告诉我到底出了什么问题。故事的寓意:如果没有必要,为什么还要生活在黑暗时代?【参考方案7】:

Java 11 中,java.nio.file.Files 类被两个新的实用方法扩展以将字符串写入文件。第一种方法(参见 JavaDoc here)默认使用字符集 UTF-8:

Files.writeString(Path.of("my", "path"), "My String");

第二种方法(参见 JavaDoc here)允许指定一个单独的字符集:

Files.writeString(Path.of("my", "path"), "My String", StandardCharset.ISO_8859_1);

这两种方法都有一个可选的 Varargs 参数,用于设置文件处理选项(参见 JavaDoc here)。以下示例将创建一个不存在的文件或将字符串附加到现有文件:

Files.writeString(Path.of("my", "path"), "String to append", StandardOpenOption.CREATE, StandardOpenOption.APPEND);

【讨论】:

这需要更多的支持。答案隐藏在为这个问题提供的大量答案中,但它优于许多答案。 例如只需要最少量的行,也不依赖于 Apache Commons。【参考方案8】:

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

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

【讨论】:

出现异常时不会关闭文件。 @JanusTroelsen:如果被拒绝,请引用The try-with-resources Statement【参考方案9】:

我更喜欢尽可能依赖库来进行此类操作。这使我不太可能意外遗漏一个重要步骤(例如上面犯的错误 wolfsnipes)。上面推荐了一些库,但我最喜欢这种东西的是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

【讨论】:

如果你使用 Guava,还有Charsets.UTF-8 @florian:其实是Charsets.UTF_8 父文件夹必须存在。示例:destination.mkdirs()。 Files.write(CharSequence from, File to, Charset charset) 在 guava 26.0 中已弃用。 现代番石榴替代已弃用的 Files.write:Files.asCharSink(file, charset).write(text)【参考方案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);

【讨论】:

智者的话 - 如果它不存在,这将创建一个新文件,但如果存在,它将覆盖现有文件的字符。如果新数据较小,则意味着您可能会创建损坏的文件。问我怎么知道的! 好的,你怎么知道的? 然后使用Files.write(targetPath, bytes); 覆盖文件。它将按预期工作。【参考方案11】:

使用 Apache Commons IO API。很简单

将 API 用作

 FileUtils.writeStringToFile(new File("FileNameToWrite.txt"), "stringToWrite");

Maven 依赖

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

【讨论】:

【参考方案12】:

用这个,可读性很强:

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

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

【讨论】:

这也是现有答案的副本。 :c 对不起,我没有发明 java8,我不是唯一使用这条线的人。但它不是同一问题的其他答案的复制过去【参考方案13】:

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

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

【讨论】:

Files.write(path, byte[]) 将使用 UTF-8 编码。 String.getBytes() 使用默认的平台编码。所以这是一个潜在的问题。使用 string.getBytes(StandardCharsets.UTF_8)!【参考方案14】:
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

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

【讨论】:

【参考方案15】:

你可以这样做:

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

【讨论】:

【参考方案16】:

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

FileUtils.writeStringToFile(new File("log.txt"), "my string", Charset.defaultCharset());

【讨论】:

【参考方案17】:

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

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
        
    

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

【讨论】:

@Eric Leschinski:感谢您让我的回答更加专业(我还认为这正是 OP 想要的,因为这是大多数人真正想要的,只需转储文本并替换它)跨度> 一旦原始问题得到解答并且 OP 得到满足并且早已不复存在,这样的页面仅对通过 Google 搜索到达这里的人有用。我登陆此页面是为了为文件创建一个迷你文本附加程序。因此,在 OP 继续前进之后,与全体观众而不是 OP 交谈是件好事。【参考方案18】:
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);
    

【讨论】:

虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 close() 可能永远不会被调用。请改进您的答案,添加正确的错误案例处理。【参考方案19】:

最好在 finally 块中关闭 writer/outputstream,以防万一

finally
   if(writer != null)
     try
        writer.flush();
        writer.close();
     
     catch(IOException ioe)
         ioe.printStackTrace();
     
   

【讨论】:

更好:使用 try-with-resources 是的,@JanusTroelsen 是对的,最好使用 try-with-resources 语句docs.oracle.com/javase/tutorial/essential/exceptions/…【参考方案20】:

与as here 的答案基本相同,但易于复制/粘贴,而且可以正常工作;-)

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

【讨论】:

【参考方案21】:

我认为最好的方法是使用Files.write(Path path, Iterable&lt;? extends CharSequence&gt; lines, OpenOption... options):

String text = "content";
Path path = Paths.get("path", "to", "file");
Files.write(path, Arrays.asList(text));

见javadoc:

将文本行写入文件。每行都是一个字符序列,并且是 按顺序写入文件,每一行都由 平台的行分隔符,由系统属性定义 行分隔符。使用指定的字符将字符编码为字节 字符集。

options 参数指定文件的创建或打开方式。 如果不存在任何选项,则此方法就像 CREATE 一样工作, 存在 TRUNCATE_EXISTING 和 WRITE 选项。换句话说,它 打开文件进行写入,如果文件不存在则创建文件,或者 最初将现有的常规文件截断为 0 的大小。 方法确保在所有行都已关闭时关闭文件 写入(或抛出 I/O 错误或其他运行时异常)。如果 发生 I/O 错误,然后它可能会在文件创建后这样做或 被截断,或者在一些字节被写入文件之后。

请注意。我看到人们已经回答了 Java 的内置 Files.write,但我的回答有什么特别之处,似乎没人提到的是该方法的重载版本,它采用 CharSequence 的 Iterable(即字符串),而不是 byte[]数组,因此不需要text.getBytes(),我认为这有点干净。

【讨论】:

【参考方案22】:

如果您希望将字符串中的回车符保存到文件中 这是一个代码示例:

    jLabel1 = new JLabel("Enter SQL Statements or SQL Commands:");
    orderButton = new JButton("Execute");
    textArea = new JTextArea();
    ...


    // String captured from JTextArea()
    orderButton.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent ae) 
            // When Execute button is pressed
            String tempQuery = textArea.getText();
            tempQuery = tempQuery.replaceAll("\n", "\r\n");
            try (PrintStream out = new PrintStream(new FileOutputStream("C:/Temp/tempQuery.sql"))) 
                out.print(tempQuery);
             catch (FileNotFoundException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
            System.out.println(tempQuery);
        

    );

【讨论】:

【参考方案23】:

由于在所有android版本上运行并且需要感染URL / URI等资源,我的方式是基于流的,欢迎任何建议。

就流(InputStream和OutputStream)而言,传输二进制数据,当开发者将字符串写入流时,必须先将其转换为字节,或者换句话说对其进行编码。

public boolean writeStringToFile(File file, String string, Charset charset) 
    if (file == null) return false;
    if (string == null) return false;
    return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));


public boolean writeBytesToFile(File file, byte[] data) 
    if (file == null) return false;
    if (data == null) return false;
    FileOutputStream fos;
    BufferedOutputStream bos;
    try 
        fos = new FileOutputStream(file);
        bos = new BufferedOutputStream(fos);
        bos.write(data, 0, data.length);
        bos.flush();
        bos.close();
        fos.close();
     catch (IOException e) 
        e.printStackTrace();
        Logger.e("!!! IOException");
        return false;
    
    return true;

【讨论】:

请添加适当的错误案例处理,关闭所有打开的资源并传播异常

以上是关于如何使用 Java 将字符串保存到文本文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将GUI中的数据保存到文本文件(java)

如何使用 SaveFileDialog 将字符串生成器的内容保存到文本文件?

如何使用“保存到..”对话框将字符串从 EditControl 写入 Visual Studio 2008 中的文本文件?

java中如何把输入的数据以json格式保存在文本里面

Java将多行字符串保存到文本文件

如何将结果保存到文本文件中? [复制]