입력 스트림 : 대상으로부터 자료를 읽어들이는 스트림
FileInputStream, FileReader, BufferedInputStream, BufferedReader 등
출력 스트림 : 대상으로 자료를 출력하는 스트림
FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등
바이트 단위 스트림 : 동영상, 음악, 실행 파일 등의 자료를 읽고 쓸 때 사용
FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream 등
문자 단위 스트림 : 바이트 단위로 자료를 처리하면 문자는 깨짐, 인코딩에 맞게 2바이트 이상으로 처리하도록 구현된 스트림
FileReader, FileWriter, BufferedReader, BufferedWriter 등
기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
FileInputStream, FileOutputStream, FileReader, FileWriter 등
보조 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림
보조 스트림은 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개 변수로 포함함
InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream 등
public class System{
public static PrintStream out;
public static InputStream in;
public static PrintStream err;
}
System.out은 표준 출력(모니터) 스트림
System.out.println("출력 메세지");
System.in은 표준 입력(키보드) 스트림
int d = System.in.read() // 한 바이트 읽기
System.err는 표준 에러 출력(모니터) 스트림
System.err.println("에러 메세지");
public static void main(String[] args) {
System.out.println("알파벳 하나를 쓰고 [Enter]를 누르세요");
int i;
try {
i = System.in.read();
System.out.println(i);
System.out.println((char)i); //char 단위로 출력하기 때문에 한 글자만 가능
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
========================
public static void main(String[] args) {
System.out.println("알파벳 여러 개를 쓰고 [Enter]를 누르세요");
int i;
try {
while( (i = System.in.read()) != '\n' ) {
System.out.print((char)i); //문자열을 안된다
}
} catch (IOException e) {
e.printStackTrace();
}
}
========================
public static void main(String[] args) {
System.out.println("알파벳 여러 개를 쓰고 [Enter]를 누르세요");
int i;
try {
I InputStreamReader irs = new InputStreamReader(System.in);
//InputStreamReader로 한 번 감싸준다
while ((i = irs.read()) != '\n') {
System.out.print((char)i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
바이트 단위 입력 클래스 중에 최상위 클래스
FileInputStream
파일에서 바이트 단위로 자료를 읽습니다.
ByteArrayInputStream
byte 배열 메모리에서 바이트 단위로 자료를 읽습니다.
FilterInputStream
기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("input.txt");
System.out.println((char)fis.read());//한 바이트씩 읽고 문자로 변환해 반환
System.out.println((char)fis.read());
System.out.println((char)fis.read());
} catch (IOException e) { //에러가 발생하면 캐치, 파일이 없는 경우
e.printStackTrace();
}finally { //클로징을 해주기 위해 finally
try {
fis.close(); //파일이 null일 경우 closing 못하니까
} catch (IOException e) { // catch
e.printStackTrace();
}catch (Exception e2){
System.out.println(e2);
}
}
System.out.println("end");
public static void main(String[] args) {
int i;
try(FileInputStream fis = new FileInputStream("input.txt")){ //오토 클로징
while ((i = fis.read()) != -1){ //파일의 마지막까지
System.out.print((char)i); //문자 반환
}
}catch (IOException e){ //에러 발생하면 캐치
System.out.println(e);
}
}
public static void main(String[] args) {
int i;
try(FileInputStream fis = new FileInputStream("input2.txt")){ //오토 클로징
byte[] bs = new byte[10];
while ((i = fis.read(bs, 1, 9)) != -1){ //배열의 끝이면 -1이니까 배열의 끝까지
for (int j = 0 ; j < i ; j++){ //i는 fis를 읽어온 배열의 길이이니까
// 10개를 읽었으면 10개 출력하고 6개를 읽었으면 6개 출력
System.out.print((char)bs[j]);
}//읽은 배열 출력
System.out.println(" : " + i + "바이트 읽음");
}
}catch (IOException e){
System.out.println(e);
}
바이트 단위 출력 스트림 중 최상위 추상클래스
많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
주요 하위 클래스
-FileOutputStream
파일에서 바이트 단위로 자료를 씁니다.
- ByteArrayOutputStream
byte 배열 메모리에서 바이트 단위로 자료를 씁니다.- FilterOutputStream
기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
주요 메서드
- int write()
한 바이트를 출력합니다.- int write(byte b[])
b[] 크기의 자료를 출력합니다.- int write(byte b[], int off, int len)
b[] 배열에 있는 자료의 off 위치부터 len 개수만큼 자료를 출력합니다.- void flush()
출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력합니다.- void close()
출력 스트림과 연결된 대상 리소스를 닫습니다. 출력 버퍼가 비워집니다.
파일에 한 바이트씩 쓰기
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("output.txt")){
fos.write(65);
fos.write(66);
fos.write(67);
}catch (IOException e){
System.out.println(e);
}
System.out.println("end");
}
public static void main(String[] args) throws FileNotFoundException {
FileOutputStream fos = new FileOutputStream("output2.txt");
try (fos){
byte[] bs = new byte[26];
byte data = 65;
for (int i = 0; i < bs.length; i++) {
bs[i] = data++;
}
fos.write(bs);
}catch (IOException e){
System.out.println(e);
}
System.out.println("end");
}
public static void main(String[] args) throws FileNotFoundException {
FileOutputStream fos = new FileOutputStream("output3.txt");
try (fos){
byte[] bs = new byte[26];
byte data = 65;
for (int i = 0; i < bs.length; i++) {
bs[i] = data++;
}
fos.write(bs, 2, 10);//2부터 10개만
}catch (IOException e){
System.out.println(e);
}
System.out.println("end");
}
문자 단위 입력 스트림의 최상위 추상 클래스
주요 하위 클래스
- FileReader
파일에서 문자 단위로 읽는 스트림 클래스입니다.- InputStreamReader
바이트 단위로 읽은 자료를 문자로 변환해주는 보조 스트림 클래스 입니다.- BufferedReader
문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공하는 보조 스트림입니다.
주요 메서드
- int read()
파일로부터 한 문자를 읽습니다. 읽은 문자를 반환합니다.- int read(char[] buf)
파일로부터 buf 배열에 문자를 읽습니다.- int read(char[] buf, int off, int len)
파일로부터 buf 배열의 off 위치로부터 len 개수만큼의 문자를 읽습니다.- void close()
입력 스트림과 연결된 대상 리소스를 닫습니다.
파일에서 문자 읽기
public static void main(String[] args) {
try(FileReader fis = new FileReader("reader.txt")) {
int i;
while ((i = fis.read())!= -1) { //파일의 끝까지 읽기
System.out.print((char) i);
}
} catch (IOException e) {
}
}
문자 단위 출력 스트림 최상위 추상 클래스
주요 클래스
- FileWriter
파일에서 문자 단위로 출력하는 스트림 클래스입니다.- OutputStreamWriter
바이트 단위의 자료를 문자로 변환해 출력해주는 보조 스트림 클래스 입니다.- BufferedWriter
문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공하는 보조 스트림입니다.
주요 메서드
- int write(int c)
한 문자를 파일에 합니다.- int write(char[] buf)
문자 배열 buf의 내용을 출력합니다.- int write(char[] buf, int off, int len)
문자 배열 buf의 off위치에서부터 len 개수의 문자를 출력합니다.- int write(String str)
문자열 str을 출력합니다.- int write(String str, int off, int len)
문자열 str의 off번째 문자로부터 len 개수만큼 출력합니다.- int flush()
출력하기 전에 자료가 있는 공간(출력 버퍼)을 비워 출력하도록 합니다- void close()
스트림과 연결된 리소스를 닫습니다. 출력 버퍼도 비워집니다.
파일에 문자 쓰기
public class FileWriterTest {
public static void main(String[] args) {
try(FileWriter fw = new FileWriter("writer.txt")){
fw.write('A'); // 문자 하나 출력
char buf[] = {'B','C','D','E','F','G'};
fw.write(buf); //문자 배열 출력
fw.write("안녕하세요. 잘 써지네요"); //String 출력
fw.write(buf, 1, 2); //문자 배열의 일부 출력
fw.write("65"); //숫자를 그대로 출력
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("출력이 완료되었습니다.");
}
}