0. 자원을 사용하는 객체를 사용할 때 유의할 점
: InputStream, Connection 과 같이 자원을 사용하는 (==작업을 불러오는..그런느낌) 객체를 사용할 때에는
사용후에 close() 메서드로 꼭 작업을 끝내줘야 한다.
- close()로 작업을 종료하지 않으면 계속 작업요청을 실행하므로 다른 작업에 문제가 발생할 수 있기 때문이다.
- try-catch문 사용시, 예외발생유무에 상관없이 동작하는 finally문에 close()를 기재하면 된다
=> try-resource문을 사용하면 별도로 close() 처리를 하지않아도 자원반환을 자동으로 수행하므로
try-resource문을 활용할것!
I. INPUT - 데이터를 입력받는 5가지 방법
방법1. InputStream 객체를 사용하여 1바이트 단위로 입력데이터를 처리하기
1) System.in을 사용하여 데이터를 입력받고 InputStream객체에 저장함
2) read() 호출하여 입력받은 데이터를 1바이트씩 읽어들인다 -> int형으로 저장된다.
3) 주의! int형으로 읽어들이므로 문자데이터는 별도로 형변환을 해야한다.
4) 다음바이트로 이동하기 위해 반복문 마지막에 read()를 한번 더 호출하여 다음에 접근할 데이터를 초기화해야한다.
System.out.println("데이터를 입력하세요");
try(InputStream iss = System.in) {
int in = iss.read();
while(in!=-1) {
System.out.println("입력 데이터를 문자로 변환: "+(char)in);
in = iss.read();
}
} catch (Exception e) {
e.printStackTrace();
}
방법2. InputStream 객체 사용, 배열을 이용해 한번에 여러 바이트를 모아서 데이터 처리하기
1) System.in을 사용하여 데이터를 입력받고 InputStream객체에 저장함
2) n의 크기를 갖는 byte배열을 생성함. byte[] bArr = new byte[n];
3) read() 호출하여 InputStream객체에 저장된 데이터를 읽어들이며, 이때 byte배열을 매개변수로 전달함.
-> 입력데이터를 배열의 크기만큼 한번에 저장하게된다.
4) 읽어들인 데이터는 int형으로 저장되므로 문자열데이터는 별도의 형변환처리가 필요하다.
System.out.println("데이터를 입력하세요");
try (InputStream is = System.in){
byte[] bArr = new byte[10];//10바이트 단위로 묶는 경우
int n = is.read(bArr);
System.out.println("입력 데이터 크기: "+n+"바이트");
//for문을 사용하여 배열에 저장되어있는 입력값 출력하기 - 문자 하나씩 읽음
for (int i = 0; i < bArr.length; i++) {
System.out.println("입력데이터: "+(char)bArr[i]);
}
// String 클래스를 활용하면 배열테이터를 문자열로 변환가능하다 - 문자열로 읽음
String str = new String(bArr);
System.out.println("입력데이터: "+str);
} catch (IOException e) {
e.printStackTrace();
}
//while문을 사용하는 경우
try(InputStream iss = System.in) {
byte[] bArr = new byte[10];
int n = iss.read(bArr);
while(n>0) {
String str = new String(bArr);
System.out.println("입력 데이터: "+str);
n = iss.read(bArr);
}
} catch (Exception e) {
e.printStackTrace();
}
단점!) 지정한 배열의 크기만큼의 데이터만 저장할 수 있으므로
배열크기보다 큰 데이터를 입력하면 데이터 소실이 발생함
방법3. InputStreamReader 객체를 사용하여 char단위로 입력데이터를 처리
1) InputStram객체를 생성하고 데이터를 입력받아 저장함
2) InputStreamReader객체 생성 & 매개변수로 InputStream객체를 전달함.
3) InputStreamReader객체에 read()호출하여 데이터를 2바이트씩 읽어들임
4) int로 저장되므로 문자형의 경우 별도의 형변환이 필요함
System.out.println("데이터를 입력하세요");
try (InputStreamReader reader = new InputStreamReader(System.in)){
int data = reader.read();
while(data>0) {
System.out.println((char)data);
data = reader.read();
}
} catch (Exception e) {
e.printStackTrace();
}
방법4. InputStreamReader객체를 이용, 배열을 이용해 한번에 데이터 처리하기
System.out.println("데이터를 입력하세요");
try (InputStreamReader reader = new InputStreamReader(System.in)){
char[] cArr = new char[10];
int data = reader.read(cArr);
while (data>0) {
String str = new String(cArr);
System.out.println("입력 문자열: "+str);
data = reader.read(cArr);
}
} catch (Exception e) {
e.printStackTrace();
}
방법5. BufferedReader 객체를 사용하여 String단위로 입력데이터를 처리
1) InputStream객체를 매개변수로 전달 -> InputStreamReader객체를 매개변수로 전달 -> BufferedReader
2) BufferedReader객체에 readLine()호출하여 읽어온 데이터를 String형으로 저장
3) 출력하면 끝
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in))){
String str = buffer.readLine();//한줄씩 읽어와 String데이터로 저장함
while(str!=null) {
System.out.println("입력 데이터: "+str);
str = buffer.readLine();//초기화과정은 마찬가지로 필수!
}
} catch (IOException e) {
e.printStackTrace();
}
II. OUPUT - 데이터를 출력하는 4가지 방법
1. OutputStream - byte단위 처리
1) OuputStream객체를 생성하고 System.out과 연결함
2) OutputStream객체의 write(int) 호출하고 출력할 데이터를 전달하면 끝
char ch = 'A';
try(OutputStream os = System.out){
os.write(ch);
} catch(IOException e){
e.printStackTrace();
}
2. OutputStream - byte 배열에 담아 한번에 처리도 가능함.
1) OuputStream객체를 생성하고 System.out과 연결함
2) OutputStream객체의 write(byte[]) 호출하고, 출력할 String에 getBytes()호출하여 전달함
String str = "Hello 자바";
try (OutputStream oss = System.out){
//write(byte[] b)메서드를 호출허여 출력할 데이터를 배열에 전달.
oss.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
3. OutputStreamWriter - char단위 처리
1) OutputStreamReader객체와 System.out 연결
2) OutputStreamReader객체의 write(String)호출하고 출력할 데이터를 전달
System.out.println("데이터를 입력하세요");
try(OutputStreamWriter writer = new OutputStreamWriter(System.out)){
String str = "Hello 자바";
writer.write(str);
} catch (IOException e) {
e.printStackTrace();
}
4. BufferedWriter 사용
- 객체생성과정을 한줄로 연결하여 정의하는 "데코레이션 패턴" 활용함
1) System.out 전달 -> OutputStreamWriter객체 전달 -> BufferedWriter 객체 생성
2) BufferedWriter의 write()메서드 호출, 출력할 String을 전달한다.
//BufferedReader를 활용하여 입력받은 데이터를 BufferedWriter를 활용하여 출력하기
System.out.println("데이터를 입력하세요");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));){
String str = reader.readLine();//입력받은 문자열을 읽어와(readLine) 저장함.
writer.write(str); //저장한 문자열을 출력(write)함
} catch (IOException e) {
e.printStackTrace();
}
'개발자 양성과정 필기노트 > JAVA' 카테고리의 다른 글
자바 I/O - 객체 직렬화, 역직렬화 (0) | 2021.11.14 |
---|---|
자바 I/O - 파일 입/출력하기 (0) | 2021.11.14 |
멀티쓰레딩 (0) | 2021.11.13 |
사용자 정의 예외 (0) | 2021.11.13 |
데이터 형식화 클래스 (0) | 2021.11.13 |
댓글