Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

File에 Text를 쓰는 여러가지 방법(feat. Java API) 본문

데싸 OJT/File에 문자열 저장(Java)

File에 Text를 쓰는 여러가지 방법(feat. Java API)

이대곤 2023. 1. 19. 14:43

목차

0) FileOutputStream vs FileWriter 차이점

1) 오직 FileOutputStream만을 이용한 방법
2) 오직 FileWriter 만을 이용한 방법
3) PrintWriter(FileWriter) 를 이용한 방법
4) BufferedWriter(FileWriter) 를 이용한 방법
5) Files 클래스를 이용한 방법
6) DataOutputStream(BufferedOutputStream(DataInputStream)) 을 이용한 방법

FileOutputStream vs FileWriter

FileOutputStream

OutputStream을 상속받은 것으로

말 그대로 바이너리 데이터를 파일에 쓰기 위한 용도이다

따라서 raw bytes 스트림(바이너리 데이터)을

write 하는데 사용된다

 

FileOutputStream

바로 문자열을 파일에 저장하는 것을

허용하지 않는데

이를 가능하게 하기 위해서

데이터를 바이너리로 변환하거나,

OutputStreamWriter로 감싸서 사용하면 된다

 

반면

 

FileWriter

Writer를 상속받은 것으로
말 그대로 텍스트를 파일에 쓰기 위한 용도이다

문자 스트림을

write 하는데 사용한다.

 

FileWriter

일반적으로 상위 레벨의

BufferedWriter 혹은 PrintWriter로 감싸져 사용된다고 한다

파일에 데이터를 쓰는데 더 유연한 메소드들과

더 좋은 성능이 제공되기 때문.

 

결과적으로

 

둘 다 문자 혹은 문자열을 파일에

write 할 수 있지만

FileOutputStream은 문자 혹은 문자열을
파일에 쓰기 위해서는 이를

먼저 이진데이터로 변환하는 작업이 필요하다


아래 부분은 아직 이해가 안되니 참고만 해두자

 

Stack Overflow에서 누군가 남긴 댓글을 보면

이 분은 FileOutputStream

OutputStreamWriter로 감싸서

사용하는 것을 선호한다고 한다

 

FileWriter와 달리 FileOutputStream은 

문자 인코딩 방식을

개발자가 원하는대로 지정할 수 있기 때문이라함

 

FileWriter는

항상 플랫폼 기본 인코딩을 사용하므로

성가신 문제가 있다고 함

 

그리하여 추천하는 방식은

Charset을 허용하는? 받아들이는?

OutputStreamWriter의 생성자를

오버로딩 하여 사용하는 것이라고 함 

 

 

이 경우 Writer 객체 생성시 아래와 같이 될 것임

Writer writer = new OutputStreamWriter(new FileOutputStream("test.txt"));

 

https://stackoverflow.com/questions/36250571/filewriter-vs-fileoutputstream-in-java

 

FileWriter vs FileOutputStream in Java

I'm little confused about FileWriter and FileOutputStream. As I see source code of FileWriter there are just 4 constructors and each constructor is calling FileOutputStream's constructor. public

stackoverflow.com

1. 오직 FileOutputStream만을 이용한 방법

- FileOutputStream의 write() 메소드는 바이트 배열을 입력으로 받는다.

- 이는 위에서 언급된 바와 같이 raw bytes 스트림을 write 하는데 사용된다.
   이게 무슨말이냐? 이 객체를 이용해서 문자열이나 문자를 파일에 저장하고 싶다면,
   해당 데이터를 byte [ ] (바이트 배열)로 변환하여 이걸 write() 하라고 명령해야 한다.
