| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 | 30 |
- 파이썬
- 사전학습
- GridLayout
- FileWriter
- rnn
- 예제
- html 기초
- 반응형웹
- 메서드
- 반응형 웹 프로젝트
- HTML
- BorderLayout
- ObjectOutputStream
- g검정
- FFT
- iframe 태그
- java
- Codility
- FlowLayout
- 퍼셉트론
- inline
- oracle
- html 프로젝트
- css 기초
- CSS
- 상속
- 푸리에 변환
- Database
- 미디어쿼리
- Position
- Today
- Total
도라에몽주머니
[Java] 파일 입출력 정리 본문
개요
수업을 듣던 중, 파일 입출력을 구현하는데 강사님께서 FileReader, FileInputStream 등 다양한 방법을 사용하셨다. 문득 뭐가 다르길래 여러 방식으로 파일 입출력을 구현하는건지 궁금해졌고, 이번 기회에 각 방식의 사용법, 차이 등을 정리해두면 좋을 것 같다고 생각했다.

예외 처리
파일 입출력을 구현할 때, 반드시 예외 처리를 구현해 주어야 한다. throws를 사용하는 것 보다 try-catch 문을 사용하는 것이 더 바람직하다.
파일 작성
FileWriter
: 문자 기반 스트림으로 텍스트 데이터를 파일에 저장할 때 사용한다. 문자 단위로 저장하므로 텍스트만 저장할 수 있다.
FileWriter file = null;
try {
file = new FileWriter("foo.txt");
file.write("foobar");
file.close();
} catch (Exception e) {
System.out.println("[ERROR] 알 수 없는 에러");
// e.printStackTrace(); 를 사용하면 원본 에러 메세지 확인 가능
}
FileOutputStream
: 바이트 기반 스트림으로 텍스트 데이터를 파일에 저장할 때 사용한다. 바이트 단위로 저장하므로 바이트, 텍스트로 저장할 수 있다.
1. String을 Byte로 변환해서 파일 작성
FileOutputStream file = null;
try {
file = new FileOutputStream("foo.txt");
String strText = "foobar";
file.write(strText.getBytes()); // String to Byte
file.close();
} catch (FileNotFoundException e) {
System.out.println("[ERROR] 파일 생성 실패");
} catch (IOException e) {
System.out.println("[ERROR] 파일 저장 실패");
} catch (Exception e) {
System.out.println("[ERROR] 알 수 없는 에러");
}
2. 객체 직렬화(Serialization) 를 통해 파일 작성
: 객체 직렬화를 통해 객체를 바이트 스트림으로 변경하고 이를 파일에 저장하는 방법이다.
- 보조스트림(ObjectOutputStream) 을 활용해 객체 직렬화
- 직렬화는 Serializable 인터페이스를 구현한 클래스만 직렬화 가능
직렬화란?
: 자바 시스템 내부에서 사용되는 Object 또는 데이터를 외부의 자바 시스템에서도 사용 가능하도록 byte 형태로 데이터를 변환하는 기술이다. 직렬화를 통해 프로그램이 실행되는 동안 생성된 객체를 스트림을 이용해 지속적으로 보관하거나 전송할 수 있다.
역직렬화란?
: byte로 변환된 데이터를 원래대로 Object나 데이터로 변환하는 기술이다.
FileOutputStream file = null;
ObjectOutputStream oos = null;
try {
file = new FileOutputStream("foo.txt");
oos = new ObjectOutputStream(file);
Data data = new Data(1, "choi", "abc@naver.com");
oos.writeObject(data);
System.out.println("입력 완료");
} catch (FileNotFoundException e) {
System.out.println("[ERROR] 파일 생성 실패");
} catch (IOException e) {
System.out.println("[ERROR] 파일 저장 실패");
} catch (Exception e) {
System.out.println("[ERROR] 알 수 없는 에러");
} finally {
try {
if(oos != null) oos.close();
if(file != null) file.close();
} catch (IOException e) {
System.out.println("[ERROR] 파일 닫기 에러");
}
}
파일 읽기
FileReader
: 문자 기반 스트림으로 파일을 문자 단위로 읽어올 때 사용한다. 문자 단위로 읽어오기 때문에 byte 타입이 아닌 char 타입의 배열에 입력해 주어야 한다.
FileReader file = null;
char[] arr = new char[20];
try {
file = new FileReader("foo.txt");
file.read(arr);
for(char c : arr) {
System.out.print(c); // arr에 불러온 파일 내용 character 단위로 출력
}
file.close();
} catch (Exception e) {
System.out.println("[ERROR] 알 수 없는 에러");
}
FileInputStream
: 바이트 기반 스트림으로 저장된 파일을 객체로 다시 읽어올 때 사용한다. 1 byte 크기의 정수로 읽어오므로 문자로 출력하기 위해서는 (char)타입으로 형변환을 해주어야 한다.
FileInputStream file = null;
ObjectInputStream ois = null;
byte[] arr = new byte[20];
try {
file = new FileInputStream("foo.txt");
ois = new ObjectInputStream(file);
file.read(arr);
for(byte a : arr) {
System.out.print((char)a);
}
} catch (FileNotFoundException e) {
System.out.println("[ERROR] 파일의 경로를 찾을 수 없습니다. >> " + fileName);
} catch (IOException e) {
System.out.println("[ERROR] 파일 읽기 실패 >> " + fileName);
} catch (ClassNotFoundException e) {
System.out.println("[ERROR] 클래스가 없습니다. >> " + fileName);
} catch (Exception e) {
System.out.println("[ERROR] 알 수 없는 에러");
} finally {
try {
if(ois != null) ois.close();
if(fis != null) fis.close();
} catch (IOException e) {
System.out.println("[ERROR] 파일 닫기 실패");
}
}
References
https://ldgeao99-developer.tistory.com/165
'Programming > Java' 카테고리의 다른 글
| [Java] 진법 변환 정리 (N진수 ↔ 10진수) (0) | 2022.11.03 |
|---|---|
| [Java] extends, implements의 차이 (0) | 2022.10.11 |
| [Java] 실수형(float, double)의 소수점 표현 방식, 부동소수점 (1) | 2022.09.21 |
| [MacOS / JAVA] MacOS에서 이클립스(Eclipse) 설치하기 (0) | 2021.03.05 |