문자 기반의 스트림은 무엇이 있을까?
문자기반 스트림 종류
--
Reader & writer
문자기반의 스트림들의 부모다.
문자기반 스트림은
단순히 2byte로 스트림을 처리하지 않고
자바에서 사용하는 유니코드(UTF-16) 간의 변환을 자동으로 처리해 준다.
FileReader & FileWriter
파일로부터 텍스트 데이터를 읽고, 파일에 작성하는 데 사용된다.
사용 예시 코드
class Test {
public static void main(String args[]) {
try {
String fileName = "test.txt";
FileInputStream fis = new FileInputStream(fileName);
FileReader fr = new FileReader(fileName);
int data = 0;
// FileInputStream을 이용해서 파일내용을 읽어 화면에 출력
while ((data = fis.read()) != -1) {
System.out.print((char)data);
}
System.out.println();
fis.close();
// FileReader를 이용해서 파일내용을 읽어 화면에 출력
while ((data = fr.read()) != -1) {
System.out.print((char)data);
}
System.out.println();
fr.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
----------------------------------------------------------
C:\jdk1.8\work\ch15>type test.txt
Hello, 안녕하세요?
C:\jdk1.8\work\ch15>java FileReaderEx1
Hello, $#???@@??
Hello, 안녕하세요?
위 코드는
바이트기반 스트림과 문자기반 스트림의 차이점을 보여주기 위한 것으로
FileInputStream(바이트 기반)을 사용했을 때는 한글이 깨져서 출력하는 것을 볼 수 있다.
PipedReader & PipedWrtier
프로세스(스레드) 간의 통신(데이터를 주고받음)에 사용된다.
다른 스트림과는 달리 입력과 출력스트림을 하나의 스트림으로 연결해서 데이터를 주고받는다.
사용 예시 코드
public class PipedReaderWrtier {
public static void main(String args[]) {
InputThread inThread = new InputTread("InputThread");
OutputTread outThread = new OutputThread("OutputThread");
// PipedReader와 PipedWriter를 연결한다.
inThread.connect(outThread.getOutput());
inThread.start();
outThread.start();
}
}
class InputThread extends Thread {
PipedReader input = new PipedReader();
StringWriter sw = new StringWriter();
InputThread(String name) {
super(name);
}
public void run() {
try {
int data = 0;
while((data = input.read()) != -1) {
sw.write(data);
}
System.out.println(getName() + " received : " + sw.toString());
}
}
public PipedReader getInput() {
return input;
}
public void connect(PipedWriter output) {
try {
input.connect(output);
} catch(IOException e) {}
}
}
class OutputThread extends Thread {
PipedWriter output = new PipedWriter();
OutputThread(String name) {
super(name);
}
public void run() {
try {
String msg = "Hello";
System.out.println(getName() + " sent : " + msg);
output.write(msg);
output.close();
} catch(IOException e) {}
}
public PipedWriter getOutput() {
return output;
}
public void connect(PipedReader input) {
try {
output.connect(input);
} catch(IOException e) {}
}
}
--------------------------------------------------------------
OutputThread sent : Hello
InputThread received : Hello
StringReader & String writer
CharArrayReader와 CharArrayWriter처럼 메모리의 입출력에 사용된다.
StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장된다.
그리고 그 저장된 데이터를 가져오는 메서드가 존재한다.
StringBuffer getBuffer()
// StringWriter에 출력한 데이터가 저장된 StringBuffer를 반환
String toString()
// StringWriter에 출력된 (StringBuffer에 저장된) 문자열을 반환
사용 예시 코드
class StringReadWriterEx {
public static void main(String[] args) {
String inputData = "ABCD";
StringReader input = new StringReader(inputData);
StringWriter output = new StringWriter();
int data = 0;
try{
while((data = input.read()) != -1) {
output.write(data);
}
} catch(IOException e) {}
System.out.println("Input Data : " + inputData();
System.out.println("Output Data : " + output.toString();
//System.out.println("Output Data : " + output.getBuffer().toString());
}
}
--------------------------------------------------------
Input Data : ABCD
Output Data : ABCD
--
문자기반 보조스트림 종류
--
BufferedReader & BufferedWriter
입출력 효율을 높이기 위해 버퍼(char[])를 사용하는 보조 스트림이다.
라인(line) 단위의 입출력이 편리하다.
String readLine()
// 한 라인을 읽어온다. (BufferedReader의 메서드)
void newLine()
// '라인 구분자(개행문자)'를 출력한다. (BufferedWriter의 메서드)
사용 예시 코드
import java.io.*
class BufferedReaderEx1 {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("BufferedReaderEx1.java");
BufferedReader br = new BufferedReader(fr);
String line = "";
for(int i = 1; (line = br.readLine()) != null; i++) {
// ";"를 포함한 라인을 출력한다.
if(line.indexof(";") != -1) {
System.out.println(i + ":" + line);
}
}
br.close();
}catch(IOException e) {}
}
}
---------------------------------------------------
1:import java.io.*
6: FileReader fr = new FileReader("BufferedReaderEx1.java");
7: BufferedReader br = new BufferedReader(fr);
9: String line = "";
10: for(int i = 1; (line = br.readLine()) != null; i++) {
11: // ";"를 포함한 라인을 출력한다.
12: if(line.indexof(";") != -1) {
13: System.out.println(i + ":" + line);
16: br.close();
InputStreamReader & OutputStreamWriter
바이트기반 스트림을 문자기반 스트림처럼 사용할 수 있게 도와준다.
그리고 바이트기반 스트림의 데이터를 지정된 인코딩의 문자 데이터로 변환하는 작업을 수행한다.
인코딩을 따로 지정해주지 않으면 OS에서 사용하는 기본 인코딩을 사용해서 파일을 해석하기 때문에
원래 작성된 상태로 볼 수 없을 수 있다.
OS에서 사용하는 인코딩의 종류 확인하기
Properties prop = System.getProperties();
System.out.println(prop.get("sun.jnu.encoding"));
콘솔(화면)로부터 라인 단위로 입력받기
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
인코딩 변환하기
FileInputStream fis = new FileInputStream("korean.txt");
InputStreamReader isr = new InputStreamReader(fis, "KSC5601");
예시 코드
class InputStreamReaderEx {
public static void main(String[] args) {
String line = "";
try {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.println("사용중인 OS의 인코딩 : " + isr.getEncoding());
do {
System.out.print("문장을 입력하세요. 마치시려면 q를 입력하세요.>");
line = br.readLine();
System.out.println("입력하신 문장 : " + line);
} while(!line.equalsIgnoreCase("q"));
// br.close(); System.in과 같은 표준입출력은 닫지 않아도 된다.
System.out.println("프로그램을 종료합니다.");
} catch(IOException e) {}
}
}
------------------------------------------------------------
C:\jdk1.8\work\ch15>java InputStreamReaderEx
사용중인 OS의 인코딩 :MS949
문장을 입력하세요. 마치시려면 q를 입력하세요.>asdf
입력하신 문장 : asdf
문장을 입력하세요. 마치시려면 q를 입력하세요.>hello
입력하신 문장 : hello
문장을 입력하세요. 마치시려면 q를 입력하세요.>q
입력하신 문장 : q
프로그램을 종료합니다.
--
'Language > Java' 카테고리의 다른 글
[입출력] 바이트기반 스트림, 보조 스트림 (0) | 2025.02.11 |
---|---|
입출력 (바이너리/문자 기반 스트림, 보조 스트림) (0) | 2025.02.10 |
스트림 (Stream) (1) | 2025.01.14 |
람다식 (+ 메서드 참조, 함수형 인터페이스) (0) | 2025.01.12 |
스레드의 동기화 (1) | 2025.01.09 |