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으로 해야함.
'JAVA' 카테고리의 다른 글
| 바이트기반 보조스트림 - BufferedInputStream, BufferedOutputStream (0) | 2025.06.17 |
|---|---|
| 바이트기반 보조스트림 - FilterInputStream, FilterOutputStream (0) | 2025.06.17 |
| FileInputStream, FileOutputStream 메서드 (0) | 2025.06.15 |
| ByteArrayInputstream, ByteArrayOutputStream 예제 (0) | 2025.06.15 |
| 문자 기반 스트림 : Reader, Writer (1) | 2025.06.14 |