-
입출력 스트림(3) / BufferedReader / FileOutputStream카테고리 없음 2021. 8. 24.반응형
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 바로 옆에 조건을 준 모습
반응형