- 따라서 문자 및 문자열도 파일에 쓸 수 있지만, 이미지 파일을 만드는 등에 사용하는게 적합하다고 한다.

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class WithOnlyFileOutputStream {
    public static void main(String[] args) {
        try {
 
            // 1. 파일 객체 생성
            File file = new File("writeFile.txt");
 
            // 2. 파일 존재여부 체크 및 생성
            if (!file.exists()) {
                file.createNewFile();
            }
 
            // 3. Writer 생성
            FileOutputStream fos = new FileOutputStream(file);
 
            // 4. 파일에 쓰기
            fos.write("안녕하세요".getBytes());
 
            // 5. FileOutputStream close
            fos.close();
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
안녕하세요

2. 오직 FileWriter 만을 이용한 방법

- FileWriter의 write() 메소드는 '문자' 혹은 "문자열"을 입력으로 받는다.

- 일반적으로 FileWriter는 BufferedWriter or PrintWriter 같은 상위 레벨의 Writer 객체에 의해 감싸져 사용되는데,
   좀 더 나은 성능 및 데이터를 write하기에 좀 더 유연한 메소드들이 제공되기 때문에 그러하다. 

- 아래 예제에서 사용하진 않았지만 append(), flush()나 close() 같은걸 사용할 수 있기도 함.
   단, close() 한 이후에는 write(), flush() 를 호출하면 예외가 발생하니 주의하자.
   flush() 는 즉시 데이터를 파일에 저장되도록 한다.

import java.io.FileWriter;

public class WithOnlyFileWriter {

	public static void main(String[] args) {
		
		try(FileWriter fileWriter = new FileWriter("file.txt")) {
			fileWriter.write("안녕하세요");
			fileWriter.write(65);
			fileWriter.write('B');
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}
안녕하세요AB

https://www.digitalocean.com/community/tutorials/java-filewriter-example

 

Java FileWriter Example | DigitalOcean

 

www.digitalocean.com

 

3. PrintWriter(FileWriter) 를 이용한 방법

- write(), println(), print() 메소드를 사용 할 수 있으며,
   이 중에서도 println() 을 사용하면 간편하게 줄바꿈을 자동으로 처리되게 할 수 있다.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
 
public class PrintWriterWithFileWriter {
    public static void main(String[] args) {
        try {
 
            // 1. 파일 객체 생성
            File file = new File("writeFile.txt");
 
            // 2. 파일 존재여부 체크 및 생성
            if (!file.exists()) {
                file.createNewFile();
            }
 
            // 3. Writer 생성
            FileWriter fw = new FileWriter(file);
            PrintWriter writer = new PrintWriter(fw);
 
            // 4. 파일에 쓰기
            writer.write("Hi\n");
            writer.println("My name is Gonie");
            writer.print("Bye~");
            writer.write("2222");
 
            // 5. PrintWriter close
            writer.close();
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Hi
My name is Gonie
Bye~2222

4. BufferedWriter(FileWriter) 를 이용한 방법

- write(), append() 모두 사용 가능하다 아직 무슨차이가 있는지 모르겠지만

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
public class BufferedWriterWithFileWriter {
    public static void main(String[] args) {
        try {
 
            // 1. 파일 객체 생성
            File file = new File("writeFile.txt");
 
            // 2. 파일 존재여부 체크 및 생성
            if (!file.exists()) {
                file.createNewFile();
            }
 
            // 3. Buffer를 사용해서 File에 write할 수 있는 BufferedWriter 생성
            FileWriter fw = new FileWriter(file);
            BufferedWriter writer = new BufferedWriter(fw);
 
            // 4. 파일에 쓰기
            writer.write("안녕하세요");
 
            // 5. BufferedWriter close
            writer.close();
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
안녕하세요

5. Files 클래스를 이용한 방법

- java.mio.file.Files 클래스는 static 메소드만 가지고 있다고 한다.
- write() 메소드는 인자로 byte [] 을 받는다

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
 
public class WriteFile {
    public static void main(String[] args) {
        try {
 
            // 1. Path 객체 생성
            Path path = Paths.get("d:\\example\\writeFile.txt");
 
            // 2. 파일에 쓰기
            Files.write(path, "안녕하세요".getBytes());
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6. DataOutputStream(BufferedOutputStream(DataInputStream)) 을 이용한 방법

- writeUTF() 메소드를 이용하면, UTF-8 인코딩을 적용하여 파일에 문자열을 쓸 수 있다.

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class WriteFile {
    public static void main(String[] args) {
        try {
 
            // 1. 파일 객체 생성
            File file = new File("writeFile.txt");
 
            // 2. 파일 존재여부 체크 및 생성
            if (!file.exists()) {
                file.createNewFile();
            }
 
            // 3. Writer 생성
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            DataOutputStream dos = new DataOutputStream(bos);
 
            // 4. 파일에 쓰기
            dos.writeUTF("안녕하세요");
 
            // 5. DataOutputStream close
            dos.close();
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

출처 : https://hianna.tistory.com/590

 

[Java] 파일에 텍스트 쓰기

Java에서 파일을 다루는 법을 알아보고 있습니다. [Java] 텍스트 파일 읽기 ( FileReader, BufferedReader, Scanner, Files ) [Java] 파일 생성하는 3가지 방법 (File, FileOutputStream, Files) [Java] 파일, 디렉토리 존재 여

hianna.tistory.com

Comments