[Java] 입출력 스트림(Stream)
자바에서 데이터는 스트림을 통해 입출력하게되며 스트림은 단일방향, 연속적으로 흘러가는 것을 의미한다. 스트림은 입출력을 동시에 처리할 수 없는 이유로 데이터를 입력 받아야 할 경우 입력 스트림을 사용하고 데이터를 출력할 경우 출력 스트림을 사용한다. 자바 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
김사과 오렌지 반하나 이메론