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


698

在Java中,我来自一个名为“ text”的String变量中的文本字段。

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

Answers:


727

如果仅输出文本,而不是输出任何二进制数据,则可以执行以下操作:

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

然后,将String写入其中,就像写入任何输出流一样:

out.println(text);

与以往一样,您将需要异常处理。out.close()完成写作后,请务必致电。

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

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

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


4
@Justin,您还可以将绝对路径(例如“ /tmp/filename.txt”)传递到FileOutputStream构造函数,以将文件保存在所需的任何位置
Jonik,2009年

7
顺便说一句,可以使用PrintStream自1.5以来的便利构造函数来简化此操作。这样就足够了:PrintStream out = new PrintStream(“ filename.txt”);
乔尼克(Jonik)

10
需要在某个时候关闭该文件吗? codecodex.com/wiki/ASCII_file_save#Java
JStrahl,2012年

2
您想使用try {} catch(){} finally {},在其中,如果文件不为null,则最后关闭{}。
贝纳斯2014年

23
在java8中,您可以尝试(PrintStream ps = new PrintStream(“ filename”)){ps.println(out); }这一切将为您解决
Anton Chikin 2015年

245

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

static void writeStringToFile(File file, String data) 

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

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

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


10
只需稍作更正,第二个片段应显示为:FileUtils.writeStringToFile(new File(“ test.txt”),“ Hello File”);
pm_labs 2012年

3
对于喜欢番石榴的我们来说,它也可以做到
Jonik 2013年

10
现在不建议使用该功能,您应该添加默认字符集->FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
Paul Fournel

97

看看Java File API

一个简单的例子:

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

@ XP1我知道,这是一个很大的改进。我在Java 6中为此使用了Lombok:只需@Cleanup new FileOutputStream(...)完成就可以了。
乔恩

6
不要忘记调用out.flush();。然后out.close();
亚历克斯·伯斯

@AlexByrth为什么要他?
安德鲁·托比尔科

1
大文件记录在后台(另一个线程),需要花费一些时间来记录。调用flush()可确保所有内容均已写入下一行,从而同步操作。但这是可选的,但是如果您将大文件作为日志来处理,则是一种很好的做法。
亚历克斯·伯斯

1
请注意,out.close()已经刷新了流,这意味着不必调用out.flush()。
hjk321 '19

90

在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


3
如果以后有人想知道,则编码将是平台标准。
HaakonLøtveit,2015年

5
content.getBytes(StandardCharsets.UTF_8)可用于显式定义编码。
John29

1
请注意,StandardOpenOption.CREATE不是默认值之一,而StandardOpenOption.CREATE和StandardOpenOption.TRUNCATE_EXISTING是默认值。要使用默认值,只需删除第三个参数。
Tinus Tate

请参阅Tinus Tate的评论!编辑此示例的过程是什么?我想知道有成千上万的人按原样使用此示例只是为了发现他们用较短的字符串覆盖文件时会得到意想不到的结果。正如Tinus所指出的,除非您完全理解并且有一个真正的原因不想在用较短的字符串覆盖时截断现有文件,否则TRUNCATE_EXISTING至关重要。
jch

1
在Java 11中,您可以简单地将String作为第二个参数!万岁!
丹尼斯·格洛特

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

4
删除所有try / catch并简化它,我也可以通过以下方式在一行中做到:(new BufferedWriter(new FileWriter(filename)))。write(str);
Artem Barger 2009年

6
因此,请展示您简单而又不错的解决方案。我将很高兴学习如何以更好的方式进行操作。
Artem Barger 2009年

4
忽略巨魔……他们总是批评而不提供自己的解决方案。感谢您免于编写自己的代码/下载额外的库并引入依赖项...
nikib3ro 2011年

1
似乎.close()没有抛出异常(至少在Java 7中如此),最后一次trycatch可能是多余的吗?
科斯2012年

16
当确实发生异常时,吞咽此类异常会使您的生活更加艰难。至少您应该将它们throw new RuntimeException(e);
扔掉

65

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


20
我完全同意。这些库在那里,因此我们在这种简单的解决方案中不会引入细微的错误。
skaffman

3
不,显然不是。我只是不同意您的解决方案可能不是我要付给初学者Java程序员的第一件事。您不是在暗示您从未写过这样的东西,对吗?
duffymo

8
我有,是的,但是那是在我找到commons-io之前。自从发现这一点以来,即使在一个类的项目中,我也从来没有手工编写过这类东西。如果我从第一天开始就知道它,那我从第一天就开始使用它。
skaffman

5
确实如此,但是您是一位经验丰富的开发人员。您的个人资料说您是JBOSS / Spring的用户,但是您肯定不会在“ Hello,World”的第一次尝试中做到任何一个。我不同意正确使用库。我的意思是,初次尝试使用某种语言的人应该尝试从根本上了解它,即使这意味着要做的事情会在以后有经验并了解得更好时就抛弃。
duffymo

2
我在没有公共资源的情况下实现了此功能,并引发了明显的异常。然后,我使用Commons实现了此功能,它告诉我确切的地方出了问题。故事的寓意:为什么不必生活在黑暗时代?
SilentNot

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

2
发生异常时,这不会关闭文件。
Tom Hawtin-大头钉

1
@JanusTroelsen:如果被拒绝,请引用try-with-resources语句
垃圾桶

