본문 바로가기

컴퓨터/언어,프로그래밍

FileOutputStream (파일 바이트 출력 스트림)과 FileWriter (파일 문자 출력 스트림)

1> FileOuputStream

 

FileOuputStream 클래스는 데이터를 파일에 바이트 스트림으로 저장하기 위해 사용된다. 파일명이나 File 클래스의 객체를 인수로 넘겨줌으로써 시스템에 파일을 직접 생성할 수 있는데, 기본적으로, 파일이 이미 존재한다면 그 파일에 덮어쓰게 되므로, 기존의 내용은 사라지게 된다. 역시 FileOutputStream 클래스도 OutputStream 클래스의 하위클래스로서, OutputStream 클래스의 기본적인 메소드들을 상속받거나 재정의하여 사용할 수 있다.

 

가. FileOutputStream 생성자

ㅁ FileOutputStream(File file): 주어진 File 객체가 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성. 기존의 파일이 존재할 때는 디폴트로 그 내용을 지우고 새로운 파일을 생성.

ㅁ FileOutputStream(FileDescriptor fdObj): 주어진 FileDescriptor 객체가 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성. 기존의 파일이 존재할 때는 디폴트로 그 내용을 지우고 새로운 파일을 생성.


ㅁ FileOutputStream(String name)
: 주어진 이름이 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성. 기존의 파일이 존재할 때는 디폴트로 그 내용을 지우고 새로운 파일을 생성.


ㅁ FileOutputStream(String name, boolean append)
: 주어진 이름이 가리키는 파일을 바이트 스트림으로 쓰기 위한 FileOutputStream 객체를 생성. 기존의 파일이 존재할 때는 주어진 append 값에 따라 새로운 파일을 생성하거나 또는 기존의 내용에 추가.

나. FileOutputStream 예제

 

  WriteFile.java : FileOuputStream 객체를 이용해서 키보드로 입력받은 데이터를 "WriteFile.txt" 파일에 출력한다. 만약 "WriteFile.txt" 파일이 없으면 새로 생성하고 있다면 덮어쓴다.

 


import java.io.*;

class WriteFile {

public static void main(String args[]) {

// 키보드로 입력받을 테이터를 임시로 저장할 버퍼를 생성.
byte buffer[] = new byte[100];
try {

System.out.println ("\n글을 다 썼으면 엔터를 치세요.");
System.in.read(buffer);//버퍼의 데이터를 읽어 들인다.
// FileOutputStream 객체를 생성.
FileOutputStream fOut = new FileOutputStream("WriteFile.txt");
// FileOutputStream 객체를 이용해서 버퍼의 내용을 "WriteFile.txt"에 출력한다.
fOut.write(buffer);
fOut.close();//파일을 닫는다.

} catch (Exception e) {

String err = e.toString();
System.out.println(err);

}

      }
}

 

<< 실행 결과 >>

 


C:\>javaexample>java FileInfo


글을 다 썼으면 엔터를 치세요.
오~~ 필승코리아..오!오!오!

 

WriteFile.java 파일이 있는 폴더에 가서 WriteFile.txt라는 파일이 생성되었는지 확인하고 데이터가 저장되었는지 확인한다.

 

2> FileWriter 클래스

 

FileWriter 클래스는 출력할 유니코드 문자를 디폴트 문자 인코딩의 바이트로 변환하여 파일에 저장하고자 할 경우에 사용한다. 이 클래스는 OutputStreamWriter 클래스의 서브 클래스로 유니코드를 바이트로 변환하는 기능을 수행한다. FileOutputStream 클래스와 마찬가지로 파일명이나 File 클래스의 객체를 인수로 넘겨줌으로 시스템에 파일을 직접 생성하게 되는데, 기본적으로, 파일이 이미 존재한다면 그 파일을 덮어쓰게 된다.

 

가. FileWriter 클래스 생성자

ㅁ FileWriter (File file): 주어진 File 객체를 이용하여 FileWriter 객체를 생성.

ㅁ FileWriter (FileDescriptor fd): 주어진 FileDescriptor객체를 이용하여 FileWriter 객체를 생성.


