프로그래밍/JAVA

[Java] 입출력 스트림(Stream)

하와이블루 2022. 8. 10. 21:33
728x90

 

 

자바에서 데이터는 스트림을 통해 입출력하게되며 스트림은 단일방향, 연속적으로 흘러가는 것을 의미한다. 스트림은 입출력을 동시에 처리할 수 없는 이유로 데이터를 입력 받아야 할 경우 입력 스트림을 사용하고 데이터를 출력할 경우 출력 스트림을 사용한다. 자바 java.io 패키지에서는 InputStream 클래스와 OutputStream 클래스를 제공하고 입출력 스트림 클래스의 하위 클래스 표현시 접미사를 붙여 표현한다.

 


 

 

스트림 클래스는 다음과 같이 크게 두 종류로 바이트 기반 스트림, 문자 기반 스트림으로 구분된다.

 

바이트 기반 스트림은 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용하며 InputStream과 OutputStream은 바이트 기반 입출력 스트림의 최상위 클래스로 접미사를 붙여 클래스를 구분한다.

- FileInputStream/FileOutputStream : 파일

- ByteArrayInputStream/ByteArrayOutputStream : 메모리

- PipedInputStream/PipedOutputStream : 프로세스

- AudioInputStream/AudioOutputStream : 오디오 장치

 

InputStream/OutputStream 클래스는 각각 read(), write() 메소드를 포함하고 있어 읽고 쓰는 기능을 수행한다.

 

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class File {
    public static void main(String[] args) {
        String input = "C:\\aiclass\\java\\day10\\input.txt";
        String output = "C:\\aiclass\\java\\day10\\output.txt";
        FileInputStream fis;
        FileOutputStream fos;
        try {
            fis = new FileInputStream(input);
            fos = new FileOutputStream(output);
            int b;
            while ((b = fis.read()) != -1) {   
            // -1 : 데이터가 없다라는 뜻. 따라서, 데이터가 있으면 while 진행
                fos.write(b);
                System.out.print((char) b + " ");
            }
            fis.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

// input.txt
Hello World! Hello Java!

 

실행결과
H e l l o   W o r l d !   H e l l o   J a v a ! 
Process finished with exit code 0
----------------------------------------------------------------
// output1.txt
Hello World! Hello Java!

 


 

 

문자 기반 스트림은 문자 데이터를 읽고 출력할 때 사용한다. Reader와 Writer 는 문자 기반 입출력 스트임의 최상위 클래스이며, 하위 클래스 표현시 접미사로 붙여 클래스를 구분한다.

- FileReader/FileWriter : 파일

- CharArrayReader/CharArrayWriter : 메모리

- PipedReader/PipedWriter : 프로세스

- StringReader/StringWriter : 문자열

 

import java.io.FileWriter;

public class File2 {
    public static void main(String[] args) {
        String str = "Hello Java!";
        try{
            FileWriter fw = new FileWriter("output2.txt");
            fw.write(str.charAt(0)); 
            // charAt(index): String문에서 원하는 인덱스 장소의 문자열을 문자로 변환
            fw.write("\t");
            fw.write(str);
            fw.write("\n");
            fw.write("안녕하세요!");

            fw.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
실행결과
----------------------------------------------------------------
// output2.txt
H	Hello Java!
안녕하세요!

 

 


 

PrintWriter 클래스는 문자열을 출력하는 Writer 스트림 속성을 가진 클래스로 OutputStream의 자식 클래스이며 byte 단위 출력 클래스인 PrintStream의 Print 메소드를 모두 구현하여 사용할 수 있음. 반드시 참조변수.close(); 로 닫아주어야한다.

 

 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class File3 {
    public static void main(String[] args) {
        String file1 = "output3.txt";
        String[] arr = {"김사과", "오렌지", "반하나", "이메론"};
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(file1));
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + " ");
                pw.print(arr[i] + " ");
            }
            pw.close(); // 닫지않을 경우 다른곳에서 접근이 불가능하고 파일에 저장이 안됨.
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
실행결과
김사과 오렌지 반하나 이메론 
----------------------------------------------------------------
// output3.txt
김사과 오렌지 반하나 이메론

 

 

 

 

 

728x90