21

Java 11中java.nio.file.Files通过两个新的实用程序方法扩展了该类,以将字符串写入文件。第一种方法(请参见JavaDoc 在此处)使用字符集UTF-8作为默认值:

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

第二种方法(请参阅JavaDoc 在此处)允许指定一个单独的字符集:

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

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

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

13

我更喜欢在任何可能的情况下都依赖库来进行此类操作。这使我不太可能意外忽略一个重要步骤(例如上面提到的错误Wolfsnipes)。上面建议了一些库,但是我最喜欢的是Google 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
}

2
如果您使用的是番石榴,则还有Charsets.UTF-8
弗洛里安2015年

2
@florian:Charsets.UTF_8实际上是
TimBüthe,

父文件夹必须存在。示例:destination.mkdirs()。
AlikElzin-kilaka

2
在guava 26.0中不推荐使用Files.write(CharSequence from,File to,Charset charset)。
唐老鸭

现代Guava替代不推荐使用的Files.write: Files.asCharSink(file, charset).write(text)
Vadzim

12

使用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.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)!
rmuller

11

使用它,它非常可读:

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

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

它也是现有答案的副本。:c
james.garriss '16

2
对不起,但是我没有发明java8,我不是唯一使用这一行的人。但这不是从同一问题的其他答案中复制而来的内容
Ran Adler

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

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


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

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

明智的选择-如果不存在,则会创建一个新文件,但如果存在,它将覆盖现有文件的字符。如果新数据较小,则意味着您可能创建了损坏的文件。问我我怎么知道!
克里斯·雷

好吧,你怎么知道?
ojblass

Files.write(targetPath, bytes);然后使用覆盖文件即可。它将按预期工作。
BullyWiiPlaza

8

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

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

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

此示例使用户可以使用文件选择器选择文件。


@Eric Leschinski:感谢您使我的回答更加专业(我也认为这正是OP想要的,因为这实际上是大多数人想要的,只是转储文本并替换它)
bhathiya-perera 2013年

2
一旦回答了原始问题,并且OP满足并且长期以来,这样的页面仅对通过Google搜索到达此处的用户有用。我登陆此页面是为了为文件创建一个迷你文本追加器。因此,在OP进行之后,最好与整个受众而不是OP对话。
Eric Leschinski 2013年


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

}


1
尽管此代码段可能是解决方案,但包括说明确实有助于提高帖子的质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
约翰,

close()可能永远不会被调用。请通过添加适当的错误案例处理来改善您的答案。
鲍里斯·布罗德斯基

0

我认为最好的方法是使用Files.write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options)

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

参见javadoc

将几行文字写入文件。每行都是一个char序列,并按顺序写入文件,每行由平台的行分隔符终止,如系统属性line.separator所定义。使用指定的字符集将字符编码为字节。

options参数指定如何创建或打开文件。如果不存在任何选项,则此方法就像存在CREATE,TRUNCATE_EXISTING和WRITE选项一样工作。换句话说,它打开文件进行写入,如果不存在则创建文件,或者首先将现有的常规文件截断为0。该方法可确保在写入所有行后关闭文件(或引发I / O错误或其他运行时异常)。如果发生I / O错误,则可以在创建或截断文件后,或者在将某些字节写入文件后,执行此操作。

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


0

如果您希望将回车符从字符串中保留到文件中,请参见以下代码示例:

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

    });

-1

我的方法基于所有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;
}

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

您介意按建议共享代码处理案例,谢谢。
牟家宏

-1

您可以使用ArrayList作为示例来放置TextArea的所有内容,并通过调用save来作为参数发送,因为编写者刚刚编写了字符串行,然后我们使用“ for”一行一行地最后编写我们的ArrayList我们将在txt文件中使用TextArea内容。如果没有什么意义,对不起,我是google翻译者,我不会说英语。

观看Windows记事本,它并不总是跳行,而是全部显示在一行中,请使用写字板确定。


private void SaveActionPerformed(java.awt.event.ActionEvent evt) {

    String NameFile = Name.getText();
    ArrayList< String > Text = new ArrayList< String >();

    Text.add(TextArea.getText());

    SaveFile(NameFile, Text);
}

public void SaveFile(String name, ArrayList< String> message) {

    path = "C:\\Users\\Paulo Brito\\Desktop\\" + name + ".txt";

    File file1 = new File(path);

    try {

        if (!file1.exists()) {

            file1.createNewFile();
        }


        File[] files = file1.listFiles();


        FileWriter fw = new FileWriter(file1, true);

        BufferedWriter bw = new BufferedWriter(fw);

        for (int i = 0; i < message.size(); i++) {

            bw.write(message.get(i));
            bw.newLine();
        }

        bw.close();
        fw.close();

        FileReader fr = new FileReader(file1);

        BufferedReader br = new BufferedReader(fr);

        fw = new FileWriter(file1, true);

        bw = new BufferedWriter(fw);

        while (br.ready()) {

            String line = br.readLine();

            System.out.println(line);

            bw.write(line);
            bw.newLine();

        }
        br.close();
        fr.close();

    } catch (IOException ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(null, "Error in" + ex);     
    }   
}

您可能会打开一堆资源。不好的做法,请不要这样做。
鲍里斯·布罗德斯基
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.