콘솔 입출력

5w31892p·2022년 12월 28일
0

Java

목록 보기
17/17

:: 콘솔입력

:: InputStream

  • InputStream 자바 내장 클래스
  • read() InputStream의 객체, 1바이트의 입력만 받아들인다.(1글자)
  • 아스키 코드로 출력
InputStream in = System.in;
int a;
a = in.read();

System.out.println(a);

// byte자료형이 아닌 int 자료형으로 저장
// int값은 아스키 코드값
// 콘솔에 a 입력시 97 출력
// 콘솔에 abc를 입력해도 1바이트만 읽기 때문에 97 출력

사용자가 전달한 데이터 = 입력 스트림(Stream)
스트림은 이어져 있는 데이터(byte)의 형태

스트림

A~B 까지는 수도관으로 연결되어 있다면, A에서 물 보내면 B에서 수도꼭지 열 때마다 물 나올 것이다.

스트림은 A -> B 로 이동하는 물의 흐름 이다.

// abc로 3바이트 모두 출력하려면?
InputStream in = System.in;

int a;
int b;
int c;

a = in.read();
b = in.read();
c = in.read();

System.out.println(a);
System.out.println(b);
System.out.println(c);
// abc를 치고 엔터 누르면 각각 아스키코드가 출력된다.


// 코드 개선
byte[] a = new byte[3];
in.read(a);

System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);

:: InputStreamReader

  • 입력한 값 그대로 출력
  • 배열로 값의 길이를 선언해야 한다.
  • 객체 생성시 InputStream의 객체가 필요하다.
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);
char[] a = new char[3];
reader.read(a);

System.out.println(a);

:: BufferedReader

  • 사용자 입력 모두 받아 들여 출력
  • 객체 생성시 InputStreamReader의 객체가 필요하다.
  • readLine() 메서드 이용하면 사용자 입력 전부를 출력할 수 있다.
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);
BufferedReader br = new BufferedReader(reader);

String a = br.readLine();
System.out.println(a);

InputStream - byte
InputStreamReader - character
BufferedReader - String

InputStream은 byte를 읽고, InputStreamReader는 문자를 읽고, BufferedReader는 문자열을 읽는다.

:: Scanner

  • next : 단어 하나만 출력
  • nextLine : 한 라인을 출력
  • nextInt : 정수만 출력
Scanner sc = new Scanner(System.in);
System.out.println(sc.next());

:: 콘솔 출력

System.out -> 콘솔에 출력이나 디버깅시 사용
System.err -> 오류 메시지 출력할 경우 사용

System.out.println("일반 출력");
System.err.println("에러 출력");

     > Task :Sample.main()
    일반 출력
    ...
     2 actionable tasks: 2 executed
    에러 출력


:: 파일 입출력

:: FileOutputStream

  • 파일 생성
  • 객체 생성을 위해서는 생성자 입력으로 파일명을 넘겨주어야 한다.
  • 객체.close(); : 파일 객체 닫아 주는 것
  • 바이트 단위로 데이터 처리
  • getByte() 메서드는 byte배열로 바꿔주는 역할
  • 바이트 단위로 처리하기 때문에 문자열 쓸때 String을 byte배열로 변환해야하는 것이 불편하다.
FileOutputStream output = new FileOutputStream("c:/out.txt");
for (int i = 0; i < 11; i++) {
  String data = i + "번째 줄입니다.\r\n";
  output.write(data.getBytes());
}
output.close();

// C드라이브에 out.txt 생김

:: FileWriter

  • 위에서 언급했듯이 문자열을 쓸 때 String을 byte배열로 변환하는 번거로움을 편하게 해준다.
  • byte 배열 대신 문자열을 사용할수 있다.
FileWriter fw = new FileWriter("c:/out.txt");
for(int i=1; i<11; i++) {
  String data = i+" 번째 줄입니다.\r\n";
  fw.write(data);
}
fw.close();

:: PrintWriter

  • FileWriter 사용시 \r\n을 문자열 뒤에 덧붙여야 하는 번거로움이 있다.
  • \r\n 대신 println 메서드 사용
PrintWriter pw = new PrintWriter("c:/out.txt");
for(int i=1; i<11; i++) {
  String data = i+" 번째 줄입니다.";
  pw.println(data);
}
pw.close();

원래 평소에 사용해왔던 System.out.println(); 은 콘솔 출력 방법이다.
파일 출력 방법은 System.out 대신 PrintWriter의 객체를 사용한다.

:: 파일에 내용 추가하기

  • 추가 모드 열어서 내용 작성해야 한다.
  • 추가모드로 열면 기존 내용을 덮어 쓰지 않고 이후 부터 파일이 쓰여진다.
  • FileWriter로 추가할 땐 두번째 매개변수에 true 추가
  • PrintWriter로 추가할 땐 생성자의 파라미터로 파일명대신 추가모드로 열린 FileWriter 객체 전달
FileWriter2 fw2 = new FileWriter2("c:/out.txt", true);
for(int i=11; i<21; i++) {
  String data = i+" 번째 줄입니다.\r\n";
  fw2.write(data);
}
fw2.close();

PrintWriter pw2 = new PrintWriter(new FileWriter("c:/out.txt", true));
for(int i=11; i<21; i++) {
  String data = i+" 번째 줄입니다.";
  pw2.println(data);
}
pw2.close();

:: 파일 읽기

FileInputStream 사용

  • byte 배열을 이용하여 파일을 읽어야 하는데, 정확한 길이를 모를 경우에는 불편하다.
  • 바이트 배열을 문자열로 변경 -> new String (바이트배열)
byte[] b = new byte[1024];
FileInputStream input = new FileInputStream("c:/out.txt");
input.read(b);
System.out.println(new String(b));  // byte 배열을 문자열로 변경하여 출력
input.close();

FileReader + BufferedReader 사용

  • FileReader + BufferedReader 조합 사용시 라인단위로 파일 읽기 가능
  • BufferedReader의 readLine() 메서드 -> 읽을 라인 없을 시 null
 BufferedReader br = new BufferedReader(new FileReader("c:/out.txt"));
while(true) {
  String line = br.readLine();
  if (line==null) break;  // 더 이상 읽을 라인이 없을 경우 while 문을 빠져나간다.
  System.out.println(line);
}
br.close();

파일을 쓰거나 읽은 후에는 반드시 close 메서드로 파일처리를 종료


📜 콘솔입력 퀴즈 풀이

0개의 댓글