Java를 사용하여 문자열을 텍스트 파일로 저장하는 방법


699

Java에서는 "text"라는 String 변수에 텍스트 필드의 텍스트가 있습니다.

"text"변수의 내용을 파일로 저장하려면 어떻게해야합니까?

답변:


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, FileOutputStream 생성자에 절대 경로 (예 : "/tmp/filename.txt")를 전달하여 원하는 위치에 파일을 저장할 수 있습니다.
Jonik

7
Btw, 이것은 PrintStream이 1.5 이후 가지고 있던 편의 생성자를 사용하여 단순화 할 수 있습니다. 이것으로 충분합니다 : PrintStream out = new PrintStream ( "filename.txt");
Jonik 2016 년

10
어느 시점에서 파일을 닫아야합니까? codecodex.com/wiki/ASCII_file_save#Java
JStrahl

2
try {} catch () {} finally {}를 사용하려고합니다. 마지막으로 {}에서는 파일이 null이 아닌 경우 파일을 닫습니다.
Benas

23
java8에서는 시도 할 수 있습니다 (PrintStream ps = new PrintStream ( "filename")) {ps.println (out); } 이것은 당신을 위해 다룰 것입니다
Anton Chikin

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

3
구아바를 선호하는 사람들 에게도 그렇게 할 수 있습니다 .
Jonik

10
이 기능은 이제 기본 캐릭터 세트를 추가해야되지 않습니다 ->FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
폴 푸르 넬

97

Java File API를 살펴보십시오

간단한 예 :

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

@ XP1 알고 있습니다. 대단한 개선입니다. Java 6에서 이것을 위해 Lombok을 사용했습니다. 그냥 가십시오 @Cleanup new FileOutputStream(...).
Jorn

6
부르는 것을 잊지 마십시오 .flush (); 그런 다음 out.close ();
Alex Byrth

@AlexByrth 왜 그가해야합니까?
Andrew Tobilko

1
큰 파일은 백그라운드 (다른 스레드)로 기록되며 시간이 걸립니다. flush ()를 호출하면 다음 행에 모든 내용이 기록되어 작업이 동기화됩니다. 그러나 이것은 선택 사항 이지만 큰 파일을 로그로 처리하는 경우 좋은 방법입니다.
Alex Byrth

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
나중에 궁금한 사람이있는 경우 인코딩이 플랫폼 표준이됩니다.
Haakon Løtveit

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에서는 단순히 두 번째 매개 변수로 문자열을 넣을 수 있습니다! 만세!
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를 제거하고 단순화하십시오. 또한 다음을 수행하여 한 줄로 수행 할 수도 있습니다. (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 2016 년

3
아닙니다. 귀하의 솔루션이 초보자 Java 프로그래머 인 사람에게 먼저 던지는 것이 아닐 수도 있습니다. 당신은 그런 것을 쓴 적이 없다고 제안하지 않습니다.
duffymo 2016 년

8
나는 그렇습니다. 그러나 그것은 commons-io를 발견하기 전에입니다. 그것을 찾은 이후로, 나는 한 종류의 프로젝트에서도 손으로 그런 것을 쓰지 않았습니다. 내가 처음부터 알고 있었다면, 처음부터 사용했을 것입니다.
skaffman 2016 년

5
정확하지만 숙련 된 개발자입니다. 당신의 바이오는 당신의 JBOSS / Spring 사용자라고 말하지만, 당신은 첫 번째 "Hello, World"노력에서 한 사람도 아니었을 것입니다. 라이브러리를 올바르게 사용하는 데 동의하지 않습니다. 언어를 처음 시도하는 사람들은 나중에 경험하고 더 잘 알면 나중에 버릴 것들을하는 것을 의미한다고해도 언어를 아는 것을 시도해야한다고 말합니다.
duffymo 2016 년

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
예외가 발생해도 파일을 닫지 않습니다.
Tom Hawtin-tackline

1
@JanusTroelsen : 거부 된 경우 try-with-resources 문을 인용하십시오 .
trashgod

22

에서 자바 (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 입니다. 구아바에는 이 작업에 잘 작동하는 파일 이라는 클래스가 있습니다 .

// 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.
florian

2
@florian : Charsets.UTF_8사실입니다.
Tim Büthe

부모 폴더가 존재해야합니다. 예 : destination.mkdirs ().
AlikElzin-kilaka

2
Files.write (CharSequence from, File to, Charset charset)는 구아바 26.0에서 더 이상 사용되지 않습니다.
Donald Duck

더 이상 사용되지 않는 Files.write의 현대 구아바 대안 : Files.asCharSink(file, charset).write(text)
Vadzim

12

Apache Commons IO API를 사용하십시오. 간단 해

API를

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

메이븐 의존성

<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 2016 년

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

이 메소드를 클래스에 삽입 할 수 있습니다. 기본 메소드가있는 클래스에서이 메소드를 사용하는 경우 정적 키워드를 추가하여이 클래스를 정적으로 변경하십시오. 어느 쪽이든 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);
}

