본문 바로가기

Java

[Java] 입출력(IO) 정리

 

스트림(Stream)이란?

 

스트림이란 일차원적인 데이터의 흐름이다.

흐름의 방향에 따른 분류로 입력 스트림(input stream)과 출력 스트림(output stream)으로 나뉘고 데이터 형태에 따른 분류로 문자 스트림(character stream)과 바이트 스트림(byte stream)으로 나뉜다.

문자 스트림 : Reader, Writer

바이트 스트림 : InputStream, OutputStream

입출력 클래스들은 Exception이 발생하기 때문에 try-catch문을 사용하고 finally문을 통해 close() 처리를 반드시 해준다.


 

FileReader (FileInputStream) 클래스

 

텍스트 파일을 읽고 텍스트를 파일에 쓰는 클래스 (FileInputStream은 바이트 단위로 데이터를 읽음)

 

1. 파일을 연다.

FileReader reader = new FileReader("poem.txt");

2. 파일을 읽는다.

int data = reader.read();

3.파일을 닫는다.

reader.close();

 

  • 예제 코드
import java.io.FileReader;
    public class FileReaderExam {
    public static void main(String[] args) {        
        FileReader reader = null;
        char arr[] = new char[50];

        try {
            reader = new FileReader("poem.txt");

            reader.read(arr);
            System.out.print(arr);

//            while(true) {
//                int data = reader.read();
//                if(data == -1) break;
//                char c = (char)data;
//                System.out.print(c);
//            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (Exception e2) {}
        }
    }
 }

실행결과 poem.txt 파일에 작성되어 있는 문자들을 읽어온다.


 

FileWriter (FileOutputStream) 클래스

 

작성한 텍스트를 파일에 쓰는 클래스 (FileOutputStream은 바이트 단위로 데이터를 쓴다.)

 

1. 파일을 연다.

FileWriter writer = new FileWriter("poem2.txt");

2. 파일에 문자를 쓴다.

writer.write(poem);

3.파일을 닫는다.

writer.close();

 

  • 예제 코드
import java.io.FileWriter;
import java.util.Scanner;

public class FileWriterExam {
    public static void main(String[] args) {
        FileWriter writer = null;
        Scanner sc = new Scanner(System.in);

        System.out.println("입력 :");
        String str = "";
        String poem = "";

        while(!(str = sc.nextLine()).equals("q")) {
            poem += str;
            poem += "\n";
        }

        try {
            writer = new FileWriter("poem2.txt");
            writer.write(poem);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (Exception e2) {}
        }
    }
  }

실행결과 Sanner를 통해 입력한 문자가 poem2 파일에 쓰여짐.

 

  • 예제 코드
 import java.io.FileReader;
 import java.io.FileWriter;

 public class CopyExam {
    public static void main(String[] args) {
        //poem.txt => poem3.txt copy

        FileReader reader = null;
        FileWriter writer = null;
        char arr[] = new char[100];

        try {
            reader = new FileReader("poem.txt");            
            reader.read(arr);            

            writer = new FileWriter("poem3.txt");
            writer.write(arr);
            System.out.println("복사완료");

        } catch (Exception e) {            
            e.printStackTrace();
        } finally {
            try {                
                writer.close();
                reader.close();
            } catch (Exception e) {                
                e.printStackTrace();
            }
        }
    }
  }

실행결과 poem.txt에서 읽어온 문자를 poem3.txt에 쓰여짐.


 

보조 스트림 (FilterStream)

 

보조스트림은 단독으로 사용할 수 없고 입출력 스트림에 연결하여 사용한다. 보조 스트림은 입출력 스트림의 기능을 확장시키고 성능을 향상시키기 위해 사용한다.

DataInputStream, DataOutputStream : 기본형 타입의 데이터를 입출력하는 클래스

ObjectInputStream, ObjectOutputStream : 기본형 타입과 레퍼런스 타입의 데이터를 입출력하는 클래스

LineNumberReader : 텍스트 파일의 각 행에 번호를 붙여가면서 읽는 클래스

 

BufferedReader(BufferedInputStream) / BufferedWriter(BufferedOutputStream)

입출력 스트림을 통해 문자를 읽어 들이거나 출력할 때 버퍼링을 거치면서 입출력 스트림의 성능을 향상시키는 클래스

 

  • 예제 코드
```
import java.io.BufferedReader;
import java.io.BufferedWriter;   
import java.io.FileWriter;  
import java.io.InputStreamReader;

public class BufferExam {
    public static void main(String[] args) {

        //System.in => InputStream => InputStreamReader => BufferedReader

        BufferedReader br = null;
        BufferedWriter bw = null;
        String str = "";

        try {
            br = new BufferedReader(new InputStreamReader(System.in));
            bw = new BufferedWriter(new FileWriter("output.txt", true));

            System.out.println("입력 : ");
            while((str = br.readLine())!= null){
                str += "\n";  
                bw.write(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bw.close();
                br.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}
```