728x90
다양한 타입의 출력
try-with-resources 블럭이란?
java IO 객체는 인스턴스를 만들고 모두 사용하면 close()메소드를 호출해야 하는데 close() 메소드를
사용자가 호출하지 않더라도 Exception이 발생하지 않았다면 자동으로 close()가 되게 할 수 있는 방법
try(
// IO 객체 선언
){
// IO 객체 사용
}catch(Exception ex){
ex.printStackTrace();
}
< 다양한 타입으로 저장할 수 있는 DataOutputStream >
package ex4;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteIOExam{
public static void main(String[] args){
// try{}catch{}finally{} -> try(){}catch{}
try(
// 다양한 타입으로 파일에 저장하는 것이므로
// 다양한 타입을 쓸 수 있는 DataOutputStream을 사용
// DataOutputStream에다가 혼자 생성할 수 없고 다른 DataOutputStream을 넣어야함
// -> 파일에다가 쓰고 싶기 때문에 new FileOutputStream을 생성
DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt"));
){
out.writeInt(100); // 정수 값으로 저장(4byte 저장)
out.writeBoolean(true); // boolean 타입으로 저장(1byte 저장)
out.writeDouble(50.5); // double 타입으로 저장(8byte 저장)
}catch(Exception e) {
e.printStackTrace();
}
}
}
< 다양한 타입으로 입력할 수 있는 DataInputStream>
만들어진 data.txt의 속성을 보면 13byte가 저장된 것을 볼 수 있다.
이는 int(4byte) + boolean(1byte) + double(8byte)이기 때문에 13byte가 저장된 것이다.
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class ByteIOExam2 {
public static void main(String[] args){
try(
// 파일에서 읽어들이기 위해서 FileInputStream을 이용
// 그렇게 읽어들인 파일로부터 다양한 타입으로 읽어내기 위해 DataInputStream을 사용
DataInputStream in = new DataInputStream(new FileInputStream("data.txt"));
){
// int, boolean, double를 저장된 순서대로 읽어내기
int i = in.readInt();
boolean b = in.readBoolean();
double d = in.readDouble();
System.out.println(i);
System.out.println(b);
System.out.println(d);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
char 단위의 입출력 : char 단위 입출력 클래스는 이름 Reader나 Writer로 끝이 난다.
데코레이터 패턴 : 객체에 추가적인 요건(기능)을 동적으로 첨가하는 방식으로
서브클래스를 만드는 것을 통해 기능을 유연하게 확장할 수 있는 방법 제공한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CharIOExam01 {
public static void main(String[] args) {
// 1줄씩 입력받기 위해 BufferedReader 객체 필요
// BufferedReader를 생성하면서 실제 어디서 입력을 받을 것인가
// -> 입력을 받을 부분은 키보드이기 때문에 System.in이 들어가야하는데
// System.in이 바로 들어갈 수 없기 때문에 InputStream인 System.in을
// Reader타입으로 바꿔줄 수 있는 InputStreamReader 객체를 생성해서 넣어줌
// 이때 InputStreamReader 객체에다가 키보드를 의미하는 System.in 넣어주면 됨
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 키보드로 입력받은 문자열을 저장하기 위해 line 변수를 선언
String line = null;
// 익셉션이 발생할 수 있음
// -> line을 try 블럭 바깥쪽에서 사용하기 위해 아래와 같이 사용x
//String line = br.readLine();
try {
// 키보드로부터 입력받은 값을 line 변수에 저장
line = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(line);
}
}
- System.in - 키보드를 의미(InputStream)
- BufferedReader - 한줄씩 입력 받기위한 클래스
- BufferedReader 클래스의 생성자는 InputStream을 입력받는 생성자가 없다.
- System.in은 InputStream 타입이므로 BufferedReader의 생성자에 바로 들어갈 수 없으므로 InputStreamReader 클래스를 이용해야한다.
char 단위의 입출력(file) :
char 단위 입출력 클래스는 클래스 이름이 Reader나 Wruter로 끝이 난다.
1)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//import java.io.InputStreamReader;
import java.io.PrintWriter;
public class CharIOExam02 {
public static void main(String[] args) {
// 파일에서부터 받아들이게 하기 위해서는 파일에서 읽어내는 객체인 FileReader 객체를 생성
// 1줄씩 읽어내기 위해서는 BufferedReader 필요
// -> BufferedReader가 생성될 때 file에서 입력받기 위한 FileReader 객체를 생성하는 것
BufferedReader br = null;
PrintWriter pw = null;
try{
// FileReader 객체를 생성할 때 읽어들이고 싶은 file의 경로를 씀
// 익셉션이 발생할 수 있는 부분(선언과 값 할당을 따로 해줌)
br = new BufferedReader(new FileReader("src/main/java/ex4/CharIOExam02.java"));
// System.out의 타입이 PrintWriter 객체임
// 이때 다양한 기능을 PrintWriter를 통해 수행하는데
// 이를 FileWriter("경로")부터 받아들일 수 있도록 함
pw = new PrintWriter(new FileWriter("test.txt"));
// 1줄 읽었을 때 저장할 수 있는 공간인 line 변수
String line = null;
// file이 1줄만 있는 것이 아니라 여러 줄이 있을 수 있기 때문에 반복문 사용
// file로부터 1줄 입력 받은 것이 line에 들어가있을 때 return된 값이 null일 때까지 수행
// file이 끝이 되면 null 값을 리턴
while((line = br.readLine())!= null){
// 읽어들인 값은 line에 있음
// 읽어들인 값을 다시 file에 쓰기 위해서 PrintWriter인 pw에 써주면 됨
pw.println(line);
}
}catch(Exception e){
e.printStackTrace();
// 파일을 닫아주지 않으면 txt 안에 내용은 아무것도 없음
}finally {
pw.close();
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 파일에서 한 줄씩 입력 받아서 파일에 출력
- 파일에서 읽기위해서 FileReader 클래스 이용
- 한 줄 읽어 들이기 위해서 BufferedReader 클래스 이용
- BufferedReader 클래스가 가지고 있는 readLine() 메소드가 한 줄씩 읽게 해준다.
- readLine()메소드는 읽어낼 때 더 이상 읽어들일 내용이 없을 때 null을 리턴한다.
- 파일에 쓰게하기 위해서 FileWriter 클래스 이용
- 편리하게 출력하기 위해서 PrintWriter 클래스 이용
2) PrinterWriter를 통해 data.txt 파일에 "안녕하세요. PrinterWriter입니다."라고 적어라.
import java.io.*;
public class CharIOExam2{
public static void main(String[]args){
PrintWriter pw = null;
String str = "안녕하세요. PrintWriter입니다.";
try{
pw = new PrintWriter(new FileWriter("data.txt"));
pw.println(str);
}catch(Exception e){
e.printStackTrace();
}finally{
pw.close();
}
}
}
728x90