IT 전용글/JAVA

[ Java ] FileInputStream / FileOutputStream

회상형인간 2009. 1. 20. 01:56

[ Java ] FileInputStream / FileOutputStream

  이번에는 File입출력 스트림인 FileInputStream / FileOutputStream의 복습!

  사실 파일을 복사하려는 게 아니라면, 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은 중간에 연결해 쓰기만 하는 용도가 된 듯...