🔴🔴 아래 서술할 메소드들은 꼭 그 클래스에 한해 사용되는 메소드가 아니며,
메소드 형식과 내용이 상당히 비슷해서
일부만 확실히 알아두면 다른 메소드를 이해하기 편하다!
- 가장 기본이 되는 스트림
- 데이터를 바이트 단위로 주고받으며, 1byte씩 데이터를 읽어옴
- 컴퓨터의 모든 데이터는 0 또는 1이 되고, 0과 1은 bit 한자리 (8bit → 1byte)
- 데이터를 주고받을 때 대부분 byte 단위로 주고받음
int read()
: 1byte
만 읽어와서 int
타입으로 반환하며, 더이상 읽어올 자료가 없으면 -1 반환int read(byte[] b)
: 배열의 크기만큼 읽어온 데이터를 배열에 저장하며, 더이상 읽어올 자료가 없으면 -1 반환int read(byte[] b, int off, int len)
: 데이터를 len(개수)만큼 읽어서 배열의 off번째부터 저장하며, 더이상 읽어올 자료가 없으면 -1 반환 available()
: 앞으로 읽어올 수 있는 데이터 개수 반환read()
시 다음칸으로 이동하며 데이터를 차례로 가져옴available()
은 포인터 뒤의 데이터 개수 반환🟣 파일 입력용 스트림 객체 생성하기
방법 1. 읽어올 파일의 경로 및 파일명을 문자열로 지정하기FileInputStream fin = new FileInputStream("d:/d_other/test.txt");
방법 2. 읽어올 파일의 정보를 갖는 File 객체를 지정하기
File file = new File("d:/d_other/test.txt"); FileInputStream fis = new FileInputStream(file);
👉 'd:/d_other/test.txt' 파일의 내용을 읽어와서 화면에 출력하기
try {
File file = new File("d:/d_other/test.txt");
FileInputStream fis = new FileInputStream(file);
int c; // 읽어온 데이터 저장
while((c = fis.read()) != -1) {
System.out.println((char)c);
}
fin.close();
} catch (IOException e) {
System.out.println("입출력 오류!!" + e);
}
void write(int b)
: 1byte
만 추출하여 출력 스트림에 씀void write(byte[] b)
: 전체 배열을 출력 스트림에 씀void write(byte[] b, int off, int len
: 배열의 off 인덱스부터 시작하여 len 개수만큼의 바이트를 출력 스트림에 씀👉 파일에 알파벳 A-Z 출력하기
try {
FileOutputStream fos = new FileOutputStream("d:/d_other/outTest.txt");
for(char i='A'; i<='Z'; i++) {
fos.write(i);
}
System.out.println("출력 작업 완료!!");
fos.close();
} catch (IOException e) {}
byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
byte[] outSrc = null;
// 입력용 스트림 객체 생성
ByteArrayInputStream input = new ByteArrayInputStream(inSrc);
// 출력용 스트림 객체 생성
ByteArrayOutputStream output = new ByteArrayOutputStream();
int data;
while((data = input.read()) != -1) {
output.write(data); // 자료 출력
}
outSrc = output.toByteArray();
try {
input.close();
output.close();
} catch (IOException e) {}
System.out.println(" inSrc: " + Arrays.toString(inSrc));
System.out.println("outSrc: " + Arrays.toString(outSrc));
byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
byte[] outSrc = null;
byte[] temp = new byte[4]; // 입출력에 활용할 배열 생성
// 입력용 스트림 객체 생성
ByteArrayInputStream input = new ByteArrayInputStream(inSrc);
// 출력용 스트림 객체 생성
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
while(input.available() > 0) {
int len = input.read(temp); // 실제 읽어온 데이터 개수 반환
output.write(temp, 0, len); // temp 배열의 데이터 중 0번째부터 len개의 데이터 출력
System.out.println("반복문 내부 temp: " + Arrays.toString(temp));
}
outSrc = output.toByteArray();
System.out.println();
System.out.println("inSrc: " + Arrays.toString(inSrc));
System.out.println("outSrc: " + Arrays.toString(outSrc));
input.close();
output.close();
} catch (IOException e) {}
- 문자(char) 데이터를 처리하기 위한 스트림
❗ 바이트 기반 스트림과 쉽게 구분하기
- 끝에
Reader
혹은Writer
가 붙으면 문자 기반 스트림이라고 생각하면 된다!- 텍스트 파일, 문자열, 네트워크 연결 등에서 문자 데이터를 읽고 쓸 때 사용
int read()
: 입력 스트림으로부터 한 문자를 읽어 반환, 더이상 읽어올 자료가 없으면 -1 반환int read(char[] c)
: 입력 스트림으로부터 배열 길이만큼의 문자를 읽어 배열에 저장, 실제로 읽은 문자 수 반환int read(char[] c, int off, int len)
: 입력 스트림으로부터 최대 len만큼의 문자를 읽어 배열의 off번째부터 저장, 실제로 읽은 문자 수 반환👉 문자 기반 스트림을 이용하여 파일을 읽어와 출력하기
try {
FileReader fr = new FileReader("d:/d_other/test.txt");
int c;
while((c = fr.read()) != -1) {
System.out.println((char)c);
}
fr.close();
} catch (IOException e) {}
void write(int c)
: 출력 스트림에 한 문자를 씀void write(char[] c)
: 출력 스트림에 문자 배열 전체를 씀void write(char[] c, int off, int len)
: 출력 스트림에 배열 len만큼의 문자를 off 인덱스부터 씀void write(String str)
: 출력 스트림에 문자열 전체를 씀void write(String str, int off, int len)
: 출력 스트림에 문자열 len만큼의 문자를 off 인덱스부터 씀void flush()
: 출력 스트림을 비우고, 버퍼의 내용 출력👉 사용자가 입력한 내용 그대로 파일에 저장하기
try {
// 입력용 바이트 기반 스트림을 입력용 문자 기반 스트림으로 변환
InputStreamReader isr = new InputStreamReader(System.in);
// 파일 출력용 문자 기반 스트림 객체 생성
FileWriter fw = new FileWriter("d:/d_other/testChar.txt");
System.out.println("아무거나 입력하세요. 입력의 끝은 [ Ctrl + Z ] 키 입니다.");
int c;
while((c = isr.read()) != -1) {
fw.write(c); // 콘솔로 입력받은 자료를 파일에 출력
}
isr.close();
fw.close();
} catch (IOException e) {}
👉 한글의 인코딩 방식을 지정해서 읽어오기
try {
FileInputStream fin = new FileInputStream("d:/d_other/test_ansi.txt"); // ansi 방식을
InputStreamReader isr = new InputStreamReader(fin, "utf-8"); // utf-8 방식으로
int c;
while((c = isr.read()) != -1) {
System.out.println((char)c);
}
} catch (IOException e) {}