GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

IO 입출력 클래스 / In/outputStream / reader/writer / + Scanner

Backcoder 2022. 7. 8. 21:34

< IO 입출력 클래스 > - java.io.  

 [ Input 입력의 방법 ] 
- args[명령형매개변수] 이용하는 방법 
  실행하기전에 다 넣어놔야함. (프로그램 실행 중간에 넣을 수 없음) 
- 난수 도 하나의 방법 

 

 [ IO클래스 이용 => 입출력 ]
키보드 / 모니터        - System.in/System.out 
메모리         (java.io) - BuffuredReader/Writer
=> 속도측면에서 메모리를 사용한 입출력이 뛰어난 성능을 보인다. 
    ( 데이터가 많을 수록, 차이가 더 심해진다. ) 


java.io.50여개 

1. InputStream / OutputStream 클래스  => 단위 1byte씩 ( BYTE 스트림 ) 
   (Stream = 데이터의 연속흐름)
read( )메소드 - 키보드 하나 입력만 읽어옴 
write( )메소드 - 키보드 하나씩만 출력 (1바이트씩)

- 다국어 지원 X  ( 1BYTE 의 한계 ) 
- 영문자는 가능 (1BYTE)  
-  jpg 이미지파일 o
-  mp3 음향파일 o 


2. Reader  /  Writer 클래스                =>  단위 2byte씩 (문자 스트림)        -  
( Stream 클래스들이랑 거의 똑같다. 메소드도 똑같다. BYTE 크기 차이 ) 

- 다국어 지원 가능 

- read( ) 데이터  2BYTE 단위로 입력 
- write( ) 데이터 2BYTE 단위로 출력       => String 가능 (1개문자2Byte) 

- close(  )           문닫기 잊지말자! 

=> IO 공통메소드  - finally 와 함께 사용해서 블록 처리

 

"다 사용했어요 닫아주세요! "
     





3. Scanner 클래스      ( 애는 io 계열은 아니고, java.util 계열인데 대놓고 IO기능을 한다. )  

<기본사용법> 

Scanner sc = new Scanner( "읽어올거" );     

 

Scanner sc = new Scanner(System.in);     =>  키보드로 읽어온걸 스캐너에 넣겠다. 

- 읽어올거, 즉 입력만 넣을 수 있다. ( 출력 X ) 

   => System.in  /   InputStream /  reader   

Scanner sc = new Scanner(new FileInputStream( " " ) );  
Scanner sc = new Scanner(new FileReader( " " ) ); 
Scanncer sc = new Sacnner( fr );  //객체만들어놨으면 객체로 넣고 

이런 입력 하는것들을 Scanner 객체에 담아서 
Scanner 클래스의 메소드들을 사용할 수 있게 만드는 것. 

< Scanner 메소드 >

 

nextInt( )           =>읽어온것의 다음  int 
next( )              => 읽어온것의 다음 String // 띄어쓰기로 구분 // 
nextLine( )          => 읽어온것의 다음 String 인데 한줄통째로 // 엔터로 구분 // 


hasNextInt( )      => 읽어온것 다음 int 있나                Boolean 
hasNext( )         => 읽어온것 다음 String 있나            Boolean 
hasNextLine(  )   => 읽어온것 다음 String (줄단위) 있나 Boolean  


이 메소드들을 사용해서 기본적인 패턴이 

 Scanner sc = new Scanner(System.in);    

 while( sc.hasNext( ) ) { 
System.out.println( sc.next( ) );  }

스캐너에 담긴 입력값에 ( sc ) 
다음 데이터가 있다면 ( hasNext ) 
다음 데이터를 출력해줘 ( next )   

이게 스캐너의 정형화된 사용법이다.

스캐너의 메소드를 사용하면 

 

1. int, String, String(줄) ,double 등 데이터 타입별로 입력값을 구분해서 사용할 수 있다. 

2. hasNext / next 를 이용해서 입력값을 처음부터 끝까지 싹 뽑을 수 있다. 

어떻게 어떻게 하면 스캐너 없이도 할 수 있지만, 
매우 불편할 과정을 스캐너의 기능이 편리하게 만들어 준다. 

- SourceStream 보조스트림 
Scanner처럼 데이터타입 변환 / 한글 변환 등등 역할을 해주는 보조스트림들이

DataInputStream / out
BufferedInput/Outputstream 
BufferedReader/Writer (애는 좀 눈여겨 봐두고 익혀둬야한다)

이런게 있는데  
=> Scanner 도이런 역할은 다 해낼 수는 있다.  속도성능차이 


< next 와 nextLine > 
Scanner 는 기본적으로 스페이스(공백) 으로 입력당 구분이 된다.  
띄어쓰기를 구분으로 인식
- 10  20  숫자의 경우 띄어쓰기를 했다면, 10 의 next 가 20 이 된다.
- 마찬가지로 String도   java  program     두 단어사이에 띄어쓰기를 했다면  next 로 구분된다.  

예외 -  nextLine 
String s = sc.nextLine( )   => 1줄을 통째로 String에 입력한다.  
- 띄어쓰기도 하나로 인식 
엔터를 구분으로 인식
   
  동해물과 백두산이 마르고 닳도록 <= 이 한줄을 통째로 String취급 
 
( - nextLine 사용시 주의 : 전 입력에서 엔터로 구분한게 있고, 바로 nextLine을 사용하면 
전 입력에서 엔터로 구분한게 여기에 적용되버려서 제대로 작동 안할 수 있다. 
=> scanner.nextLine( ); 하나 쌩으로 줘서 한줄을 넘기고 
    새로 nextLine( ) 을 써주는 방법이 있음을 인지하고 있자.  )

 

public class Scanner_ {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String c = scanner.next();
        String d = scanner.next();

        System.out.println(c + d);

        scanner.nextLine();                  // 이걸로 한줄 넘기는 것 

        String e = scanner.nextLine();
        System.out.println(e);
    }
}