일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Docker 핵심
- Greedy 알고리즘
- date_format
- greedy
- 디버깅
- Java
- 코테
- MySQL
- 알고리즘
- DevOps
- SQL
- docker
- 자바스크립트 기초
- debugging
- 거스름돈
- 그리디 알고리즘
- 브론즈
- Access Modifier
- java.io
- docker 개념
- join
- 탐욕 알고리즘
- 서브넷
- 백준
- reference data type
- sqlplus
- 클라우드
- 전자레인지 문제
- 프로그래머스
- docker image
- Today
- Total
나는매일가운데
JAVA API - java.io 본문
시작하기 전...
- JAVA Encoidng : java는 String을 처리할 때 내부에서 UTF-16으로 인코딩되어 처리된다.
- 송수신이 필요할 경우, UTF-8로 변환하여 사용.
- UTF-8의 경우 영어는 1Byte로 처리, 영어 이외에 문자는 3Byte로 처리하여 사용되기 때문에 한글이 깨지는 현상이 발생한다.
1. java.io 란?
- java에서 입/출력을 위한 방법, 도구들을 객체화 시켜 모아둔 class 집합체
- InputStream, OutputStream, Writer, Reader 등으로 구성되어 있다.
2. InputStream, OutStream
(1) Stream이란??
- 즉, 입력 장치(키보드 등)와 프로그램, 프로그램과 출력장치 (모니터 등)를 연결시켜 주는 통로를 말한다.
(2) InputStream (OutputStream)
- InputStream 계열 최상위 class => 이는 java API에서 Hirachy 구조를 살펴보면 확인할 수 있다. (OutputStream도 동일하다)
- 문자를 1byte 단위로 처리를 한다 => 한글과 같은 다른 문자들은 2byte이상이기 때문에, 출력시 깨지는 현상이 발생한다.
package ioTest.one;
import java.io.*; // io package를 사용하기 위해 import 사용
public class InputTest {
public static void main(String[] args) {
try {
InputStream inputStram = System.in;
System.out.println("입력 기다립니다...");
while(true) {
int i = inputStram.read(); // byte 단위 Encoding 되기 때문에 int로 받아줌
char c = (char)i; // 받은 i를 다시 decoding하기 위해 char로 받고 출력
System.out.println("입력한 값 : "+c);
if(c=='x') {
inputStram.close();
break;
}
}
}catch(IOException e) {
e.printStackTrace();
}
}
} // end of class
- 입력 결과를 보듯, 한글은 2byte로 처리하는것을 알 수 있다.
- 이러한 바이트 단위로 주고 받는 InputStream / OutputStream 계열을 바이트 스트림이라고도 한다.
- 만약 100개의 문자를 입력받고 싶으면 100개의 변수를 선언하거나, 바이트 타입 배열을 선언하고, read method로 처리하는 방법도 있지만, 이는 메모리상으로 불리하게 작용한다.
3. Reader (Writer)
- 2byte 이상의 문자를 처리하기 위해 I/O Stream 계열을 보완하여 만들어낸 JAVA의 API
- 문자 단위로 처리하기 때문에 메모리상으로 유리하다.
- 무엇보다 한글 깨짐 현상을 극복할 수 있게 되었다.
package ioTest.one;
import java.io.*;
public class WriterTest {
public WriterTest() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
try {
InputStream ips = System.in;
Reader reader = new InputStreamReader(ips); // = new InputStreamReader(System.in);
OutputStream ops = System.out;
Writer writer = new OutputStreamWriter(ops); // = new OutputStreamWriter(System.out);
System.out.println("입력 대기 중..."); // 기본적으로 Input/OutputStream으로 입출력
//Input/OutputStreamReader로 Wrapping (byte -> char형태)
while (true){
int i = reader.read();
writer.write(i);
writer.flush(); // flush()를 통해 입력받은 내용을 바로 출력
if ((char)i == 'x') {
break;
}
}
//writer.flush(); // loop 밖으로 작성시, Loop가 끝나고 입력받은 내용을 모두 출력
reader.close();
writer.close(); // 입출력이 끝났으면, stream을 끊어주어 메모리 누수 방지 => 끊어주지 않으면 계속 연결상태 유지
// 파일 복사, 이동 시 문제 발생의 원인
}catch(IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}// end of main
}// end of class
'for JAVA > JAVA 기초' 카테고리의 다른 글
JAVA (7) - java의 형 변환과 API (0) | 2023.01.24 |
---|---|
Java 기초 (6) Access Modifier, Modifier-230109 (0) | 2023.01.24 |
Java 기초 (6). Polymorphism (다형성), Bean class 구조 23.01.06 (1) | 2023.01.15 |
JAVA 기초 (4) : OOP (객체 지향 프로그래밍)의 개념 (0) | 2023.01.05 |
JAVA 기초 (3) : 기초 문법 (0) | 2023.01.04 |