Javaを使用して文字列をテキストファイルに保存するにはどうすればよいですか?


699

Javaでは、「テキスト」という文字列変数にテキストフィールドのテキストがあります。

「テキスト」変数の内容をファイルに保存するにはどうすればよいですか?

回答:


727

バイナリデータではなく、単にテキストを出力する場合は、以下が機能します。

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

次に、出力ストリームと同じように、文字列を書き込みます。

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コンストラクタに
渡して

7
ところで、これはPrintStreamが1.5以降持っていた便利なコンストラクタを使用して簡略化できます。これで十分です:PrintStream out = new PrintStream( "filename.txt");
ジョニック2009年

10
ある時点でそのファイルを閉じる必要があります...? codecodex.com/wiki/ASCII_file_save#Java
JStrahl

2
try {} catch(){} finally {}を使用したい場合、最終的に{}ファイルがnullでない場合はファイルを閉じます。
Benas 14

23
java8では、(PrintStream ps = new PrintStream( "filename")){ps.println(out);を試すことができます。}これはあなたのために近く処理します
アントンチキン

245

Apache Commons IOには、これを行うためのいくつかの優れたメソッドが含まれています。特に、FileUtilsには次のメソッドが含まれています。

static void writeStringToFile(File file, String data) 

これにより、1回のメソッド呼び出しでファイルにテキストを書き込むことができます。

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

また、ファイルのエンコーディングを指定することも検討してください。


10
ほんの少しの修正で、2番目のフラグメントは次のようになります。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(...)すれば完了です。
2009

6
out.flush();を呼び出すことを忘れないでください。その後、out.close();
Alex Byrth、2016年

@AlexByrthなぜ彼がいいの?
Andrew Tobilko 2018

1
大きなファイルはバックグラウンド(別のスレッド)で記録され、記録に時間がかかります。flush()を呼び出すと、次の行にすべてが書き込まれ、操作が同期されます。ただし、これはオプションですが、大きなファイルをログとして処理する場合は適切な方法です。
Alex Byrth 2018

1
out.close()はすでにストリームをフラッシュしていることに注意してください。つまり、out.flush()を呼び出す必要はありません。
hjk321

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øtveit2015年

5
content.getBytes(StandardCharsets.UTF_8)エンコーディングを明示的に定義するために使用できます。
John29、2016

1
StandardOpenOption.CREATEはデフォルトではないことに注意してください。StandardOpenOption.CREATEとStandardOpenOption.TRUNCATE_EXISTINGがデフォルトです。デフォルトを使用するには、3番目のパラメーターを削除するだけです。
Tinus Tate

Tinus Tateのコメントをご覧ください!この例を編集するプロセスは何ですか?何千人もの人がこの例をそのまま使用したのは、短い文字列でファイルを上書きしたときに予期しない結果になることを発見したためです。Tinusが示すように、より短い文字列で上書きするときに既存のファイルを切り捨てたくないという十分な理解と実際の理由がない限り、TRUNCATE_EXISTINGは重要です。
jch

1
Java 11では、文字列を2番目のパラメーターとして単に置くことができます!やったー!
Dennis Glot、

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を削除して単純化する次のようにするだけで、1行で実行することもできます。(new BufferedWriter(new FileWriter(filename)))。write(str);
Artem Barger、

6
だから、あなたのシンプルで素晴らしい解決策を示してください。より良い方法でそれを行う方法を学ぶことができればうれしいです。
Artem Barger、

4
荒らしを無視してください...彼らはいつも自分の解決策を提供することなく批判します。独自のコードを記述したり、追加のライブラリをダウンロードしたり、依存関係を導入したりする
手間

1
.close()(少なくともJava 7では)スローしないようですが、最後のトライキャッチはおそらく冗長ですか?
コス

16
このような例外を飲み込むと、例外が実際に発生したときに人生が困難になります。非常に少なくとも、あなたはそれらを再スローする必要がありますthrow new RuntimeException(e);
ロジャーKeays

65

Apache Commons IOFileUtils.writeStringToFile()から使用します。この特定のホイールを再発明する必要はありません。


