- InputStream : 표준 입력
- PrintStream : 표준 출력
- 표준입출력 데이터형을 가지는 System 클래스의 3가지 변수
static InputStream in
:System.in
, 키보드에서 데이터를 읽어올 때 사용한다.static PrintStream out
:System.out
, 모니터로 데이터를 출력할 때 사용한다, println, print 메소드 제공static PrintStream err
:System.err
, 모니터로 에러를 출력할 때 사용한다. 거의 사용되지 않는다.
파일 입력 : FileInputStream, FileReader를 사용한다.
FileInputStream
import java.io.FileInputStream;
public class InputTest {
public static void main(String[] args) throws IOException {
FileInputStream fileInput = new FileInputStream("./src/data");
//같은 프로젝트의 src 파일에 data 라는 파일을 만들었다.
int read = 0;
while ((read = fileInput.read()) != -1) {
System.out.print((char)read);
} //1 바이트씩 읽어 출력한다.
fileInput.close(); //입력 스트림을 닫아준다.
}
}
//Hi, my name is Lee! // 영어는 잘 읽어냈지만
//ìë
, ë´ ì´ë¦ì 리ì¼! // 한글은 읽어내지 못했다.
import java.io.FileReader;
import java.io.IOException;
public class InputTest {
public static void main(String[] args) throws IOException {
FileReader fileInput = new FileReader("./src/data");
int read = 0;
while ((read = fileInput.read()) != -1) {
System.out.print((char)read);
} //2바이트씩 읽어 출력한다.
fileInput.close(); //입력 스트림을 닫아준다.
}
}
//Hi, my name is Lee!
//안녕, 내 이름은 리야! //한글과 영어 모두 잘 읽어냈다.
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputTest {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutput = new FileOutputStream("./src/output1.txt");
byte[] data = {65, 66 , 'A', 'B'};
fileOutput.write(data);
fileOutput.write('\n');
fileOutput.write('안');
fileOutput.write('녕');
fileOutput.close();
//ABAB
//HU
// byte 로 입력하는 숫자는 모두 아스키코드에 의해 자동으로 문자로 변환된다.
// 영어는 잘 출력되지만 한글은 깨져서 출력되지 않는다.
}
}
import java.io.FileWriter;
import java.io.IOException;
public class OutputTest {
public static void main(String[] args) throws IOException {
FileWriter fileOutput = new FileWriter("./src/output2.txt");
fileOutput.write(("65");
fileOutput.write(65);
fileOutput.write('\n');
fileOutput.write('안');
fileOutput.write('녕');
fileOutput.write('\n');
fileOutput.write("반가워요");
fileOutput.close();
}
}
//65A
//안녕
//반가워요
//한글, String을 출력할 수 있다.
//숫자는 아스키 코드로 반환하여 영어로 출력한다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("./src/data"));
//FileReader 객체를 BufferedReader에 넣어 br을 생성했다.
String read = null;
while ((read = br.readLine()) != null) {
String[] nameList = read.split(" ");
for (String name : nameList) {
System.out.println("성 : " + name);
}
}
System.out.println("출력이 모두 끝났습니다.");
br.close();
}
}
//성 : Lee
//성 : kim
// (...)
//성 : 최
//성 : 임
//출력이 모두 끝났습니다.
- 라인으로 데이터를 입력 받았을 때는 split, StringTokenizer 등을 통해 데이터를 구분해주어야 한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedWriterTest {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 키보드로 부터 입력값을 받고 버퍼 과정을 통해 입력 받는다.
BufferedWriter bw = new BufferedWriter(new FileWriter("./src/data.txt"));
// data.txt 파일을 생성하고 입력한다.
System.out.println("몇 명의 이름을 입력하시겠습니까?");
int n = Integer.parseInt(br.readLine());
//입력받을 숫자를 받는다.
System.out.println( n +"명의 이름을 적어주세요 (엔터로 구분해주세요)");
for(int i=1; i<=n; i++) {
String name =br.readLine();
bw.write(i +"번 이름 : " +name + "\n");
}
//엔터로 구분해서 사람 이름을 받고 파일에 출력한다.
/* 콤마로 구분해서 입력받고 파일 생성하기
String[] nameList = br.readLine().split(",");
int i =1;
for( String name : nameList) {
bw.write( i+"번 이름 : " +name + "\n");
i++;
}
*/
System.out.println("파일 생성 완료!");
br.close();
bw.close();
}
}
- BufferReader의 경우 close()하지 않아도 Garbage Collector에 의해 내부 객체가 정리가 된다.
- BufferWriter의 경우 적당한 시점에 해주지 않으면 원치 않는 것이 출력될 수 있다.
- flush() : 메소드는 버퍼에 남아있는 데이터를 강제로 내보내는 기능이다.
- close() : flush()를 통해 버퍼의 남아있는 데이터를 내보내고 버퍼를 닫는다.
- 자원 관리를 위해 두 메소드를 적재적소에 이용할 필요가 있다.
Reference: