본문 바로가기

# 02/Java

[윤성우 열혈자바] 32-1. I/O 스트림에 대한 이해

반응형

그냥 스트림 ‘I/O 스트림 차이는?


스트림의 주제 

  데이터를 어떻게 원하는 형태로 걸러내고 가공할 것인가?


• I/O 스트림의 주제

  어떻게 데이터를 입력하고 출력할 것인가?



파일에 저장된 문자열을 꺼내어 컬렉션 인스턴스에 저장

    I/O 스트림으로 해결해야  부분

 

컬렉션 인스턴스에 저장된 문자열  길이가 5 이상인 문자열만 출력

    스트림으로 해결해야  부분








I/O 스트림 모델의 소개


프로그램의 상당 부분은 다음 대상의 입출력과 관련이 있다. 그리고 이들에 대한 자바의 입출력 방식을 가리켜 I/O 모델이라 한다.

 • 파일

 • 키보드와 모니터

 • 그래픽카드, 사운드카드

 • 프린터, 팩스와 같은 출력장치

 • 인터넷으로 연결되어 있는 서버 또는 클라이언트








I/O 모델과 스트림(Stream) 이해, 그리고 파일 대상의 입력 스트림 생성


입력 스트림 (Input Stream): 실행 중인 자바 프로그램으로 데이터를 읽어 들이는 스트림

출력 스트림 (Output Stream): 실행 중인 자바 프로그램으로부터 데이터를 내보내는 스트림


InputStream in = new FileInputStream("date.dat"); // 입력 스트림 생성

int data = in.read(); // 데이터 읽어 들임



OutputStream out = new FileOutputStream("date.dat"); // 출력 스트림 생성

out.write(7); // 데이터 7 파일에 전달










파일 대상 입출력 스트림 생성의 


class Write7ToFile {

   public static void main(String[] args) throws IOException {

      OutputStream out = new FileOutputStream("data.dat");   // 출력 스트림 생성

      out.write(7);   // 7 저장

      out.close();   // 스트림 종료

   }

}



class Read7FromFile {

   public static void main(String[] args) throws IOException {

      InputStream in = new FileInputStream("data.dat");   // 입력 스트림 생성

      int dat = in.read();   // 데이터 읽음

      in.close();   // 입력 스트림 종료     

      System.out.println(dat);

   }

}


7








입출력 스트림 관련 코드의 개선: finally 기반 close


class Write7ToFile2 {

   public static void main(String[] args) throws IOException {

      OutputStream out = null;      

      try {

         out = new FileOutputStream("data.dat");

         out.write(7);

      }

      finally {

         if(out != null)  // 출력 스트림 생성 성공했다면,

            out.close();

      }

   }

}



class Read7FromFile2 {

   public static void main(String[] args) throws IOException {

      InputStream in = null;

      try{

         in = new FileInputStream("data.dat");

         int dat = in.read();

         System.out.println(dat);

      }

      finally {

         if(in != null)  // 입력 스트림 생성 성공했다면,

            in.close();

      }

   }

}








입출력 스트림 관련 코드의 개선: try-with-resource 기반


class Write7ToFile3 {

   public static void main(String[] args) {

      try(OutputStream out = new FileOutputStream("data.dat")) {

         out.write(7);

      }

      catch(IOException e) {

         e.printStackTrace();

      }

   }

}



class Read7FromFile3 {

   public static void main(String[] args) {

      try(InputStream in = new FileInputStream("data.dat")) {

         int dat = in.read();

         System.out.println(dat);

      }

      catch(IOException e) {

         e.printStackTrace();

      }

   }

}








바이트 단위 입출  출력 스트림


public static void main(String[] args) {

   Scanner sc = new Scanner(System.in);

   System.out.print("대상 파일: ");

   String src = sc.nextLine();  

   System.out.print("사본 이름: ");

   String dst = sc.nextLine();

   

   try(InputStream in = new FileInputStream(src) ;

          OutputStream out = new FileOutputStream(dst)) {

      int data;

      while(true) {

         data = in.read(); // 파일로부터 1 바이트를 읽는다.

         if(data == -1) //  이상 읽어 들일 데이터가 없다면,

            break;

         out.write(data); // 파일에 1바이트를 쓴다.

      }

   }

   catch(IOException e) {

      e.printStackTrace();

   }

}


바이트 단위 파일 복사 프로그램!









보다 빠른 속도의 파일 복사 프로그램


1K바이트 버퍼 기반 파일 복사 프로그램!


public static void main(String[] args) {

   Scanner sc = new Scanner(System.in);

   System.out.print("대상 파일: ");

   String src = sc.nextLine();  

   System.out.print("사본 이름: ");

   String dst = sc.nextLine();

   

   try(InputStream in = new FileInputStream(src) ;

            OutputStream out = new FileOutputStream(dst)) {

      byte buf[] = new byte[1024];

      int len;

 

      while(true) {

         len = in.read(buf); // 배열 buf 데이터를 읽어 들이고, ( 이상 읽어 들일 데이터 없으면 -1 반환)

         if(len == -1)

            break;

         out.write(buf, 0, len); // len 바이트만큼 데이터를 저장한다.

      }

   }

   catch(IOException e) {

      e.printStackTrace();

   }

}


public int read(byte[] b) throws IOException

   파일에 저장된 데이터를 b 전달된 배열에 저장

 

public void write(byte[] b, int off, int len) throws IOException

   b 전달된 배열의 데이터를 인덱스 off에서부터 len 바이트만큼 파일에 저장


반응형