1. 스트림 Stream
- 순서가 있는 데이터의 연속적인 흐름
- 입풀력 단위에 따라 분류
바이트 스트림 | 문자 스트림 |
바이트 단위로 입출력하는 클래스 | 문자 단위로 입출력하는 클래스 |
추상 클래스인 InputStream, OutputStream에서 파생됨 | 기본 추상 클래스인 Reader, Writer 클래스에서 파생됨 |
바이트 스트림 클래스 이름에는 InputStream(입력), OutputStream(출력)이 붙음 | 문자 스트림 클래스 이름에는 Reader(입력), Writer(출력)이 붙음 |
2. 문자 스트림
- 입출력 단위가 문자 (바이트 X)
- 자바는 유니코드 이용하여 문자 저장
- 주요 메소드
- 파일에서 문자 읽고 쓸 때는 FileReader, FileWriter 사용
- 파일에서 문자 읽는 경우 일반적으로 반복문 사용
int ch;
while ((ch = fr.read()) != -1)
System.out.print((char) ch + " ");
import java.io.*;
public class FileReaderTets(String met){
public static void main(String[] args) {
FileReader fr;
try {
fr = new FileReader("test.txt");
int ch;
while((ch fr.read() != -1)
System.out.print((char) ch + " ");
fr.close();
} catch (IOException e) {
e.printSTackTrace();
}
}
}
3. try-with-resources 사용
- close() 따로 호출하지 않아도 자동으로 호출
import java.io.*;
public class FileReaderTest2 {
public static void main(String[] args) throws Exception {
try(FileReader fr = new FileReader("test.txt")) {
int ch;
while((ch = fr.read()) != -1 )
System.out.print((char) ch);
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 중간 처리 스트림
- 자료형이 다른 몇 개의 데이터 파일에 출력했다가 다시 읽기
import java.io.*;
public class DataStreamTest {
public static void main(String[] args) throws IOException {
DataInputStream in = null;
DataOutputStream out = null;
try {
out = new DataOutputStream(new FileOutputStream("data.bin"));
out.writeInt(123);
out.writeFloat(123.456F);
out.close();
in = new DataInputStream(new FileInputStream("data.bin"));
int aint = in.readInt();
float afloat = in.readFloat();
System.out.println(aint);
System.out.println(afloat);
}
finally { // 예외에 상관없이 실행
if (in != null) // in이 생성 되어있다면
in.close();
if (out != null)
out.close();
}
}
}
// 123
// 123.456
5. 버퍼 스트림
- 버퍼 입력 스트림: 입력 장치에서 한번에 많이 읽어서 버퍼에 저장, 입력을 요구하면 버퍼에서 꺼내서 반환함
- 버퍼가 비었을 때만 입력 장치에서 읽음
inputStream = new BufferedReader(new FileReader("input.txt"));
outputStream = new BufferedWriter(new FileWriter("output.txt"));
- 줄 단위로 복사하기 (BufferedReader, PrintWriter 클래스 사용)
import java.io.*;
public class CopyLines {
public static void main(String[] args) {
try (BufferedReader in = new BufferedReader(new FileReader("test.txt"))) {
PrintWriter out = new PrintWriter(new FileWriter("output.txt"))) {
String line;
while ((line = in.readLine()) != null) {
out.println(line);
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
6. InputStreamReader, OutputStreamWriter 클래스
- 바이트 스트림과 문자 스트림을 연결하는 두 개의 범용 브릿지 스트림
6-1) 한글 코드
- ASCII
- EUC-KR : 한글 완성형, 16비트, 국내 규격
- CP949 (MS949) : 한글 지원을 위해 MS 윈도우 계열에서 등장한 확장 완성형 인코딩 방식, ANSI
- 유니코드 : 전 세계에서 사용하는 수많은 문자들 각각에 부여한 코드들의 집합
- UTF-8 : 1~4byte로 인코딩하는 가변 길이 인코딩 방식, 기본적으로 첫 128개의 문자들은 1byte에 그대로 인코딩
- UTF-16 : 16bit 기반의 인코딩 방식, 한글 2byte, ANSI와 호환이 되지 않는 문제 있음
6-2) InputStreamReader
- 바이트 스트림 -> 문자 스트림으로 변환
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(FileDir), "UTF8"));
- UTF-8 코딩 파일 읽기
public class CharEncodingTest {
public static void main(String[] args) throws IOException {
File FileDir = new File("input.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(fileDir), "UTF-8"));
String str;
while ((str=in.readLine()) != null) {
System.out.println(str);
}
in.close();
}
}
7. 객체 저장하기 : 객체 직렬화
- 객체 직렬화 : 객체가 가진 데이터들을 순차적인 데이터로 변환
- 순차적인 데이터가 되면 파일에 쉽게 저장할 수 있음
- 직렬화 지원 : Serializable 인터페이스 구현
- 역직렬화 : 직렬화된 데이터를 읽어서 자신의 상태를 복구하는 것
- Date 객체 저장하기
public class ObjectStreamTest {
public static void main(String[] args) throws Exception {
ObjectInputStream in = null;
ObjectOutputStream out = null;
int c;
out = new ObjectOutputStream(new FileOutputStream("object.dat"));
out.writeObject(new Date());
out.close();
in = new ObjectInputStream(new FileInputStream("object.dat"));
Date d = (Date) in.readObject();
System.out.println(d);
in.close();
}
}
// Sat Jan 06 14:46:32 KST 2018
8. Path 객체
- 경로를 나타내는 클래스
- "D:\sources\test.txt" 와 같은 경로를 받아서 객체 반환
public class PathTest {
public static void main(String[] args) {
Path path = Paths.get("D:\\sources\\test.txt");
System.out.println("전체 경로: " + path);
System.out.println("파일 이름: " + path.getFileName());
System.out.println("부모 이름: " + path.getParent().getFileName());
}
}
/**
전체 경로: D:\sources\test.txt
파일 이름: test.txt
부모 이름: sources
**/
9. File 객체
- 파일을 조작하고 검사하는 코드를 쉽게 작성하게 해주는 클래스
- 파일이 아닌, 파일 이름을 나타내는 객체!
File file = new File("data.txt");
10. 스트림 라이브러리로 파일 처리하기
// 현재 디렉터리의 모든 파일을 출력하는 코드
Files.list(Paths.get(".")).forEach(System.out::println);
// 파일 읽어서 각 줄 끝에 있는 불필요한 공백을 제거하고 빈 줄을 필터링한 후에 출력
Files.lines(new File("test.txt").toPath())
.map(s -> s.trim())
.filter(s -> !s.isEmpty())
.forEach(System.out::println);
'Software > JAVA' 카테고리의 다른 글
[Baekjoon] 1085.직사각형에서 탈출 (0) | 2023.04.03 |
---|---|
[JAVA] Day14. 멀티 스레딩 (2) | 2023.01.18 |
[JAVA] Day12. 제네릭과 컬렉션 (0) | 2023.01.11 |
[JAVA] Day11. 자바 그래픽 (5) | 2023.01.10 |
[JAVA] Day10. 스윙 컴포넌트 (0) | 2023.01.09 |