ㅁ FileWriter (String fileName)
: 주어진 파일을 열어 FileWriter 객체를 생성.


ㅁ FileWriter(String fileName, boolean append)
: 주어진 파일을 append 값에 따라 읽기/추가 모드로 열어 FileWriter 객체를 생성.

파일 복사하는 예제 만들기

 

  FileStreamTest.java

 

다음 소스는 FileInputStream 객체와 FileOutputStream 객체를 이용하여 파일을 복사하는 소스이다.

 

이 예제를 실행하면 인자를 주면 인자를 복사할 원본 파일이름으로 간주하여 생성자에게 파일이름을 넘겨주면 생성자는 이 파일이름을 이용해서 FileInputStream을 만들고 readUntilEnd() 메서드에서는 파일을 읽어들이면서 화면에 출력하는 동시에 "복사본.txt"이라는 FileOutputStream 을 만들어서 그 내용을 그대로 "복사본.txt"파일에 저장한다.

 

따라서 실행시는 원본 파일을 인자로 주어야 하면 실행 후 실행파일이 있는 해당 폴더에 가서 "복사본.txt"이 생성되고 그 내용이 복사가 되었는지 확인한다.

 


import java.io.*;

public class FileStreamTest {
    FileInputStream fis;
     byte[] buf;

// 생성자이다. 인자로 넘어온 파일이름으로 FileInputStream객체를 생성하고 버퍼도 생성.
public FileStreamTest(String fileName) throws FileNotFoundException {

fis=new FileInputStream(fileName);
buf=new byte[1024];

}

/* readUntilEnd() 메서드
파일을 읽어들이면서 화면에 출력하는 동시에 "복사본.txt"이라는 FileOutputStream 을 만들어서 그 내용을 그대로 "복사본.txt"파일에 저장한다. */

public void readUntilEnd() {
        FileOutputStream fos=null;

try {
        fos=new FileOutputStream("복사본.txt");

// 버퍼에 있는 데이터를 읽어들이는데 -1일 될때가지 읽어서 출력하는 for문이다.
// read() 가 -1을 리턴하면 스트림이 끝났다는 뜻이다.

for (int i; (i=fis.read(buf))!=-1; ) {
          System.out.write(buf, 0, i);
           fos.write(buf, 0, i);
}

} catch(IOException ioe) {
       System.out.println("스트림에 이상이 있음 : "+ioe.getMessage());
// finally문을 이용해서 파일을 닫는다.
} finally {

try {
        fis.close();
} catch(IOException ioe2) { }

try {
       fos.close();
} catch(IOException ioe2) { }

     }
}

public static void main(String[] args) {

// 실행시 인자가 없으면 도움말이 출력되고 비정상적으로 종료된다.
if (args.length<1) {
      System.out.println("사용법 : java FileTest1 파일이름");
       System.exit(1);
}

//인자가 있다면 인자를 파일이름으로 해서 생성자에게 넘긴다.
try {
       FileStreamTest test=new FileStreamTest(args[0]);
       test.readUntilEnd();
} catch(FileNotFoundException fnfe) {
System.out.println(args[0]+" 파일을 찾을 수 없습니다.");
}

      }
}

 

<< 실행결과 >>

 

도스창에서 다음과 같이 실행 한다. 당연히 filetest.txt 파일은 클래스 파일과 같은 폴더에 있어야 한다.

 

C:\>javaExample>java FileStreamTest filetest.txt

 


C:\>javaExample>java FileStreamTest filetest.txt

꽃나무 --이상--

벌판 한복판에 꽃나무 하나가 있소. 근처에는 꽃나무가 하나도 없소 꽃나무는 제가 생각하는 꽃나무를 열심으로 생각하는 것처럼 열심으로 꽃을 피워가지고 섰소. 꽃나무는 제가 생각하는 꽃나무에게 갈 수 없소. 나는 막 달아났소. 한 꽃나무를 위하여 그러는 것처럼 나는 참 그런 이상스러운 흉내를 내었소.

Lullaby for 17
You are so young
you heal as you weep,
and your tears
instead of scalding
your face like mine

 

출처 : getJAVA™

제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...