본문 바로가기

JAVA

[JAVA] 파일 입출력 (I/O)


InputStream, OutputStream

자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공합니다. Stream은 단방향으로만 데이터를 전송할 수 있기에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요하게 됩니다.

 

FileInputStream


먼저 새로 생성한 프로젝트의 디렉터리에 아래와 같은 텍스트 파일을 생성하였습니다.

 

 

아래 예제 코드를 통해 출력 결과를 확인하여 보았습니다.

import java.io.FileInputStream;

public class Main {
    public static void main(String[] args) {
        try{
            FileInputStream fileInputStream = new FileInputStream("practice.txt");
            int i =0;
            while ((i = fileInputStream.read()) != -1) {
                System.out.print((char) i);
            }
            fileInputStream.close();

        }catch (Exception e) {
            System.out.println(e);
        }

    }
}

//출력 결과
hello world!

위의 예제 코드를 실행하면 텍스트파일의 내용이 출력되는 것을 확인할 수 있습니다.

다른 방법으로는 BufferedInputStream을 사용하는 방법이 있습니다.

BufferedInputStream이라는 보조 스트림을 사용하면 성능이 향상되기에 대부분 이를 사용합니다.

아래의 예제 코드를 보도록 하겠습니다.

import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class Main {
    public static void main(String[] args) {
        try{
            FileInputStream fileInputStream = new FileInputStream("practice.txt");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
            int i = 0;
            while ((i = bufferedInputStream.read()) != -1){
                System.out.print((char)i);
            }
            fileInputStream.close();

        }catch (Exception e) {
            System.out.println(e);
        }

    }
}
//출력 결과

hello world!

bufferedInputStream도 stream의 하위 클래스이기 때문에 입출력 방법은 같습니다.

 

FileOutputStream


디렉터리에 텍스트 파일을 만드는 예제는 아래와 같습니다

import java.io.FileOutputStream;

public class Main {
    public static void main(String[] args) {
        try {
            FileOutputStream fileOutputStream = new FileOutputStream("fileoutputstream.txt");
            String word = "source code";

            byte b[] = word.getBytes();
            fileOutputStream.write(b);
            fileOutputStream.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

위 코드를 실행하면, 같은 디렉토리 내에 source cde라는 문자열이 입력된 fileoutputstream.txt 파일이 생성됨을 확인할 수 있습니다.

 

FileReader / FileWWriter


위의 FileInputStream과 FileOutputStream은 바이트 기반의 스트림입니다. 바이트 기반은 입출력의 단위가 1byte입니다.

하지만 자바의 char 타입은 2byte입니다. 이를 해소하기 위해 자바에서는 문자 기반 스트림을 제공합니다.

문자 기반 스트림에는 FileReader와 FileWriter가 있습니다.

 

문자 기반 스트림과 그 하위 클래스는 여러 종류의 인코딩(encoding)과 자바에서 사용하는 유니코드(UTF-16) 간의 변환을 자동으로 처리합니다.

 

FileReader


FileReader는 바이트 기반 스트림의 InputStream과 대응된다고 생각하면 좋습니다.

FileReader는 인코딩을 유니코드로 변환합니다.

아래의 예제코드를 보도록 하겠습니다.

import java.io.FileReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try{
            String fileName = "practice.txt";
            FileReader file = new FileReader(fileName);

            int data = 0;
            while((data = file.read()) != -1){
                System.out.print((char)data);
            }
            file.close();

        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
//출력 결과

hello world!

위의 코드예제가 올바른 출력 결과를 내는 것을 확인할 수 있습니다.

 

바이트 기반 스트림과 마찬가지로, FileReader도 성능을 개선할 수 있는 BufferedReader가 있습니다

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try{
            String fileName = "practice.txt";
            FileReader file = new FileReader(fileName);
            BufferedReader bufferedReader = new BufferedReader(file);

            int data = 0;
            while((data = bufferedReader.read()) != -1){
                System.out.print((char)data);
            }
            file.close();

        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
//츨력 결과
hello world!

 

 

FileWriter


앞서 만든 practice.txt 파일에 문자열을 입력해 보도록 하겠습니다.

import java.io.FileWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try{
            String filename = "practice.txt";
            FileWriter fileWriter = new FileWriter(filename);

            String str = "문자열";
            fileWriter.write(str);
            fileWriter.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

 

위와 같이 practice.txt의 내용이 수정된 것을 확인할 수 있습니다.