일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 컬렉션
- 싱글톤
- wrapper
- 무한
- 내장객체
- 콜렉션
- unboxing
- start.spring.io
- 빌드
- Java
- bootstrap
- 인텔리제이
- 언박싱
- 제네릭
- maven
- Short
- 루프
- 스프링
- Jenkins
- 박싱
- 제너릭
- Scanner
- 자동형변환
- dependency
- 클래스
- boxing
- suvlet
- 메소드
- https://start.spring.io
- 싱글턴
- Today
- Total
Developer Gonie
File에 Text를 쓰는 여러가지 방법(feat. Java API) 본문
목차
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
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
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();
}
}
}