본문 바로가기
개발자 양성과정 필기노트/JAVA

자바 I/O - 데이터 입/출력 하는 방법

by jono 2021. 11. 14.

     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

댓글