콘솔이란 사용자에게 입력을 받거나 사용자에게 문자열 등을 출력해주는 역할을 통칭하는 말이다.
J2SE 5.0 버전 이후로 java.util.Scanner 라는 클래스가 생성되어서 이전의 콘솔 입력보다 쉽게 처리할 수 있다. 점프투자바를공부하기 전에는 입력 방법이 Scanner 클래스를 이용하는 방법 하나 밖에 없는줄 알았는데 다른 방법이 있다는 사실을 알게 되었다. 쉬운 방법이 있는데 두가지를 모두 알아야 하는지는 아직 판단이 안되지만 두가지 모두 공부하도록 하겠다.
프로그램은 외부로부터 데이터를 입력받거나 외부로 데이터를 출력하는 작업이 빈번하게 일어난다. 이 때 데이터는 어떠한 통로를 통해 이동하게 되는데, 이 통로를 스트림이라고 한다. 자바에는 이러한 기능을 수행하기 위해 InputStream과 OutputStream이 존재하며 단일 방향으로 연속적으로 흘러간다.
InputStream이란 바이트(byte) 기반 입력스트림의 최상위 추상 클래스(abstract class)이다. 모든 바이트 기반 입력스트림은 InputStream을 상속받는다. InputStream은 파일 데이터를 읽거나 키보드에서 입력한 데이터를 읽을 때 사용된다.
import java.io.IOException;
import java.io.InputStream;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
int a = in.read();
System.out.println(a);
}
}
int a = in.read();
int b = in.read();
int c = in.read();
System.out.println(a);
System.out.println(b);
System.out.println(c);
byte[] a = new byte[3];
in.read(a);
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
abc
97
98
99
InputStreamReader는 아스키코드가 아닌 입력한 그대로의 데이터를 출력하게끔 해주는 클래스이다.
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);
char[] a = new char[3];
reader.read(a);
System.out.println(a);
}
}
InputStreamReader 또한 java.io 패키지 내의 클래스 이기 때문에 import 해주어야 한다. InputStreamReader의 객체를 생성할 때는 생성자의 입력으로 InputStream의 객체가 필요하다.
InputStreamReader을 사용하면 변수의 자료형을 byte 배열이 아닌 char 배열로 하여 문자열 그대로를 입력받아 문자열을 출력할 수 있다.
버퍼리더는 고정된 길이의 데이터를 입력 받는게 아니라 원하는 길이만큼 데이터를 입력해도 읽을 수 있는 클래스이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);
BufferedReader br = new BufferedReader(reader);
String a = br.readLine();
System.out.println(a);
}
}
BufferedReader 클래스 역시 import를 해야하고 객체를 생성할 때 생성자의 입력값으로 InputrStreamReader의 객체를 필요로 한다.
BufferedReader 클래스의 readLine 메소드는 원하는 길이만큼의 데이터를 입력받을 수 있다.
처음으로 접했던 입력 클래스는 Scanner였고 이렇게 복잡하게 객체를 감싸고 감싸지 않아도 됐었다.
import java.util.Scanner;
public class Sample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine();
System.out.println(a);
}
}
지금까지 배웠던 System.out.println 메소드의 System.out은 PrintStream 클래스의 객체이다. PrintStream은 콘솔에 데이터를 출력할 때 사용되는 클래스이다.
System.out.println("일반출력");
System.err.println("에러출력");
두 문장은 동일한 역할을 하지만 System.err은 에러 메세지를 출력하는 역할을 하고, 출력 문자도 빨간색이다.
파일 입출력이란 콘솔 입출력과 달리 콘솔창에 입출력을 하는 것이 아니라 파일을 하나 생성해서 파일 내에 입력과 출력을 하는 방법이다.
import java.io.FileOutputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileOutputStream output = new FileOutputStream("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
for (int i=1; i<11; i++) {
String data = i + "번째 줄입니다.\r\n";
output.write(data.getBytes());
}
output.close();
}
}
FileOutputStream 클래스는 file을 생성해주는 클래스이다. 생성자의 입력으로 파일명을 넘겨주면 해당 위치에 파일을 생성해준다. 이 클래스 역시 java.io 패키지 내의 클래스이기 때문에 import하여 사용한다. 클래스 내의 write 메소드를 통해 파일 내에 데이터 입력이 가능하다.
for문으로 문장을 입력한다. \r\n은 Windows에서 쓰이는 줄바꿈 기호이다. String 타입의 변수에 문장을 저장한 후 write 메소드의 입력인자에는 String 타입의 변수를 Byte 타입으로 바꾸어서 입력한다.
close 메소드를 통해 객체 파일을 닫아준다. 생략해도 자동으로 닫아주지만 에러가 날 경우를 대비해 적어주는 것이 좋다.
import java.io.FileWriter;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
for (int i=1; i<11; i++) {
String data = i + " 번쨰 줄입니다.\r\n";
fw.write(data);
}
fw.close();
}
}
import java.io.IOException;
import java.io.PrintWriter;
public class Sample {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
for (int i=1; i<11; i++) {
String data = i + " 번쨰 줄입니다.";
pw.println(data);
}
pw.close();
}
}
for (int i=1; i<11; i++) {
String data = i + " 번쨰 줄입니다.";
pw.println(data);
}
for (int i=1; i<11; i++) {
String data = i + " 번쨰 줄입니다.";
System.out.println(data);
}
import java.io.FileWriter;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
for (int i=1; i<11; i++) {
String data = i + " 번쨰 줄입니다.\r\n";
fw.write(data);
}
fw.close();
FileWriter fw2 = new FileWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt", true);
for (int i=11; i<21; i++) {
String data = i + " 번쨰 줄입니다.\r\n";
fw2.write(data);
}
fw2.close();
}
}
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Sample {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
for (int i=1; i<11; i++) {
String data = i + " 번쨰 줄입니다.";
pw.println(data);
}
pw.close();
PrintWriter pw2 = new PrintWriter(new FileWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt", true));
for (int i=11; i<21; i++) {
String data = i + " 번쨰 줄입니다.";
pw2.println(data);
}
pw2.close();
}
}
import java.io.FileInputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
byte[] data = new byte[1024];
FileInputStream input = new FileInputStream("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
input.read(data);
System.out.println(new String(data));
input.close();
}
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt"));
while (true) {
String line = br.readLine();
if (line==null) break;
System.out.println(line);
}
br.close();
}
}