> java.io 패키지
> 스트림 stream
데이터의 흐름(통로)
입력 스트림: 데이터가 들어옴 / 출력 스트림: 데이터가 나감
- 스트림 클래스 종류 두가지 -
1. byte 기반 스트림: <1byte 단위> 그림, 문자 등 모든 종류의 데이터 보낼 수 있음 - 이미지, 동영상 등의 데이터에 주로 사용
2. 문자 기반 스트림: <2byte 단위> 오직 문자만 보낼 수 있음 - 문자열에 주로 사용
1. byte 기반 스트림
모든 바이트 기반 스트림은 바이트 기반 최상위 클래스(입력 스트림 InputStream, 출력 스트림 OutputStream)를 상속받아 만들어짐
이 때, 하위 클래스는 접미사로 각각 InputStream/OutputStream 을 붙임
ex. FileInputStream, FileOutputStream
- OutputStream
바이트 기반 출력 스트림의 최상위 클래스
추상클래스
- 주요 메소드 -
1) write(byte b): 출력 스트림으로 1바이트를 내보냄
2) write(byte[] b): 출력 스트림으로 주어진 바이트 배열 b의 모든 바이트들을 내보냄
→ byte 단위로 쓰는 OutputStream
Scannr scan = new Scanner(System.in);
System.out.print("파일명 입력>");
String name = scan.next();
OutputStream fos = null;
try {
//FileOutputStream(파일을 쓸 경로)
fos = new FileOutputStream("C:\\Users\\ ~ \\" + name + ".txt");
System.out.print("문장 입력>");
scan.nextLine();
String str = scan.nextLine();
byte[] bs = str.getBytes();
fos.write(bs);
System.out.println("파일이 정상적으로 저장됨");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
scan.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
- InputStream
바이트 기반 입력 스트림의 최상위 클래스
추상클래스
InputStream 추상 클래스를 이용해 객체 생성, 하위 클래스로 구현 (한글은 2바이트이므로 깨지는 현상 있음)
- 주요 메소드 -
1) read(): 입력 스트림으로부터 1바이트를 읽고, 읽은 바이트 반환
2) read(byte[] b): 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열에 저장하고, 실제로 읽은 바이트 수 반환
3) close(): 스트림을 더이상 사용하지 않을 경우 사용한 시스템 자원을 풀어줌
→ byte 단위로 읽는 InputStream
InputStream fis = null;
try {
//FileInputStream(읽을 파일의 경로)
fis = new FileInputStream("C:\\Users\\ ~ .txt");
while(true) {
int data = fis.read();
System.out.print((char)data);
if(data == -1) break;
}
} catch (FileNotFoundException e) {
System.out.println("해당 경로의 파일을 찾을 수 없음");
} catch (IOException e) {
System.out.println("파일을 읽을 수 없음");
} finally {
try {
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2. 문자 기반 스트림
바이트 기반 스트림에서 한글(2byte)이 깨지는 문제점을 보완 → 문자/문자열을 다룰 때 유니코드 방식 제공
입력 클래스 Reader, 출력 클래스 Writer
이 입출력 클래스를 사용하면 자동으로 바이트가 유니코드화 됨 (2바이트 문자도 정상 처리)
ex. FileReader, FileWriter
- Writer
텍스트 파일을 프로그램으로 쓸 때 사용하는 문자 기반 스트림
추상 클래스
클래스의 객체 생성, 하위 클래스로 구현
주요 메소드 - OutputStream 클래스와 거의 동일
- Reader
텍스트 파일을 프로그램으로 읽을 때 사용하는 문자 기반 스트림
문자 단위로 읽고 씀 (텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽거나 쓸 수 없음)
추상클래스
클래스의 객체 생성, 하위 클래스로 구현
주요 메소드 - InputStream 클래스와 거의 동일
3. 입출력 성능 향상 보조 스트림
- BufferedWriter
텍스트 파일을 프로그램으로 쓸 때 (출력) 사용하는 문자 기반 스트림
데이터를 읽어 버퍼에 저장한 후 한번에 쓰는 형태로 사용됨, 속도가 빠름
생성자의 매개변수로 (문자 출력 스트림 클래스)를 전달
Write rt = new FileWriter("쓸 파일의 경로");
BufferedWriter bw = new BufferedWriter(rt); //생성자의 매개변수에 rt 전달
- 주요 메소드 -
writer 클래스와 거의 동일
flush(): 버퍼를 비움
주의: 버퍼가 가득 찼을 때만 출력 → flush()를 호출하여 잔류하는 데이터를 모두 보내야 함
- BufferedReader
텍스트 파일을 프로그램으로 읽을 때 (입력) 사용하는 문자 기반 스트림
데이터를 읽어 버퍼에 저장한 후 한번에 읽는 형태로 사용됨, 속도가 빠름
생성자의 매개변수로 (문자 입력 스트림 클래스)를 전달
Reader rd = new FileReader("읽을 파일의 경로");
BufferedReader bf = new BufferedReader(rd); //생성자의 매개변수에 rd 전달
- 주요 메소드 -
Reader 클래스와 거의 동일
readLine(): 한 줄을 한번에 읽어들임
try{
Reader rd = new FileReader("읽을 파일의 경로");
BufferedReader bf = new BufferedReader(rd);
String str = "";
while((str = bf.readLine()) != null) {
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}
'course 2021 > JAVA' 카테고리의 다른 글
day22 - lambda expression (0) | 2021.09.27 |
---|---|
day21 - regular expression (0) | 2021.09.27 |
day19 - API(2) generic, collection (0) | 2021.09.22 |
day18 - API(1) java.lang, java.util (0) | 2021.09.15 |
day17 - exception (0) | 2021.09.11 |