본문 바로가기

Programming/Java

[JAVA] 파일 입출력

자바의 스트림 클래스에는

바이트 기반 스트림과 문자 기반 스트림으로 나눌 수 있다.

또 입력 스트림과 출력 스트림으로 나뉜다.

 

바이트 기반 스트림의 클래스로는

 - InputStream  : 입력

 - OutputStream  : 출력이 있습니다.

 

문자 기반 스트림의 클래스는

 - Reader : 입력

 - Writer  : 출력이 있습니다.

두 스트림의 기능은 똑같지만 차이점은 바이트는 1바이트씩 읽어오고, 출력하고

문자는 2바이트씩 읽어오고 출력합니다.

 

우선 바이트 기반 입력스트림의 하위 클래스로는

 - FileInputStream

 - BufferedInputStream

 - DataInputStream

출력 스트림 하위 클래스로는

 - FileOutStream

 - PrintStream

 - BufferedInputStream

 - DataOutputStream

가 있습니다.

 

우선 FileInputStrem 예제를 보겠습니다.

public class Test01 {
	public static void main(String[] args) {
		final String file = "경로";
		try {
			FileInputStream fis = new FileInputStream(file);
			
			int data;
			while((data=fis.read()) != -1) { //EOF
				System.out.println((char)data); .
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

FileInputStream클래스의 인스턴스를 생성하면 () 구문 안에 입력받아올 파일을 작성해줘야 한다. 여러 가지 방법이 있지만

나는 경로를 작성하는 방법을 선택했다.

경로를 작성하고 나면 이제 예외 처리를 해야 한다.

FileNotFoundException을 처리해줘야 하는데 파일이 없을 때에 생기는 예외이다.

그래서 try-catch문으로 예외처리를 했고

입력을 받아와야 하는데 받아올 때는 fis.read() 메서드를 사용해야 한다.

얼마나 받아올지 모르기에 while문을 사용하고 받아온 걸 저장하기 위해 data란 변수를 선언했다.

read()는 int형을 반환하기 때문에 불러올 값이 문자라면 데이터형 변환을 통해 문자로 형 변환해줘야 한다.

간단한 로직이다.

 

FileOutputStream

예제를 보겠습니다.

public class Test02 {
	public static void main(String[] args) {
		final String path="경로";
		try {
			FileOutputStream fos = new FileOutputStream(path,true);
			
			fos.write(65);
			fos.write(97);
			
			fos.flush();
			fos.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch(IOException e) {
			
		}finally {
			System.out.println(" 로그: 파일작성코드 수행완");
		}
	
	}
}

출력하는 예제입니다.

FileInputStream과 비슷하다

똑같이 예외처리를 해줘야 하고

InputStream은 read()로 값을 불러오고

OutputStream은 write()로 값을 내보낸다.

입출력은 사용하고 close()로 닫아줘야 한다.