본문 바로가기

Developer/Java-oop

#027. FileInputStream / FileOutputStream 알아보기...

#027. FileInputStream / FileOutputStream 알아보기...

 

1. File Input/Output Stream 은 파일을 다루기 위한 스트림이다.

 

2. 테스트를 위해 io 패키지에 FileStreamDemo 클래스를 만들어 작성해보자.

1) 아래 예제는 FileInputStream 으로 내용을 가져와 출력하는 모습이다.

코드

package io;

import java.io.*;

public class FileStreamDemo {

    public static void main(String[] args) {

        try {

            FileInputStream fis = new FileInputStream("C:/Hello.java");

            int value = 0;

            while ( (value=fis.read()) != -1){

                System.out.print((char)value);

            }

        } catch (FileNotFoundException e) {

            System.out.println(e.getMessage());

        } catch (IOException e) {

            System.out.println(e.getMessage());

        }

    }

}

결과

package studypack;

public class Hello {

    public static void main(String[] args) {

        System.out.println("Hello, Java World!!");

    }

}

설명

문장6: FileInputStream 클래스로 fis 객체를 생성한다. 생성자로 파일을 지정했다.

문장8: fis.read(); 는 1Byte를 가져오고, 가져온 1Byte 의 값을 ascii 값으로 반환한다. 또한, 더이상 없다면, -1 을 반환 한다. (value=fis.read()) != -1 이 부분에서 먼저 value=fis.read(); 를 계산한 후 value != -1 조건을 비교한다.

문장9: 반환 받은 value 는 ascii 값이므로 char 타입으로 형 변환 후 문자를 출력한다.

문장13: FileInputStream 은 IOException 을 try 해줘야 한다.

 

2) 아래 예제는 URL 클래스를 이용해 InputStream 의 내용을 가져와 출력하는 모습이다.

코드

package io;

import java.io.*;

import java.net.URL;

public class FileStreamDemo {

    public static void main(String[] args) {

        try {

            //FileInputStream fis = new FileInputStream("C:/Hello.java");

            URL url = new URL("http://download.oracle.com/javase/6/docs/api/overview-summary.html");

            InputStream fis = url.openStream();

            int value = 0;

            while ( (value=fis.read()) != -1){

                System.out.print((char)value);

            }

        } catch (FileNotFoundException e) {

            System.out.println(e.getMessage());

        } catch (IOException e) {

            System.out.println(e.getMessage());

        }

    }

}

결과

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<!--NewPage-->

<HTML>

<HEAD>

... 중 략 ...

</noscript>

</BODY>

</HTML>

설명

문장3: URL 클래스를 사용하려면, java.net.URL 을 import 해야 한다.

문장8: URL 클래스로 url 객체를 생성하고, 생성자에 URL 주소를 넣어줬다.

문장9: ul.openStream(); 메서드를 통해 반환 타입인 InputStrem 클래스의 객체 fis 를 생성했다.

그 아래 내용은 동일하다.

 

3) 아래 예제는 FileInputStream 으로 내용을 가져와 FileOutputStream 으로 출력(파일복사)하는 모습이다.

코드

package io;

import java.io.*;

public class FileStreamDemo {

    public static void main(String[] args) {

        try {

            FileInputStream fis = new FileInputStream("C:/Hello.java");

            FileOutputStream fos = new FileOutputStream("C:/HelloCopy.java");

            

            byte[] buf = new byte[1024];

            int count = 0;

            

            while ( (count = fis.read(buf) ) != -1) {

                fos.write(buf, 0, count);

            }

            fos.close();

        } catch (IOException e) {

            System.out.println(e.getMessage());

        }

    }

}

설명

문장7: FileOutputStream 클래스로 fos 객체를 생성하고, 생성자로 파일을 지정했다.

문장9: 버퍼를 이용하기 위해 byte 배열을 만들었다.

문장12: 버퍼가 없을 때는 fis.read(); 로 1Byte 씩 내용을 가져왔었다. 속도차원에서도 비효율적이며, 많은 반복을 하게 될 것이다. 그래서 문장9 에서 만든 byte 배열 buf 를 이용해 배열의 크기 만큼 내용을 읽어오게 된다. 즉 1024 byte 를 가져오게 된다.

반환 값은 가져온 개수를 반환한다.

문장13: fos.write(); 메서드는 지정된 파일에 내용을 기록한다. 그 중 파라메터는 buf 의 배열의 내용 중 0 번째부터 count 개수 만큼의 내용을 기록하라는 의미이다.

위 예제는 반복문으로 처음부터 끝까지 내용을 fis 로 기록하기 때문에 같은 파일이 생성될 것이다.

 

지금까지 OOP 에 대해서 알아봤다.

 

잡담. 도움이 됐을지 모르겠군요^^; 모두 고생하셨습니다. ^______^ 화이팅 ^^"