ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java I/O <3 - FileStream>
    언어/자바 2023. 12. 25. 23:10

     

     

    막연하게만 사용하던 I/O를 조금 더 이해해보고자 작성한 글입니다.
    기본적으로 I/O는 O/S 레벨에서 이루어지고 byte를 다룬다는 것을 생각야해합니다.

     

     


     

    FileOutputStream

    앞에서 다루었던 System클래스 속의 stream들은 콘솔을 기반으로 I/O를 수행했다면,
    이번에 다루는 FileStream들은 파일을 기반으로 I/O를 수행한다.

     

     

    1. 파일 쓰기

     

    - 덮어쓰기

    FileOutputStream 클래스에 전달된 경로에 파일이 없는 경우, 파일이 생성되고, 있는 경우는 해당 경로의 파일을 이용한다.

      public static void main(String[] args) throws IOException {
            FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt");
    
            String text = "It is the first sentence!!";
    
            fileOutputStream.write(text.getBytes());
            fileOutputStream.flush();
            fileOutputStream.close();
    
        }

     

    - 추가하기

    FileOutputStream 클래스의 2번째 인자는 해당 파일을 덮어쓸 것인지, 추가할 것인지 결정하는 인자를 전달하게 되어있다. default로 덮어쓰는 옵션이 설정되어 있다.
    '\n'을 추가해서 문자의 줄을 변경할 수 있다.

      public static void main(String[] args) throws IOException {
            FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt", true);
    
            String text = System.lineSeparator() +  "It is the first sentence!!";
    
            fileOutputStream.write(text.getBytes());
            fileOutputStream.flush();
            fileOutputStream.close();
    
        }

     

     

    2. 파일 읽기

     

    - 파일 내용 콘솔에 보여주기

    read()로 스트림을 읽은 후에 바로 시스템의 output 스트림에 적는 방법을 사용할 수 있다.

       public static void main(String[] args) throws IOException {
            FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt");
    
            String text ="It is the first sentence!!";
    
            fileOutputStream.write(text.getBytes());
            fileOutputStream.flush();
            fileOutputStream.close();
    
            FileInputStream fileInputStream = new FileInputStream("./src/board.txt");
    
            while(fileInputStream.available() > 0) {
                int data = fileInputStream.read();
                System.out.write(data);
            }
    
            System.out.flush();
    
        }

     

    - 다른 파일에 복사하기

    새로운 FileOutputStream을 생성해서, 카피도 가능하다.

    public static void main(String[] args) throws IOException {
             FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt");
    
            String text ="It is the first sentence!!";
    
            fileOutputStream.write(text.getBytes());
            fileOutputStream.flush();
            fileOutputStream.close();
    
            FileInputStream fileInputStream = new FileInputStream("./src/board.txt");
            FileOutputStream copyOutputStream = new FileOutputStream("./src/copy.txt");
    
            while(fileInputStream.available() > 0) {
                int data = fileInputStream.read();
                copyOutputStream.write(data);
            }
    
            copyOutputStream.flush();
            copyOutputStream.close();
    
        }

     

     


     

    read메소드가 int 타입을 반환하는 이유

     

    1. EOF(End of File)을 처리해야한다.

    • FileInputStream의 read함수는 읽어올 데이터가 있는 경우 int로 캐스팅된 1byte를 반환하고, 읽어올 데이터가 없는 경우 int -1을 반환한다.
    • 1을 8bit 2진수로 표현할 경우, 11111111인데, 실제로 read하는 데이터가 11111111이라면 둘을 구분할 수 있는 방법이 없다.

     

    2. 성능 개선

    • JVM은 32bit를 기준으로 연산을 할 때 가장빠르게 설계가 되어있기 때문에, int를 사용한다면 기존의 byte를 데이터 손실 없이 사용할 수 있고 연산도 더 빠르게 할 수 있다.

     

     

    '언어 > 자바' 카테고리의 다른 글

    Java I/O <5 - Buffered Stream>  (0) 2023.12.25
    Java I/O <4 - Network Stream>  (1) 2023.12.25
    Java I/O <2 - InputStream>  (0) 2023.12.23
    Java I/O <1 - OutputStream>  (0) 2023.12.23
    너무 다양한 List를 만드는 방법들..  (1) 2023.12.20
Designed by Tistory.