본문 바로가기

JAVA

FileInputStream, FileOutputStream 예제

 

package 입출력;

import java.io.FileInputStream;
import java.io.IOException;

public class ex04 {

	public static void main(String args[]) throws IOException {
		
		FileInputStream fis = new FileInputStream(args[0]);
		
		int data = 0;
		
		while((data = fis.read()) != -1) {
			
			char c = (char)data;
			System.out.println(c);
			
		}

	}

}

 

커맨드라인으로부터 입력받은 파일의 내용을 읽어서 그대로 화면에 출력하는 예제라고함.

read()의 반환값은 int형으로 4byte이지만 (data는 int, data = fis.read())

char형(2byte)으로 변환해도 손실값은 없다. while문에서 -1을 제외하기 때문.

read()는 한번에 1byte씩 파일로부터 데이터를 읽어들이지만 데이터의 범위는 0~255(16진수는 0x00~0xff)로 정수값이고, 

입력값이 더이상 없음을 알릴 수 있는 값인 -1도 필요하기 때문에 int형으로 반환했다고 한다.

 

그런데 난 출력하면 Exception이 뜬다. 왜지?

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at 입출력.ex04.main(ex04.java:10)

IntelliJ는 되나 했더니 역시 안된다. 흠.. 다음에 한번 이걸 출력하는 방법을 알아보자.

 

특이한점이라면 public static void main(String[] args)가 아니라 public static void main(String args[])이다.

아무리 봐도 요즘 사용하는 방법같진 않다... 하지만 레거시라고 해도 배우는건 중요하다.

 

package 입출력;

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

public class ex05 {

	public static void main(String[] args) {
		
		try {
			
			FileInputStream fis = new FileInputStream(args[0]);
			FileOutputStream fos = new FileOutputStream(args[1]);
			int data = 0;
			
			while((data = fis.read()) != -1) {
				
				fos.write(data);
				
			}
			
			fis.close();
			fos.close();
			
		} catch(IOException e) {
			
			e.printStackTrace();
			
		}
		
	}

}

 

ex05.java의 내용을 read()로 읽어서, write(int b)로 ex05.bak에 출력한다고 한다.

기존의 파일에 새로운 내용을 추가하기 위해선 FileOutputStream fos = new FileOutputStream(args[1], true)와 같이 오버로딩된 생성자를 써서 두번째 인자의 값을 boolean으로 해야함.