사실 파일을 복사하려는 게 아니라면, FileInputStream / FileOutputStream을 쓸 일이 얼마나 있을까 싶기도 한데...(예제에서는 복사하는 것 밖에 안 나와 있으니 또다른 활용이 있을지 모르겠군요.)
저는 DataInputStream / DataOutputStream이 쓸만해보이는데 중간에 FileInputStream / FileOutputStream을 거쳐야 해서 이왕에 같이 공부하자는 의미에서...
/* DataInput/OutputStream
Java Programming/박용우 → http://www.javastudy.co.kr/docs/yopark/chap07/chap07.html →제7장 자바 입출력
→ 3. 기본 입출력 스트림
→→ '나. 파일 입출력 스트림. */
package FileIOTest;
import java.io.*;
import java.lang.Boolean;
class FileInputOutputStreamTest {
public static void main(String[] args) {
boolean append = false;
int i, len=0;
InputStream in = null;
OutputStream out = null;
if(args.length < 2) {
System.out.println("USAGE: FileInputOutputStreamTest Source_file Destination_file");
System.exit(-1);
} else if(args.length > 2) {
append = new Boolean(args[2]).booleanValue();
//public Boolean(String s) : "true"를 입력하면 true, 그 외의 문자열 또는 null은 모두 false
//new Boolean("True") produces a Boolean object that represents true.
//new Boolean("yes") produces a Boolean object that represents false.
//☆boolean booleanValue() : Returns the value of this Boolean object as a boolean primitive.
}
System.out.println("args[0]: "+args[0]);
System.out.println("args[1]: "+args[1]);
System.out.println(" append: "+append);
try {
in = new FileInputStream(new File(args[0]));
out = new FileOutputStream(args[1], append);
//☆FileOutputStream(File file, boolean append) : 주어진 이름이 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성합니다.
// 기존의 파일이 존재할 때는 주어진 append 값에 따라 새로운 파일을 생성하거나 또는 기존의 내용에 추가합니다.(true면 기존 내용에 추가인 듯)
//☆FileOutputStream(String name): 주어진 이름이 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성합니다.
// 기존의 파일이 존재할 때는 디폴트로 그 내용을 지우고 새로운 파일을 생성합니다.
//☆FileOutputStream(String name, boolean append): 주어진 이름이 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성합니다.
// 기존의 파일이 존재할 때는 주어진 append 값에 따라 새로운 파일을 생성하거나 또는 기존의 내용에 추가합니다.
//☆FileOutputStream(FileDescriptor fdObj): 주어진 FileDescriptor 객체가 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성합니다.
// 기존의 파일이 존재할 때는 디폴트로 그 내용을 지우고 새로운 파일을 생성합니다.
} catch(FileNotFoundException e) {
System.out.println(e);
}
try {
while((i=in.read()) != -1) { //☆.read()바이트로 데이터를 읽어들이고 커서위치가 다음으로 이동한다.(읽어들일 데이터가 없으면 -1을 반환)
out.write(i); //☆
len++;
}
in.close();
out.close();
System.out.println(len+" bytes are copied...");
} catch(IOException e) {
System.out.println(e);
}
}
}
/*
* Results:
D:\AIIT\JAVA\07>java FileInputOutputStreamTest Test.java FileInputOutputStreamTest.txt
args[0]: Test.java
args[1]: FileInputOutputStreamTest.txt
append: false
630 bytes are copied...
D:\AIIT\JAVA\07>java FileInputOutputStreamTest
Test.java FileInputOutputStreamTest1.txt
args[0]: Test.java
args[1]: FileInputOutputStreamTest1.txt
append: false
630 bytes are copied...
D:\AIIT\JAVA\07>java FileInputOutputStreamTest
Test.java FileInputOutputStreamTest1.txt true
args[0]: Test.java
args[1]: FileInputOutputStreamTest1.txt
append: true
630 bytes are copied...
D:\AIIT\JAVA\07>dir
...
TEST~1 JAV 630 99-09-18 16:06 Test.java
FILEIN~1 630 99-10-02 6:22 FileInputOutputStreamTest.txt
FILEIN~1 TXT 1,260 99-10-02 6:26 FileInputOutputStreamTest1.txt
...
D:\AIIT\JAVA\07>
*/
이 소스 역시 JAVA STUDY의 박용우님의 강좌에 나와있던 것으로, 강좌내용에 나와있던 내용들을 개인적으로 보기 편하게 주석을 붙인 것입니다.
책이나 강좌를 더 훑어봐도, FileInputStream / FileOutputStream 자체로는 그다지 할 수 있는 게 없는 것 같군요.
아마도 예전에는 FileInputStream / FileOutputStream 자체로만 데이터를 읽어들이고 쓰는 여러가지 작업을 하는 부분을 모두 프로그래머가 직접 구현해줬어야 했을 것 같은데, 이제는 DataInputStream / DataOutputStream 같은 편리하게 데이터를 읽고 쓸 수 있게 해 주는 클래스가 생겨서, FileInputStream / FileOutputStream은 중간에 연결해 쓰기만 하는 용도가 된 듯...