20
私はこれ以上反対することができませんでした。これらのライブラリはそこにあるので、このような単純なソリューションに微妙なバグを導入しません。
skaffman 2009年

3
いいえ、明らかに違います。私は、あなたのソリューションが、初心者のJavaプログラマーである誰かに最初に投げかけるものではないかもしれないということだけに反対しています。あなたはそんなことを書いたことがないと言っているのではありませんか?
duffymo 2009年

8
はい、ありますが、それはcommons-ioを見つける前のことです。それを見つけて以来、1クラスのプロジェクトであっても、そのようなことを手で書いたことはありません。初日から知っていれば、初日から使っていただろう。
skaffman 2009年

5
確かに、あなたは経験豊富な開発者です。あなたの経歴はあなたのJBOSS / Springユーザーを言っていますが、最初の "Hello、World"の取り組みでは確かにどちらか1人にならなかっただろう。ライブラリの適切な使用に同意します。初めて言語を試す人は、それを経験してよりよく知ったときに後で捨てるようなことをすることになっても、その言語を最初に理解するようにすべきだと言っています。
duffymo 2009年

2
私はコモンズなしでこれを実装し、明白ではない例外がスローされました。次に、コモンズを使用してこれを実装し、何が問題だったかを正確に教えてくれました。物語の教訓:必要がないのに、なぜ暗い時代に生きるのか?
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
例外が発生してもファイルは閉じません。
トム・ホーティン-09年

1
@JanusTroelsen:拒否された場合は引用してください try-with-resourcesステートメントをください
ゴミ箱神、2013

22

ではJavaの11java.nio.file.Filesクラスはファイルに文字列を記述するために2つの新しいユーティリティメソッドによって拡張されました。最初の方法(ここの JavaDocを参照)は、デフォルトとして文字セットUTF-8を使用します。

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

そして、2番目のメソッド(ここの 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

この種の操作では、可能な限りライブラリに依存することを好みます。これにより、重要な手順を誤って省略してしまう可能性が低くなります(上記のウルフスナイプスの間違いなど)。いくつかのライブラリーは上記で提案されていますが、この種のものに対する私のお気に入りは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
}

2
Guavaを使用している場合、もありますCharsets.UTF-8
フロリアン2015年

2
@florian:Charsets.UTF_8実は
TimBüthe16年

親フォルダが存在している必要があります。例:destination.mkdirs()。
AlikElzin-kilaka

2
Files.write(CharSequence from、File to、Charset charset)は、guava 26.0で廃止されました。
ドナルドダック

非推奨のFiles.writeに代わる最新のGuava: 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

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キーワードを追加して、このクラスを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 2018年

Files.write(targetPath, bytes);次に、ファイルを上書きするために使用します。期待どおりに動作します。
BullyWiiPlaza 2018年

8

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

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

6

1ブロックのテキストをファイルにプッシュするだけの場合は、毎回上書きされます。

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が望んでいたものだと
思いまし

2
元の質問への回答が完了し、OPが満足されて久しぶりに終了すると、このようなページは、Google検索からここに到達した人々にとって有用なアーティファクトとしてのみ機能します。ファイルにミニテキストアペンダーを作成するためにこのページにアクセスしました。そのため、OPが進んだ後は、OPではなく、オーディエンス全体と話すのが良いでしょう。
Eric

3

何かが起こった場合に備えて、ライター/出力ストリームをfinallyブロックで閉じることをお勧めします

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

1
さらに良い:try-with-resourcesを使用する
Janus Troelsen 2013

はい、@JanusTroelsenは、より良いのtry-と資源の文の使用、権利であるdocs.oracle.com/javase/tutorial/essential/exceptions/...

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()が呼び出されることはありません。適切なエラーケース処理を追加して、回答を改善してください。
Boris Brodski

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、私の答えで特別なのは誰も言及していないようで、byte[]配列の代わりにCharSequence(つまりString)のIterableを取るメソッドのオーバーロードされたバージョン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のメモ帳を見ると、常に行がジャンプするわけではなく、すべて1行で表示されます。ワードパッドを使用してください。


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

たくさんのリソースを開いたままにすることができます。これは悪い習慣です。これを行わないでください。
Boris Brodski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.