K-DigitalTraining 강의/1. Java

[5주차] 81. 바이트스트림, 특정 파일을 읽기위한 , 특정파일에 쓰기위한 연결다리(FileInputStream / FileOutputStream) - 한 글자 씩(byte단위) 혹은 여러 글자씩(byte 배열) 처리

이대곤 2022. 6. 7. 10:48

* 스트림이란?

  특정 파일과 자바파일 사이의 연결다리 역할을 하며, 단방향으로만 작동함(읽기, 쓰기가 동시에 되지 않는다.)
  특정 파일로부터 데이터를 읽기 위한 클래스와  특정 파일에 데이터를 쓰기 위한 클래스가 각각 존재한다.
  ex)
FileInputStream, FileOutputStream 등

 

* 바이트 스트림(Byte Stream)이란?

  1byte(8bit)를 input/output 할 수 있는 스트림이다. FileInputStream / FileOutputStream이 이에 속함.

  1byte는 숫자, 영어를 처리하기에 충분하나 한글을 처리하기엔 충분하지 않다.(2byte 필요)

  이 때문에 바이트 스트림을 이용해 한글을 처리하면 깨지는 현상이 발생한다. 

  한글을 다루고 싶다면 문자 스트림의 FileReader/FileWriter를 사용해야 한다.

 

* FileInputStream에서 FileNotFoundException 예외가 언제 발생되는가?
  접근하려는 파일이 존재하지 않는 경우

 

* FileOutputStream에서 FileNotFoundException 예외가 언제 발생되는가?
  경로에 해당하는 폴더가 없는 경우

 

예시코드

- 실행전 from.txt 파일이 src 바로 위의 폴더에 존재해야 오류가 없음. 파일 내용은 "Nice day~" 를 입력해두자.
- 아래의 코드는 from.txt 안에있는 텍스트를 한 글자씩 to.txt로 옮겨 놓는 동작을 함

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Ex11_04_File {
	public static void main(String[] args) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			// 읽어들이기 위한 용도, 지정한 파일이 존재하지 않으면 에러남 
			fis = new FileInputStream("from.txt"); // from.txt과 이 자바파일 사이에 데이터를 '읽어오기 위한' 연결다리(스트림)가 형성됨

			// write을 위한 용도, 지정한 파일이 존재하지 않아도 자동으로 생성됨 
			fos = new FileOutputStream("to.txt"); // to.txt와 이 자바파일 사이에 데이터를 '보내기(쓰기) 위한' 연결다리(스트림)이 형성됨
			//FileOutputStream fos = new FileOutputStream("to.txt", true); // 이미 존재하는 파일이 없다면 파일을 새로 만들고(여기까진 공통), 이미 존재하는 파일이 있다면 그 뒤에 입력 
			//FileOutputStream fos = new FileOutputStream("to.txt", false); // 이미 존재하는 파일이 없다면 파일을 새로 만들고(여기까진 공통), 이미 존재하는 파일이 있다면 데이터를 다 지우고 다시 입력 // defualt라서 true/false 안쓴거는 이거랑 같다.
			
			int i;

			while (true) {
				i = fis.read();		// FileInputStream 객체는 읽기위한 메소드만 존재, from.txt로부터 한 글자씩 아스키 코드값으로 읽어옴
				System.out.print((char)i + " ");

				if (i == -1)		// 파일의 끝에는 EOF 가 들어가있는데 상수라서 -1임
					break;
				else
					fos.write(i);	// FileOutputStream 객체는 쓰기위한 메소드만 존재, to.txt에 한 글자씩 문자로 변환하여 입력함
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 사용 후 연결다리를 끊어줘야 함
				fis.close();
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
}