Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 파이썬
- BFS
- dfs
- 프로그래머스
- BOJ
- DP
- 99클럽
- 문자열
- 다이나믹프로그래밍
- 개발자스터디
- 구현
- 자바
- 너비우선탐색
- 깊이우선탐색
- 알고리즘
- SSAFY수료식
- 항해
- 삼성청년SW아카데미
- java
- programmers
- python
- 위상정렬
- 백준
- 99일지
- 브루트포스
- 백트래킹
- 코딩테스트
- til
- 싸피
- ssafy
Archives
- Today
- Total
EunJng
[Java] 이것이 자바다 Ch. 18 본문
'이것이 자바다' 교재 및 강의를 참고하여 정리한 내용입니다.
Ch.18 데이터 입출력
입출력 스트림
- 스트림
- 바이트 스트림: 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 입출력할 때 사용
- 문자 스트림: 문자만 입출력할 때 사용
바이트 스트림 | 문자 스트림 | |||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위 클래스 | XXXInputStream | XXXOutputStream | XXXReader | XXXWriter |
바이트 출력 스트림
- OutputStream 클래스의 주요 메소드
- write(int b) : 1 byte를 출력
- write(byte[] b) : 매개값으로 주어진 배열 b의 모든 바이트를 출력
- write(byte[] b, int off, int len) : 매개값으로 주어진 배열 b[off]부터 len개의 바이트를 출력
- write() 메소드가 호출되면 버퍼에 바이트를 우선 저장하고, 버퍼가 차면 순서대로 바이트를 출력
- flush() : 출력 버퍼에 잔류하는 모든 바이트를 출력
- close() : 출력 스트림을 닫고 사용 메모리 해제
- write(), flush(), close() 메소드도 IOException이 발생할 수 있으므로 예외 처리를 해야 한다.
바이트 입력 스트림
- InputStream 클래스의 주요 메소드
- read() : 1byte를 읽은 후 읽은 바이트를 리턴
- read(byte[] b) : 읽은 바이트를 매개값으로 주어진 배열에 저장 후 읽은 바이트 수를 리턴
- 더 이상 입력 스트림으로부터 바이트를 읽을 수 없다면 read() 메소드는 -1 리턴
- close() : 입력 스트림을 닫고 사용 메모리 해제
문자 입출력 스트림
- Wrtier 클래스의 주요 메소드
- write(int c) : 매개값으로 주어진 한 문자를 출력
- write(char[] cbuf) : 매개값으로 주어진 배열의 모든 문자를 출력
- write(char[] cbuf, int off, int len) : 매개값으로 주어진 배열에서 cbuf[off]부터 len개까지의 문자 출력
- write(String str) : 매개값으로 주어진 문자열 출력
- write(String str, int off, int len) : 매개값으로 주어진 문자열에서 off 순번부터 len개까지의 문자 출력
- flush() : 버퍼에 잔류하는 모든 문자 출력
- close() : 출력 스트림을 닫고 사용 메모리를 해제
- Reader 클래스의 주요 메소드
- read() : 1개의 문자를 읽고 리턴
- read(char[] cbuf) : 읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자 수를 리턴
- close() : 입력 스트림을 닫고 사용 메모리를 해제
보조 스트림
- 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림
- 보조스트림 변수 = new 보조스트림(입출력스트림);
- InputStreamReader : 바이트 스트림을 문자 스트림으로 변환
- BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter : 입출력 성능 향상
- DataInputStream, DataOutputStream : 기본 타입 데이터 입출력
- PrintStream, PrintWriter : 줄바꿈 처리 및 형식화된 문자열 출력
- ObjectInputStream, ObjectOutputStream : 객체 입출력
문자 변환 스트림
- 바이트 스트림에서 입출력할 데이터가 문자라면 문자 스트림으로 변환해서 사용하는 것이 좋다.
- 문자로 바로 입출력할 수 있고, 문자셋의 종류 지정 가능
InputStream을 Reader로 변환
InputStream is = new FileInputStream("C:/Temp/test.txt");
Reader reader = new InputStreamReader(is);
OutputStream을 Writer로 변환
OutputStream os = new FileOutputStream("C:/Temp/test.txt");
Writer writer = new OutputStreamWriter(os);
성능 향상 스트림
- 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업해 실행 성능을 향상시킬 수 있다.
BufferedInputStream bis = new BufferedInputStream(바이트 입력 스트림);
BufferedOutputStream bos = new BufferedOutputStream(바이트 출력 스트림);
BufferedReader br = new BufferedReader(문자 입력 스트림);
BufferedWriter bw = new BufferedWriter(문자 출력 스트림);
// BufferedReader: 행 단위로 문자열 읽는 readLine() 메소드 제공
while(true) {
String str = br.readLine();
if(str == null) break;
}
기본 타입 스트림
- 바이트 스트림에 DataInputStream와 DataOutputStream 보조 스트림을 연결하면 기본 타입인 boolean, char, short, int, long, float, double 값을 입출력할 수 있다.
- 데이터 타입의 크기가 모두 다르기 때문에 DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어 올 때는 출력한 순서와 동일한 순서로 읽어야 한다.
프린트 스트림
- PrintStream, PrintWriter는 프린터와 유사하게 출력하는 print(), println(), printf() 메소드를 가지고 있는 보조 스트림
객체 스트림
- 직렬화: 필드값을 일렬로 늘어선 바이트로 변경 - ObjectOutputStream
- 역직렬화: 직렬화된 바이트를 객체의 필드값으로 복원 - ObjectInputStream
ObjectInputStream ois = new ObjectInputStream(바이트 입력 스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트 cnf력 스트림);
oos.writeObject(객체); // ObjectOutputStream으로 객체 직렬화
객체타입 변수 = (객체타입) ois.readObject();
// readObject() : 읽은 바이트를 역직렬화해서 객체로 생성
// 리턴 타입이 Object이므로 구체적 타입으로 강제 타입 변환
Serializable 인터페이스
- 자바는 Serializable 인터페이스를 구현한 클래스만 직렬화할 수 있도록 제한
- Serializable 인터페이스: 멤버가 없는 빈 인터페이스이지만, 객체를 직렬화할 수 있다고 표시하는 역할
public class XXX implements Serializable {
public int field1;
protected int field2;
int field3;
private int field4; // 1~4 : 직렬화
public static int field5; // 정적 필드는 직렬화에서 제외
transient int field6; // transient로 선언된 필드는 직렬화에서 제외
}
serialVersionUID 필드
- 직렬화할 때 사용된 클래스와 역직렬화할 때 사용된 클래스는 동일한 클래스여야 한다.
- 클래스 내용이 다르더라도 직렬화된 필드를 공통으로 포함하고 있다면, 두 클래스가 동일한 serialVersionUID 상수값을 가지면 역직렬화 가능
public class Member implements Serializable {
static final long serialVersionUID = 1;
int field1;
int field2;
}
public class Member implements Serializable {
static final long serialVersionUID = 1;
int field1;
int field2;
int field3;
}
File과 Files 스트림
File 클래스
- File file = new File("경로");
- exists() : 파일이나 폴더 존재 여부 확인
- 리턴값이 false
- createNewFile(), mkdir(), mkdirs()
- true
- delete(), canExecute(), canRead(), canWrite(), getName(), getParent(), getParentFile(), getPath(), isDirectory(), isFile(), isHidden(), lastModified(), length(), list(), list(FilenameFilter filter), listFiles(), listFiles(FilenameFilter filter)
- 리턴값이 false
Files 클래스
- 정적 메소드로 구성되어 있어 객체로 만들 필요가 없다.
'STUDY > JAVA' 카테고리의 다른 글
[Java] 이것이 자바다 Ch.19 (0) | 2024.02.27 |
---|---|
[Java] 이것이 자바다 Ch.17 (0) | 2024.02.22 |
[Java] 이것이 자바다 Ch.16 (0) | 2024.02.20 |
[Java] 이것이 자바다 Ch.15 (0) | 2024.02.19 |
[Java] 이것이 자바다 Ch.14 (0) | 2024.02.16 |