입출력 스트림(3) / BufferedReader / FileOutputStream
package ioEx2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Ex10_BufferedReader {
public static void main(String[] args) {
// BufferendReader : 문자 입력 스트림
// 버퍼를 활용하여 입력 속도 향상
// 한줄씩 입력 가능
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//버퍼드리더 써야 한줄에 입력 가능
try {
String name, s;
int age;
System.out.print("이름 ? ");
name = br.readLine();
System.out.print("나이 ? ");
age = Integer.parseInt(br.readLine());
s = age >= 19 ? "성인" : "미성년자";
System.out.println(name + "님은 "+s+"입니다.");
}
catch (NumberFormatException e) { // 문자를 숫자로 못바꿀때의 에러
System.out.println("나이는 숫자만 입력 가능");
}
catch (IOException e) { //
e.printStackTrace();
}
}
}
BufferedReader
문자 입력 스트림
버퍼를 활용해서 입력 속도가 좋음
한줄에 입력 가능
- 버퍼드리더 객체 br 생성(인풋스트림리더 System.in)
- readLine()을 이용해서 한번에 다 읽어 낸다 (기존 방식은 바이트 방식으로 1바이트,2바이트씩 읽어냈음)
- 나이 구할때는 입력 받은게 문자열이니까 Integer.parseInt로 Integer형태로 바꾸어준다.
- 나머지는 삼항 연산자로 조건 구하고
- 출력
- NumberFormatException은 문자를 숫자로 못바꿨을때의 에러이다. (나이 입력할때 숫자 입력 안하고 다른거 입력했을 때)
FileOutputStream (중요)
File 관련 개념들은 중요하다.
(파일 내용 입력 하기)
package ioEx2;
import java.io.FileOutputStream;
import java.io.IOException;
public class Ex11_FileOutputStream {
public static void main(String[] args) {
// 중요
String pathname = "test.txt";
// 파일에 내용을 저장하는 바이트 스트림
FileOutputStream fos = null;
int data;
try {
fos = new FileOutputStream(pathname);
//해당 파일이 없으면 생성하고, 존재하면 삭제하고 만듬
System.out.println("문자열 입력 ctrl + z 종료");
while((data = System.in.read()) != -1) { // -1을 써야 ctrl + z 를 써서 입력 완료를 한다.
fos.write(data);
}
fos.flush();
System.out.println("파일 저장 완료");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
}
미리 같은 경로에 test.txt 파일이 있어야한다.
- String 형태 pathname에 실험할 텍스트 파일 이름 넣어준다.
- FileOutputStream 객체 fos 생성하고 null 값을 넣어준다. (꼭 넣어줘야 함.)
- 객체 fos에 pathname을 새로 생성한다 (있으면 삭제하고 다시 만드니 주의)
- System.in의 read()를 이용해서 값을 입력 받는다.
- 파일 만들었던 객체 fos에 write를 이용해서 출력 버퍼에 저장
- ctrl + z 누르거나 더 이상 읽어올 값이 없을때 -1일때까지 값을 입력 받는다.
- 입력 다 받았으면 flush()로 입력한 것들을 fos에 출력 => 곧 파일 안에 내용이 입력 되었음
- finally를 이용해서 (finally는 try-catch문과 관계 없이 무조건 실행한다.)
- 만약 fos에 null이 없다면 (즉 값이 들어 갔다면) close해준다.
- null이면 catch문 실행
package ioEx2;
import java.io.FileOutputStream;
import java.io.IOException;
public class Ex12_FileOutputStream {
//암기해야함
public static void main(String[] args) {
// TODO Auto-generated method stub
String pathname = "test.txt";
int data;
// JDK 7.0부터 가능 자동 close
try(FileOutputStream fos = new FileOutputStream(pathname)) {
System.out.println("문자열 입력 [종료 : ctrl+z]");
while((data = System.in.read()) != -1) {
fos.write(data);
}
fos.flush();
System.out.println("파일 저장 완료");
} catch (IOException e) {
// ctrl + shift + o
e.printStackTrace();
}
}
}
- 위에 Ex11과 같은 기능을 한다.
- 그러나 예외 조건을 try 바로 옆에 주면 finally문장 안써도 된다.
package ioEx2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ex13_FileInputStream {
public static void main(String[] args) {
// TODO Auto-generated method stub
String pathname = "test.txt";
int data;
FileInputStream fis = null;
try {
fis = new FileInputStream(pathname);
// FileInputStream : 파일 입력 바이트 스트림
// 만약 파일이 존재하지 않으면 FileNotFoundException 발생
System.out.println(pathname + "파일 내용");
while((data = fis.read()) != -1) {
// 파일에서 읽은 내용 화면에 출력
System.out.write(data);
}
System.out.flush();
}
catch (FileNotFoundException e) {
System.out.println("존재하지 않는 파일");
}
catch (IOException e) {
e.printStackTrace();
} finally {
if(fis != null) {
try {
fis.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
}
FileInputStream
파일 입력 바이트 스트림
(파일 내용 출력)
- String pathname에 실험할 텍스트 파일 이름을 준다.
- FileInputStream 객체 생성하고 null 준다
- 마찬가지로 while 반복문을 활용한다
- fis.read() = 파일에서 읽은 내용을 데이터에 담는다
- write를 이용해서 버퍼 장치로 보냄
- flush()로 출력을 한다.
- finally문으로 close해준다.
package ioEx2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ex14_FileInputStream {
public static void main(String[] args) {
// TODO Auto-generated method stub
String pathname = "test.txt";
int data;
try(FileInputStream fis = new FileInputStream(pathname)) {
System.out.println(pathname + "파일 내용");
while((data = fis.read()) != -1) {
// 파일에서 읽은 내용 화면에 출력
System.out.write(data);
}
System.out.flush();
}
catch (FileNotFoundException e) {
System.out.println("존재하지 않는 파일");
}
catch (IOException e) {
e.printStackTrace();
}
}
}
- 위 코드와 동일한 기능을 한다.
- finally를 안쓰기 위해 try 바로 옆에 조건을 준 모습