티스토리 뷰
1. Reader
- 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스
- 하위 클래스 : FileReader, BuffredReader, InputStreamReader
- 문자 기반 입력 스트림이기에 배열의 타입도 byte가 아니라 char타입이다.
- 사용이 끝나면 반드시 close( )로 닫아야 한다.
2. Writer
- 문자 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.
- 출력 스트림이기에 flush( )를 통해 버퍼에 잔류하는 문자열을 출력하고, close( )로 닫아야 한다.
- 하위 클래스 :
3. 문자의 인코딩 ( Encoding ) / 디코딩 ( Decoding )
- 1 ) Encoding : 문자 => 바이트열로 변환 ( using 문자집합 )
- 2 ) Decoding : 바이트열 => 문자로 역변환 ( using 문자집합 )
- 문자를 바이트열로 변환할 때와 바이트열을 문자로 역변환할 때 같은 문자집합을 사용해야 한다.
01. InputStream - 바가지(배열)로 읽기
package inputstream_read2;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Set;
import java.util.SortedMap;
public class ReadExample1 { // InputStream - 바가지로 읽기
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("C:/Temp/TTT.txt");
int readByteNo;
String data = "";
byte [] readBytes = new byte[3]; // 바가지 준비 - 사이즈 3의 바가지 준비
while(true) {
// 바가지로 한번에 3개의 바이트를 읽어낸다.
readByteNo = is.read(readBytes);
// 탈출조건
if(readByteNo == -1) { // EOF(-1)이면, 탈출!
break;
} // if
// String 클래스의 다양한 생성자를 꼭 연습하는 것이 좋다!!(***)
// data += new String(readBytes,0,readByteNo);
// String ( 배열, 시작하는 인덱스 번호, 읽어내는 배열의 크기) (****)
// ---> public String(byte[] bytes, int offset, int length)
// 이 방법은 여전히 한글이 깨져서 나온다는 것을 알 수 있다.
// ====================================================================
// Charset (****)
Charset ms949 = Charset.defaultCharset(); // 운영체제의 문자집합 생성 ( MS949 )
Charset utf8 = Charset.forName("UTF-8");
Charset utf8_2 = StandardCharsets.UTF_8;
SortedMap<String, Charset> charsets = Charset.availableCharsets();
Set <String> keys = charsets.keySet();
System.out.println(keys); // 사용가능한 언어의 종류가 출력된다.
System.out.println();
// ====================================================================
data += new String(readBytes,0,readByteNo,"UTF-8");
// public String(byte[] bytes, int offset, int length, String charsetName)
// 이 버전은 한글이 깨지지 않고 잘 출력 된다.(****)
} // while
System.out.println(data); // 홍길동
// 자원 해제
is.close(); // @Cleanup으로 대체할 수 있다.
} // main
} // end class
02. InputStream - 바가지로 읽기 ( 읽어내는 범위 지정 )
package inputstream_read2;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
public class ReadExample2 {
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("C:/Temp/TTT.txt");
byte[] readBytes = new byte[8]; // 8바이트 크기의 바가지 준비
// 실제 바가지에 담긴 바이트의 개수를 반환
int readByteNo = is.read(readBytes,2,3);
// public int read(byte b[], int off, int len) throws IOException
// 바가지에 있는 데이터를 모두 사용하는 것이 아니라 2번인덱스부터 3개를 읽어내라.
// int readByteNo1 = is.read(readBytes,0,readBytes.length);
// 이렇게 작성하게 되면 전부 읽어내게 된다.
// ==============================================
// for ( int i=0; i<readBytes.length; i++) {
// System.out.println(readBytes[i]);
// } // for
// ==============================================
System.out.println(Arrays.toString(readBytes));
// 출력 : [0, 0, -19, -103, -115, 0, 0, 0]
// 바가지에 있는 데이터를 모두 사용하는 것이 아니라 2번인덱스부터 3개를 읽어냈다.
is.close(); // 자원 해제
} // main
} // end class
03. OutputStream - 문자열 인코딩
package outpurstream_write;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class WriteExample1 {
public static void main(String [] args) throws Exception { // OutputStream
// 자원객체
OutputStream os = new FileOutputStream("C:/Temp/TTT.txt", true);
// 뒤에 true를 작성하면 "ABC"가 추가되지만,
// 생략하거나 false를 작성하면 기존의 문자열을 없애고 "ABC"를 작성하게 된다.
// 문자열 인코딩( 문자열을 바이트열로 변환 )
byte [] data = "ABC".getBytes(); // (*****)
for(int i=0; i<data.length; i++) {
os.write(data[i]);
} // for
os.flush(); // 출력 스트림의 버퍼 (****)
os.close(); // 자원 (***)
} // main
} // end class
04. OutputStream 2 - try - with - resource
package outpurstream_write;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class WriteExample2 {
public static void main(String [] args) throws Exception { // OutputStream - try - with - resources 버전
// 자원객체
OutputStream os = new FileOutputStream("C:/Temp/TTT.txt", true);
// 뒤에 true를 작성하면 "ABC"가 추가되지만,
// 생략하거나 false를 작성하면 기존의 문자열을 없애고 "ABC"를 작성하게 된다.
try( os; ){
// 문자열 인코딩( 문자열을 바이트열로 변환 )
byte [] data = "ABC".getBytes(); // (*****)
for(int i=0; i<data.length; i++) {
os.write(data[i]);
} // for
os.flush(); // 출력 스트림의 버퍼 (****)
// os.close(); // try - with - resources가 자동으로 받아준다.
} // try - with - resources
} // main
} // end class
05. OutputStream 3 - @Cleanup
package outpurstream_write;
import java.io.FileOutputStream;
import java.io.OutputStream;
import lombok.Cleanup;
public class WriteExample3 {
public static void main(String [] args) throws Exception { // OutputStream - @Cleanup
// 자원객체
@Cleanup
OutputStream os = new FileOutputStream("C:/Temp/TTT.txt", true);
// 뒤에 true를 작성하면 "ABC"가 추가되지만,
// 생략하거나 false를 작성하면 기존의 문자열을 없애고 "ABC"를 작성하게 된다.
// 문자열 인코딩( 문자열을 바이트열로 변환 )
byte [] data = "ABC".getBytes(); // (*****)
for(int i=0; i<data.length; i++) {
os.write(data[i]);
} // for
os.flush(); // 출력 스트림의 버퍼 (****)
// os.close(); // @Cleanup이 대신해준다.
} // main
} // end class
06. OutputStream 4 - 고속 출력
package outpurstream_write;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class WriteExample4 {
public static void main(String [] args) throws Exception { // OutputStream 2
// 자원객체
OutputStream os = new FileOutputStream("C:/Temp/TTT.txt", true);
byte [] data = "ABC".getBytes(); // (*****)
os.write(data); // 바가지채로 출력버퍼에 고속출력(부어버림)
os.flush(); // 출력 스트림의 버퍼 (****)
os.close(); // 자원 (***)
} // main
} // end class
07. OutputStream - UTF-8 적용하기
package outpurstream_write;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class WriteExample5 {
public static void main(String [] args) throws Exception { // OutputStream 3
// 자원객체
OutputStream os = new FileOutputStream("C:/Temp/TTT2.txt");
byte[] data = "허서낭".getBytes("UTF-8"); // 기본문자셋으로 인코딩이 된다.
// 같은 문자집합을 사용해야지만 문자가 깨지지 않고 들어갈 수 있다.
// 바가지가 들어간다.
os.write(data); // 바가지채로 출력버퍼에 고속출력(부어버림)
os.flush(); // 출력 스트림의 버퍼 (****)
os.close(); // 자원 (***)
} // main
} // end class
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 26일차 - Scanner / File 클래스 (0) | 2022.04.04 |
---|---|
KH 25일차 - 콘솔 (0) | 2022.04.01 |
KH 23일차 - 컬렉션 프레임워크 및 IO (0) | 2022.03.30 |
KH 22일차 - 컬렉션 프레임워크 (0) | 2022.03.29 |
KH 21일차 - 함수적 인터페이스 및 컬렉션 프레임 워크 (0) | 2022.03.28 |