[Java] 다양한 타입의 입출력

준우·2022년 4월 27일
0

Java

목록 보기
13/30
post-thumbnail

try-with-resources 블록

java io 객체는 인스턴스를 만들고, 그 인스턴스를 모두 사용하면
close() 메소드를 호출해주어야 한다.

그런데, 사용자가 close() 메소드를 호출하지 않더라도
Exception이 발생하지 않았다면 자동으로 close() 되게 할 수 있는 방법이 있다.
그것은 바로 try-with-resources 블럭을 선언하는 것이다.

try(
                //io객체 선언
        ){
                //io객체 사용
        }catch(Exception ex){
            ex.printStackTrace();
        }

기존의 try-catch문과 비슷한데, 다만 try{}가 아니라 try(){} 형태다.
() 안에는 io 객체를 선언하고, {} 안에는 io객체를 사용하는 코드를 쓴다.

출력

DataOutputStream 클래스

DataOutputStream 객체는 다양한 타입을 저장할 수 있는 객체이다.
이 클래스를 사용하면 OutputStream을 매개변수로 받아들이기때문에
OutputStream의 자손 타입이라면 무엇이든지 받아들일 수 있다.

예시 코드

DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt"));

FileOutputStream()안에는 write할 파일의 경로와 이름을 적어야한다.
만약 경로를 지정하지 않으면 프로젝트 밑에 저장 된다.

DataOutputStream이 다양한 메서드를 제공하고 장식의 역할을 하다는 의미이다.
단순히 장식이기때문에 "어디에 써라(write)" 등과 같은 역할은 할 수 없다.
그래서 "어디에 쓰라"고 지정할 수 있는 클래스를 같이 써야 한다.

write() 메소드

DataOutputStream은 write() 메소드를 다양한 방식으로 오버로딩하고 있다.

  • wirteInt() : 정수값으로 저장 (4byte)
  • wirteBoolean() : boolean값으로 저장 (1byte)
  • writeDouble() : double 값으로 저장 (8byte)

아래는 write() 메소드를 사용한 코드 예시이다.

    import java.io.DataOutputStream;
    import java.io.FileOutputStream;    
    public class ByteExam3 {    
        public static void main(String[] args) {
            try(
                    DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt"));
            ){
                out.writeInt(100);
                out.writeBoolean(true);
                out.writeDouble(50.5);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }   
    }

프로젝트 아래에 data.txt 라는 파일이 생겼고, 파일 내용은 아래 이미지와 같다.
기본적으로 파일은 문자열로 씌여지지만, 이렇게 데이터 타입을 사용한 경우
파일을 읽을 때에도 DataInputStream을 사용해서 읽어내야한다.

그런데 파일의 크기를 보면 13byte이다.
int(4byte) + boolean(1byte) + double(8byte) 값과 일치하는 것을 알 수 있다.

입력

DataInputStream

DataInputStream은 아웃풋 스트림(DataOutputStream) 객체와 마찬가지로 다양한 타입을 읽을 수 있다.
역시 InputStream을 매개변수로 받아들이기때문에
InputStream의 자손 타입은 무엇이든지 받아들일 수 있다.

예시 코드

DataInputStream in = new DataInputStream(new FileInputStream("data.txt"));

FileInputStream()안에는 읽을 대상 파일의 경로와 이름을 적어야한다.
경로를 지정하지 않으면 프로젝트 밑을 기준으로 한다.

read() 메소드

DataInputStream도 마찬가지로 read() 메소드를 다양한 방식으로 오버로딩한다.

  • readInt() : 정수를 읽어들이는 메소드
  • readBoolean() : boolean 값을 읽어들이는 메소드
  • readDouble() : douboe 값을 읽어들이는 메소드

아래는 DataInputStream의 read() 메소드를 사용해
앞서 데이터 타입으로 쓴 data.txt 파일을 읽는 예시 코드이다.

package level2;

import java.io.DataInputStream;
import java.io.FileInputStream;

public class ByteExam4 {
    public static void main(String[] args) {
        try(
                DataInputStream in = new DataInputStream(new FileInputStream("data.txt"));
                ){
            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 e){
            e.printStackTrace();
        }
    }
}

코드 실행 결과 아래와 같이 파일을 읽을 수 있었다.

데이터 타입으로 쓰여진 파일은 해당 데이터 타입으로 읽을 수 있다.
이와 같이 io 클래스들은 다양하게 조합해서 사용할 수 있다.

🙏 Reference

0개의 댓글