JAVA

I/O란?

EJUN 2022. 6. 14. 15:01

I/O는 우리가 만든 프로그램에 있는 어떤 내용을 파일에 읽거나 저장할 일이 있을 때, 혹은 다른 서버나 디바이스로 

보낼일이 있을 때 종종 사용한다.

 

그렇다면 위의 정의를 빗대어 I/O는 약자를 의미하는데 I는 Input(입력), O는Output(출력)을 의미하는걸 알 수 있다. 

파일의 입출력에는 크게 바이트 스트림과 문자스트림을 나뉠 수 있다. 우선 문자스트림에 대해 이야기 해보겠다.


문자 스트림

문자 스트림이란 문자 단위로 읽고 쓰는 것을 의미합니다. 대표적으로 문자스트림에는 Reader 와 Writer의

abstract클래스가 존재합니다. 

 

Reader

Reader는 문자 기반 입력스트림의 슈퍼 클래스로 추상클래스이다.

Reader클래스에는 문자입력 스트림이 가져야 할 기본적인 메소드들이다.

메소드 기능
read() 한 개의 문자를 읽고 리턴
read(char[] buf) 읽은 문자들을 문자 배열buf에 저장하고 실제로 읽은 문자 수 반환
read(char[] buf,int off, int len)
len 개의 바이트만큼 읽고, buf[off]부터 len 만큼 저장한 후 실제로 읽은 바이트 수인
len을 반환
만약 len 만큼 읽지 못했다면 실제로 읽은 바이트 수 반환
close() 입력 스트림 종료

 

Writer

Writer는 문자 기반 출력스트림의 슈퍼클래스로 추상클래스이다.

Writer클래스에는 문자 출력 스트림이 가져야 할 기본적인 메소드들이다.

메소드 기능 
write() 한 문자씩 출력
write(char[] buf) 배열 buf에 저장된 모든 문자를 출력한다.
write(char[] buf,int len, int off) 배열buf[off] 부터 len까지 출력
write(String str) 주어진 문자열 전부출력
flush() 버퍼에 남아있는 모든 문자 출력
close() 출력 스트림 종료

여기서 flush()란 현재 버퍼에 남아있는 모든 문자를 출력하고 버퍼를 비우는 기능을 하는 메소드인데 버퍼스트림에 대한 이야기 나오면 하겠다.

 

우선 Reader를 상속받는 클래스들에는 InputStreamReader, FileReader, BufferedReader등이 있다.

 

InputStreamReader()는 인자로 InputStream 객체를 받아서 바이트 스트림을 문자스트림으로 연결하는 기능을 담당한다.

InputStreamReader in=null;
try{
    in=new InputStreamReader(System.in);

 

FileReader()클래스는 텍스트 파일을 프로그램으로 읽어올 때 사용하는 문자 입력 스트림이다. 이는 문자기반이기 때문에 텍스트파일이 아니면 읽어들일수가 없다.  

FileReader fr=null;
 try{
     fr=new FileReader("c:\\temp\\data.txt");
     int c;
     while((c=fr.read())!=-1){
         System.out.print((char)c);
     }
     fr.close();

 

다음은 FileWriter를 상속받는 클래스에 대해 알아보겠다. 

FileWriter를 상속받는 클래스는 OutputStreamWriter, FileWriter, BufferedWriter등이 있다.

 

OutputStreamWriter()는 인자로 OutputStream객체를 받아서 바이트 스트림을 문자스트림으로 연결하는 기능을 담당한다.

 

FileWriter()클래스는 텍스트파일에 텍스트를 쓸 때 사용하는 문자 출력 스트림이다. FileWriter() 또한 문자기반이기 때문에 문자집합이 아니면 사용할 수 없다.

FileWriter fw=null;
try{
    fw=new FileWriter("c:\\temp\\data.txt");
    fw.write("Java");
    fw.close();
}

여기서 FileWriter생성자 중에서 FileWriter(File file, boolean append)의 생성자가 있는데 append값이 true이면 기존 파일에

있던 문자열에 이어서 쓰는 것을 의미한다.

fw=new FileWriter("c:\\temp\\data.txt",true);

 

 

바이트 스트림

바이트 스트림은 입출력되는 데이터들을 단순 바이트처리를 하는 스트림을 의미하고 단위는 byte이다.

문자스트림과의 차이는 문자스트림은 문자집합밖에 받지 못하지만 바이트스트림은 문자집합은 물론이고, 이미지파일과 같은 바이트 파일 또한 받을 수 있다는 차이가 있다.

 

바이트 스트림에는 InputStream 와 OutputStream의 abstract클래스들이 있다.

 

바이트 스트림에서 사용하는 클래스는 FileInputStream과 FileOutputStream이 있다. 

우선 FileInputStream이 가지고 있는 메소드들에 대해 설명하겠다.

메소드 기능
read() 한 개의 바이트를 읽고 리턴
read(byte[] buf) 읽은 바이트들을 바이트 배열buf에 저장하고 실제로 읽은 바이트 수 반환
read(byte[] buf,int off, int len)
len 개의 바이트만큼 읽고, buf[off]부터 len 만큼 저장한 후 실제로 읽은 바이트 수인
len을 반환
만약 len 만큼 읽지 못했다면 실제로 읽은 바이트 수 반환
close() 입력 스트림 종료

FileInputStream의 메소드들은 문자스트림의 FileReader와 비슷한 것을 확인할 수 있다.

 

다음은 FileOutputStream이 가지고 있는 메소드들에 대해 설명하겠다.

메소드 기능 
write() 한 바이트씩 출력
write(byte[] buf) 배열 buf에 저장된 모든 바이트를 출력한다.
write(byte[] buf,int len, int off) 배열buf[off] 부터 len까지 출력
flush() 버퍼에 남아있는 모든 바이트 출력
close() 출력 스트림 종료

FileOutputStream의 메소드들은 문자스트림의 FileWriter와 비슷한 것을 확인할 수 있다.

 

FileInputStream은 시스템의 파일로부터 데이터를 바이트 스트림으로 읽어 들이기 위해 사용한다.

try{
    fin=new FileInputStream("c:\\temp\\data.txt");
    int c;
    while ((c=fin.read())!=-1){
        System.out.println((byte)c);
    }
        fin.close();
}

 

FileOutputStream은 데이터를 파일에 바이트 스트림으로 저장하기 위해 사용한다.

int n;
try{
    fout=new FileOutputStream("c:\\temp\\data.txt");
   while ((n=System.in.read())!=-1){
         fout.write(n);
    }
   fout.close();
}

 

'JAVA' 카테고리의 다른 글

[JAVA] Primitive Type vs Reference Type  (0) 2023.03.21
Java의 역사  (0) 2023.03.12
Spring framework 핵심기술 - IoC 컨테이너  (0) 2023.01.05
자바 I/O 와 NIO 차이  (0) 2022.06.14
JAVA? 변수의 종류  (0) 2022.06.14