입출력 스트림

dev_hnbm·2023년 11월 7일
0

대덕인재개발원

목록 보기
14/30

📝 입출력

입출력과 스트림

  • 입출력
    • 여기서 입출력은 내가 작성하는 자바 프로그램이 기준
    • 두 대상 사이에서 데이터를 주고받는 것을 뜻함
  • 스트림
    • 데이터 입출력시 사용되는 연결 통로
      • 입력용 스트림 객체: 데이터를 읽을 때 읽어들이는 데이터가 지나가는 통로
      • 출력용 스트림 객체: 데이터를 출력할 때 출력할 데이터가 지나가는 통로
    • 시냇물이 흘러가는 모습을 본떠서 스트림이라고 함
    • 하나의 스트림으로 입출력을 동시에 수행할 수 없음 (단방향 통신)
      - 입출력을 동시에 하고 싶다면 2개의 스트림 객체를 생성해야 함



🔴🔴 아래 서술할 메소드들은 꼭 그 클래스에 한해 사용되는 메소드가 아니며,
         메소드 형식과 내용이 상당히 비슷해서
         일부만 확실히 알아두면 다른 메소드를 이해하기 편하다!


🔲 바이트 기반 스트림

  • 가장 기본이 되는 스트림
  • 데이터를 바이트 단위로 주고받으며, 1byte씩 데이터를 읽어옴
    • 컴퓨터의 모든 데이터는 0 또는 1이 되고, 0과 1은 bit 한자리 (8bit → 1byte)
    • 데이터를 주고받을 때 대부분 byte 단위로 주고받음

InputStream

💁‍♀️ 메소드

  • int read(): 1byte만 읽어와서 int 타입으로 반환하며, 더이상 읽어올 자료가 없으면 -1 반환
  • int read(byte[] b): 배열의 크기만큼 읽어온 데이터를 배열에 저장하며, 더이상 읽어올 자료가 없으면 -1 반환
  • int read(byte[] b, int off, int len): 데이터를 len(개수)만큼 읽어서 배열의 off번째부터 저장하며, 더이상 읽어올 자료가 없으면 -1 반환
  • available(): 앞으로 읽어올 수 있는 데이터 개수 반환
    • 입력용 스트림에는 포인터가 있고, 보통 첫번째 데이터 이전을 가르킴
      • read()시 다음칸으로 이동하며 데이터를 차례로 가져옴
      • available()포인터 뒤의 데이터 개수 반환

InputStream 예제

🟣 파일 입력용 스트림 객체 생성하기
방법 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);
  }

OutputStream

  • 파일 출력용 스트림 객체 생성시 출력할 파일을 지정하여 생성한다.
  • 지정한 파일이 없으면 새로 만들고, 있으면 덮어쓰므로 주의해야 함!

💁‍♀️ 메소드

  • void write(int b): 1byte만 추출하여 출력 스트림에 씀
  • void write(byte[] b): 전체 배열을 출력 스트림에 씀
  • void write(byte[] b, int off, int len: 배열의 off 인덱스부터 시작하여 len 개수만큼의 바이트를 출력 스트림에 씀

OutputStream 예제

👉 파일에 알파벳 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) {}




ByteArrayInput/OutputStream 예제1

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));

ByteArrayInput/OutputStream 예제2

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가 붙으면 문자 기반 스트림이라고 생각하면 된다!
  • 텍스트 파일, 문자열, 네트워크 연결 등에서 문자 데이터를 읽고 쓸 때 사용

Reader

💁‍♀️ 메소드

  • int read(): 입력 스트림으로부터 한 문자를 읽어 반환, 더이상 읽어올 자료가 없으면 -1 반환
  • int read(char[] c): 입력 스트림으로부터 배열 길이만큼의 문자를 읽어 배열에 저장, 실제로 읽은 문자 수 반환
  • int read(char[] c, int off, int len): 입력 스트림으로부터 최대 len만큼의 문자를 읽어 배열의 off번째부터 저장, 실제로 읽은 문자 수 반환

Reader 예제

👉 문자 기반 스트림을 이용하여 파일을 읽어와 출력하기

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) {}



Writer

💁‍♀️ 메소드

  • 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(): 출력 스트림을 비우고, 버퍼의 내용 출력

Writer 예제

👉 사용자가 입력한 내용 그대로 파일에 저장하기

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) {}




InputStream + Reader 예제

👉 한글의 인코딩 방식을 지정해서 읽어오기

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) {}

0개의 댓글