2022. 12. 7. 23:41ㆍ자바
java. io // java의 I/O 시스템으로 관련 API 제공
<스트림>
1. 특징
자바는 입출력을 스트림을 통해 처리
스트림: 정보를 순차적으로 접근하도록 추상화 , 선입선출 구조
자바 I/O 시스템이 디바이스와 스트림으로 연결
자바 프로그램은 스트림을 통해 정보를 교환
2. 사용방법
데이터의 출발지와 목적지를 연결하여 사용
- 한번에 열수 있는 개수는 제한
- 동일한 파일은 둘 이상의 스트림으로 열 수 없음
- 스트림은 사용 전 열고, 사용 후 닫아야 함
3. 종류
1) 바이트 스트림: 입출력을 바이너리 데이터로 다룰 때
바이너리 데이터? 컴퓨터가 이해하는 데이터
InputStream, OutputStream

2) 문자 스트림: 입출력을 문자 단위로 다룰 때
Reader, Writer

표준 입출력 스트림 : 콘솔 입출력 시 사용되는 스트림
- java.lang.System 클래스 사용
ex) System.out.println()
<콘솔 입력 용 버퍼>
*자바 초창기에는 바이트 스트림만 이용
-> 패치 후 문자 스트림으로 문자 단위 읽기 지원
어떻게? System.in을 InputStreamReader와 BufferedReader 클래스로 래핑
BufferedReader(Reader inputReader) // inputReader를 버퍼를 이용해 읽어들임
InputStreamReader(InputStream inputStream) //inputStream을 문자 스트림으로 변환
버퍼를 두는 이유? 버퍼는 스트림과 프로그램 간에 데이터를 효율적으로 전송하려고 사용하는 메모리
->입출력 장치와 프로그램 간 동작 속도가 크게 차이가 날 때 버퍼를 사용하면 매우 효율적

<콘솔에서 문자 입력받기>
import java.io.*;
class BRRead {
public static void main(String[] args) throws IOException {
char c;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in,
System.console().charset())); //콘솔 입력용 버퍼 생성
System.out.println("Enter characters, 'q' to quit.");
do {
c = (char) br.read(); //BufferedReader에 입력된 문자를 읽음
System.out.println(c);
} while (c != 'q');
}
}
*int read() throws IOException //입력된 문자의 유니코드 값을 리턴,
반환형이 int이므로 예제에서는 char로 변환
스트림이 끝나면 -1을 리턴
문자를 입력하고 엔터를 치면 개행문자도 같이 읽음
*String readLine() throws IOException //입력된 문자열을 한줄 읽음
개행문자는 읽지 않음
<콘솔에 문자 출력 하기>
1. PrintStream 클래스 메서드 -print(), println()
- write()로도 출력 가능
2. Printwriter 클래스 //문자 스트림을 이용한 출력
System.out보다 추천되는 콜솔 출력 방법
PrintWriter pw = new PrintWriter(System.out,true);
/**첫번째 인자는 OutputStream 오브젝트
두번째 인자는 println() 호출 시 버퍼에 있는 데이터를 처리할지 결정
입력한거 바로바로 출력->성능이 느려질 수 있음
정해진만큼 출력->성능이 빠르지만 동기화 느림**/
pw.println("This is a string");
int i = -7;
pw.println(i);
double d = 4.5e-7;
pw.println(d);
<파일 I/O>
파일 읽어서 콘솔에 출력하는 예제
import java.io.*;
class ShowFile {
public static void main(String[] args) {
int i;
FileInputStream fin;
if (args.length != 1) {
System.out.println("Usage: ShowFile filename");
return;
}
try {
fin = new FileInputStream(args[0]);
//입력받은 스트링이 없는 파일인 경우 FileNotFoundException 발생
} catch (FileNotFoundException e) {
System.out.println("Cannot Open File");
return;
}
try {
do {
i = fin.read();//read() 메서드가 반환형이 int라 int i에 대입
//입력 스트림에서 1바이트를 읽고 리턴,끝까지 다 읽으면 -1 반환함
if (i != -1)
System.out.print((char) i);
} while (i != -1);
} catch (IOException e) {
System.out.println("Error Reading File");
}
try {
fin.close();
//파일 처리 이후에는 스트림을 닫아줘야함(try-with-resource 문 사용 시 자동으로 닫힘)
} catch (IOException e) {
System.out.println("Error Closing File");
}
}
}
파일 읽어서 다른 파일 생성 후,생성한 파일에 쓰는 예제
import java.io.*;
class CopyFile {
public static void main(String[] args) throws IOException {
int i;
FileInputStream fin = null;
FileOutputStream fout = null;
if (args.length != 2) {
System.out.println("Usage: CopyFile from to");
return;
}
try {
fin = new FileInputStream(args[0]);
fout = new FileOutputStream(args[1]);
do {
i = fin.read();
if (i != -1)
fout.write(i); //하위 1바이트를 출력 스트림에 쓰기
} while (i != -1);
} catch (IOException e) {
System.out.println("I/O Error: " + e);
} finally {
try {
if (fin != null) //다읽으면 -1이 저장되므로
fin.close();
} catch (IOException e2) {
System.out.println("Error Closing Input File");
}
try {
if (fout != null)
fout.close();
} catch (IOException e2) {
System.out.println("Error Closing Output File");
}
}
}
}
'자바' 카테고리의 다른 글
| 기타 자바 키워드 (0) | 2022.12.08 |
|---|---|
| try-with-resources문 (0) | 2022.12.08 |
| 열거형, 박싱, 어노테이션 (0) | 2022.12.07 |
| 디폴트 메서드 (0) | 2022.12.07 |
| (자바) valueOf() (0) | 2022.11.17 |