현명한 단어-파일이 없으면 새 파일을 만들지 만 기존 파일의 문자를 덮어 씁니다. 새 데이터가 작 으면 손상된 파일이 생성 된 것입니다. 내가 어떻게 알아?
Chris Rae

좋아, 어떻게 알지?
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가 : 내 대답은보다 전문 만들기위한 감사 (나는 또한 이것이 영업 이익이 실제로 대부분의 사람들이 그냥 텍스트를 덤프하고 교체 원하는 것을 때문에 원하는 정확히이었다 가정)
bhathiya - 페레라

2
원래 질문에 대한 답변이 작성되어 OP가 만족스럽고 오래 전에 사라지면 이와 같은 페이지는 Google 검색에서이 사이트를 방문하는 사람들에게 유용한 유물 역할을합니다. 파일에 미니 텍스트 어 펜더를 만들기 위해이 페이지를 방문했습니다. OP가 진행된 후 OP가 아닌 전체 잠재 고객에게 이야기하는 것이 좋습니다.
Eric Leschinski

3

무언가가 발생하는 경우를 대비하여 finally 블록에서 작성기 / 출력 스트림을 닫는 것이 좋습니다.

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

1
더 나은 : 사용 시도 -과 - 자원
야누스 Troelsen

예, @JanusTroelsen이 맞습니다. 더 나은 사용법 try-with-resources 문 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
이 코드 스 니펫이 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 귀하의 코드 제안 이유를 모를 수도 있습니다.
Johan

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 참조 :

파일에 텍스트 줄을 씁니다. 각 줄은 문자 순서이며 시스템 속성 line.separator에 의해 정의 된대로 각 줄은 플랫폼의 줄 구분 기호로 끝나는 순서대로 파일에 기록됩니다. 지정된 문자 세트를 사용하여 문자가 바이트로 인코딩됩니다.

options 매개 변수는 파일을 작성하거나 여는 방법을 지정합니다. 옵션이 없으면이 메소드는 CREATE, TRUNCATE_EXISTING 및 WRITE 옵션이있는 것처럼 작동합니다. 즉, 파일을 작성하기 위해 파일을 열거 나 존재하지 않는 경우 파일을 만들거나 기존 일반 파일을 0 크기로 자릅니다.이 방법을 사용하면 모든 줄을 쓸 때 파일이 닫힙니다 ( 또는 I / O 오류 또는 기타 런타임 예외가 발생 함). I / O 오류가 발생하면 파일이 작성되거나 잘린 후 또는 일부 바이트가 파일에 기록 된 후에 오류가 발생할 수 있습니다.

양해 바랍니다. 사람들이 이미 Java의 내장 기능으로 Files.write응답 한 것을 보았지만 아무도 언급하지 않은 내 대답에서 특별한 것은 byte[]배열 대신 CharSequence의 Iterable (예 : String)을 취하는 메소드의 오버로드 된 버전 이므로 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와 같은 fecthing 리소스가 필요하기 때문에 스트림을 기반으로합니다. 제안은 환영합니다.

스트림 (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의 모든 내용을 입력하고 저장기를 호출하여 매개 변수로 보낼 수 있습니다. 라이터는 방금 문자열 행을 쓴 다음 줄마다 "for"를 사용하여 끝에 ArrayList를 씁니다. 우리는 txt 파일의 내용 TextArea가 될 것입니다. 말이 안된다면 Google 번역가와 영어를 못하는 사람이 유감입니다.

Windows 메모장을보십시오. 항상 줄을 넘기는 것은 아니며 한 줄에 모두 표시되는 경우에는 Wordpad를 사용하십시오.


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.