안드로이드 개발자의 창고
[9일차 Java] 2ByteStream 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 2ByteStream이란?
- 자바는 글자 하나를 2 byte를 사용하기 때문에 문자열 입출력 전용으로 사용하는 스트림들을 2byte stream이라고 부른다.
- 라인 단위 입출력이 가능하고 문자열 인코딩 설정이 가능하다.
- 2 바이트 입출력 스트림을 이용하면 키보드를 통해 입력을 받거나 콘솔로 송출할 때 편하게 할 수 있다.
- 사용해야하는 필터 스트림이 좀 많은 편이긴 하지만 데이터를 라인 단위로 입출력할 수 있다는 편리성을 가지고 있어서 많이 사용한다.
📖 예제 전체 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class MainClass {
public static void main(String[] args) {
saveData();
printData();
loadData();
keyboardInput();
}
public static void saveData() {
try {
// 기본 스트림 생성
FileOutputStream fos = new FileOutputStream("test4.txt");
// 문자열 인코딩을 설정하는 필터 스트림
OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-8");
// 출력 버퍼를 사용하는 필터 스트림
BufferedWriter bw = new BufferedWriter(writer);
// 라인 단위로 쓰는 필터 스트림
// print, println, printf를 사용할 수 있는 필터 스트림
// BufferedWriter로 전달됨
PrintWriter pw = new PrintWriter(bw);
// 파일에 쓴다.
pw.print("안녕하세요");
pw.println("반갑습니다");
pw.printf("이름은 %s이고, 나이는 %d살 입니다\n", "홍길동", 30);
pw.flush();
pw.close();
bw.close();
writer.close();
fos.close();
System.out.println("쓰기 완료");
} catch(Exception e) {
e.printStackTrace();
}
}
public static void printData() {
try {
// 기본 출력(터미널)에 인코딩을 설정할 수 있도록 한다.
OutputStreamWriter writer = new OutputStreamWriter(System.out, "utf-8");
BufferedWriter bw = new BufferedWriter(writer);
PrintWriter pw = new PrintWriter(bw);
pw.print("안녕하세요");
pw.println("반갑습니다");
pw.printf("이름은 %s이고, 나이는 %d살 입니다","홍길동", 30);
pw.flush();
pw.close();
bw.close();
writer.close();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void loadData() {
try {
FileInputStream fis = new FileInputStream("test4.txt");
// 인코딩 설정
InputStreamReader irs = new InputStreamReader(fis, "UTF-8");
// 입력 버퍼 사용
BufferedReader br = new BufferedReader(irs);
// 읽어온다.
String str1 = null;
StringBuffer buffer = new StringBuffer();
do {
// 한 줄을 읽어온다.
str1 = br.readLine();
if(str1 != null) {
buffer.append(str1 + "\n");
}
} while(str1 != null);
br.close();
irs.close();
fis.close();
// StringBuffer의 문자열로 String을 만든다.
String result = buffer.toString();
System.out.println(result);
}catch(Exception e) {
e.printStackTrace();
}
}
public static void keyboardInput() {
try {
InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
BufferedReader br = new BufferedReader(isr);
System.out.print("입력1 : ");
String str1 = br.readLine();
System.out.print("입력2 : ");
String str2 = br.readLine();
br.close();
isr.close();
System.out.println(str1);
System.out.println(str2);
} catch(Exception e) {
e.printStackTrace();
}
}
}
✔️ 코드 해석
public static void saveData() {
try {
// 기본 스트림 생성
FileOutputStream fos = new FileOutputStream("test4.txt");
OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(writer);
PrintWriter pw = new PrintWriter(bw);
// 파일에 쓴다.
pw.print("안녕하세요");
pw.println("반갑습니다");
pw.printf("이름은 %s이고, 나이는 %d살 입니다\n", "홍길동", 30);
pw.flush();
pw.close();
bw.close();
writer.close();
fos.close();
System.out.println("쓰기 완료");
} catch(Exception e) {
e.printStackTrace();
}
}
- 문자열을 인코딩을 설정하는 필터 스트림인 OutputStreamWriter를 사용한다.
- 해당 코드를 통해 "UTF-8"로 인코딩한다.
- BufferedWriter bw를 선언하여 출력 버퍼를 사용한다.
- 파일을 작성하기 위해 PrintWriter pw를 선언한다.
- pw.~~~("문자열");
- pw.print("안녕하세요") : 줄바꿈 없이 입력한다.
- pw.println("반갑습니다") : 문자열 입력 후 줄바꿈한다.
- pw.printf("이름은 %s이고, 나이는 %d살 입니다\n", "홍길동", 30) : escape 문자로 형식을 지정하여 저장한다.
public static void printData() {
try {
OutputStreamWriter writer = new OutputStreamWriter(System.out, "utf-8");
BufferedWriter bw = new BufferedWriter(writer);
PrintWriter pw = new PrintWriter(bw);
pw.print("안녕하세요");
pw.println("반갑습니다");
pw.printf("이름은 %s이고, 나이는 %d살 입니다","홍길동", 30);
pw.flush();
pw.close();
bw.close();
writer.close();
}catch(Exception e) {
e.printStackTrace();
}
}
- FileOutputStream를 선언하지 않았다.
- new OutputStreamWriter(System.out, "utf-8")를 통해 console에 출력하도록 한다.
- 파일을 생성하여 저장하는 loadData와 유사하다.
public static void loadData() {
try {
FileInputStream fis = new FileInputStream("test4.txt");
InputStreamReader irs = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(irs);
String str1 = null;
StringBuffer buffer = new StringBuffer();
do {
str1 = br.readLine();
if(str1 != null) {
buffer.append(str1 + "\n");
}
} while(str1 != null);
br.close();
irs.close();
fis.close();
String result = buffer.toString();
System.out.println(result);
}catch(Exception e) {
e.printStackTrace();
}
}
- test4.txt(saveData())에서 생성한 파일)을 열어 "UTF-8"로 인코딩한다.
- 빈 문자열 str1을 선언하고 do-while문을 통해 한 줄씩(readLine()) 가져온다.
- StringBuffer buffer에 str1을 저장한다.
- result라는 String형 변수에 buffer에 담긴 문자열을 String으로 변환하여 담는다.
public static void keyboardInput() {
try {
InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
BufferedReader br = new BufferedReader(isr);
System.out.print("입력1 : ");
String str1 = br.readLine();
System.out.print("입력2 : ");
String str2 = br.readLine();
br.close();
isr.close();
System.out.println(str1);
System.out.println(str2);
} catch(Exception e) {
e.printStackTrace();
}
}
- 코드로 입력하는 것이 아닌 키보드를 통해 한 줄씩 입력 받는다.
'Computer > Java' 카테고리의 다른 글
[10일차 Java] Network (0) | 2023.05.10 |
---|---|
[Java 9일차] ObjectStream (0) | 2023.05.09 |
[9일차 Java] DataStream (0) | 2023.05.09 |
[9일차 Java] FileStream (0) | 2023.05.08 |
[8일차 Java] Collection / List / Map / Set (0) | 2023.05.07 |