2018년 10월 1일 월요일

java FileInputStream / FileOutputStream, FileReader / FileWriter

이전시간에 바이트 코드를 읽어오는 방법에 대해서 살펴보았다.
왜 바이트 코드를 읽어오는 방법에 대해 배우는걸까?

이전에 말했듯이 컴퓨터는 우리가 사용하는 문자를 이해할 수 없다. 
그래서 우리는 컴퓨터에게 저장시키는 문자를 당연하게 컴퓨터가 인식하는것 처럼 보이지만 실제로는 바이트 코드로 변환시켜서 컴퓨터가 이해할 수 있게하는것이다.

그러면 이 바이트 코드로 변환시켜주는 방법은 여러가지가 있는데,

그 중에서 ASCII코드, UTF-8, Unicode등의 인코딩을 통해서 실제 언어(영어, 한국어, 중국어 등 다른 국가들의 언어를 칭함)들을 파일에 읽고 쓰는것이 가능한것이다.

우선 우리는 파일 스트림이란 것에 대해서 배우면서 이러한 인코딩 방법들을 살펴보자

- JAVA의 FileInputStream / FileOutputStream
"파일 입/출력 스트림" 이란 말그대로 (텍스트)파일에 있는 저장된 텍스트로 된 것들 전부를(문자, 숫자, 특수기호 등) 읽기, 쓰기를 할때 바이트를 문자로 문자를 바이트로 즉, (파일에 관련된)스트림의 역할을 도와준다. 

자바에서는 InputStream클래스의 하위 클래스로써, 파일을 인스턴스화 즉, 파일객체라는것을 통해 접근이 가능하도록 도와준다. 

그럼 예제를 통해 살펴보자
먼저, Java Project폴더 경로에 output.txt라는 텍스트로 된 파일을 준비
텍스트의 내용은 1234 라는 숫자가 차례대로 적혀있다.

예제 1) output.txt파일의 내용을 한 바이트 단위로읽기

  1. package org.java.project;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6.  
  7. public class Onebyte{
  8.     public static void main(String[] args) throws FileNotFoundException{
  9.         FileInputStream fis = new FileInputStream("output.txt");
  10.         int reader = 0;
  11.         try {
  12.             while((reader = fis.read()) >=0 ) {
  13.                     System.out.println(reader);
  14.             }
  15.         } catch (IOException e) {
  16.             // TODO Auto-generated catch block
  17.             e.printStackTrace();
  18.         }
  19.     }
  20. }

출력결과 : 49 50 51 52

: 정상적인 출력이다. 
파일의 내용은 1~4까지 차례대로 적혀있는데 왜 49~52라는 숫자가 나올까?
바로 컴퓨터는 아스키코드 값에 맞추어 저장하므로 바이트 코드로 정상출력이 된 것이다. 
(숫자는 1바이트로 아스키코드에는 48(0)~57(9)까지 저장이 되어있다.)

또 다른예제를 살펴보자.

예제 2) output.txt에 저장된 텍스트를 그대로 출력하기
  1. package org.java.project3.hanbat;
  2.  
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6.  
  7. public class Onebyte {
  8.     public static void main(String[] args) throws FileNotFoundExceptionIOException {
  9.         FileReader fr = new FileReader("output.txt");
  10.         int reader = 0;
  11.         while((reader = fr.read()) >= 0)
  12.             System.out.println((char)reader);
  13.     }
  14. }

출력결과 : 1 2 3 4

위의 FileInputStream과 아래의 FileReader가 보일것이다.
- FIleInputStream, FileOutputStream
- FileReader, FileWriter 이들은 모두 파일을 읽고 쓰기가 가능하다. 하지만 상속하는 부모의  클래스가 다르다.
- FileInputStream / FileOutputStream은  InputStream과 OutputStream을 상속받음.
- FileReader / FileWriter는 Reader와 Writer를 상속받는다.

그리고 FileInputStream / FileOutputStream은 텍스트의 내용을 바이트 단위로 읽어서 
1바이트인 숫자, 문자로 형변환해서 출력할 수 있으나, 1바이트가 넘어가는경우 버퍼라는 공간에 데이터를 입력받아서 출력해야한다.

하지만, FileReader와 FileWriter는 1바이트 이상 한글도 출력이 가능하다.

다음시간에는 FileInputStream . FileOutputStream클래스로 바이트 단위들을 사용하는 방법 대해서 자세히 살펴보도록하자 

댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...