[2021.02.18.목] TIL

노을·2021년 2월 19일
0

TIL

목록 보기
43/81

정든 학교와 기숙사를 떠났다..
기숙사 짐을 싸고, 본가에서 짐정리를 하느라 저녁시간대에 많은 공부를 하진 못했다.
10시부터 ZOOM으로 공부를 한 것 같은데, 늦게라도 하길 잘한 것 같다.

Try-With-Resource

  • try에 자원 객체를 전달하면, try 코드 블록이 끝나면 자동으로 자원을 종료해주는 기능
  • 괄호()안에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close()를 호출하지 않아도 try를 벗어나는 순간 자동적으로 close()가 호출된다.
  • try-with-resources문에 의해 자동으로 객체의 close()가 호출될 수 있으랴면, 클래스가 AutoCloseable 이라는 인터페이스를 구현한 것이어야 한다.
  • BufferedInputStream, FileInputStream은 이미 AutoCloseable 의 구현체로 추가적으로 인터페이스를 구현할 필요가 없다.
  • InputStream은 AutoCloseable를 상속받은 Closeable을 구현하였습니다.
> file.txt

a
b
c
public static void main(String args[]) {
    try (
        FileInputStream is = new FileInputStream("file.txt");
        BufferedInputStream bis = new BufferedInputStream(is)
    ) {
        int data = -1;
        while ((data = bis.read()) != -1) {
            System.out.print((char) data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

무한루프에 조건문없이 사용했다가, BufferedInputStream가 EOF를 인지를 못해서 지옥을 맛봄..

프레디 덕분에 내부코드를 보면서 문제에 대한 원인을 알 수 있었는데, 문제는 BufferedInputStream은 내부적으로 BufferedInputStream과 FileInputStream에는 따로 EOFException을 내부에서 throw해주지 않아,

아래와 같이 조건을 통해, 임의로 예외처리를 해줘야 한다.

public class TryWithResourceEx1 {
    public static void main(String[] args) {
        try(FileInputStream is = new FileInputStream("file.txt");
            BufferedInputStream bis = new BufferedInputStream(is)
        ){
            int data = -1;
            while(true){
                if((data = bis.read()) == -1) throw new EOFException("파일끝");
                System.out.print((char)data);
            }

        }catch (EOFException e){
            e.printStackTrace();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

🖐 블로그 내용 스크랩 >
DataOutputStream 을 몰라서 스크랩했습니다.

​ FileInputStream과 FileOutputStream내용) 간단히 요약하자면, 파일의 내용을 읽올때 == 스트림을 통해서 파일의 내용에 있는 문자들을 전부 바이트로 읽어들였다. 그래서 컴퓨터는 이를 해석하여, 우리가 읽을 수 있는 문자로 표현했다. 그리고 이 바이트를 읽어 들이는 방법은 여러가지가 있는데, 우리는 한 바이트씩읽기(read)와 텍스트의 한줄씩 읽기 (BufferedInputStream 사용)를 통해서 속도의 차이도 비교했었다.
​ 하지만 텍스트파일의 내용을 조금 더 간편하게 읽어오거나 쓰기가 가능하다.
​ 바로 이번에 소개할 DataInputStream / DataOutputStream이다.
스트림에 바이트 단위로 파일의 내용을 읽어들었다면, 이번에는 자바의 기본 자료형에 맞게 파일의 내용을 집어넣어보자.

​ 이를 통해서 우리는 간편하게 스트림에 바이트로 작성하거나 읽어들일 필요가 없이
​ 자바에서 지원하는 기본 자료형의 크기에 맞게 텍스트들을 넣을 수 있게 된 것이다.

public class TryWithResourceEx1 {
    public static void main(String[] args) {
        StringBuilder readTextInfo = new StringBuilder();
        char a = 'a';
        char b = 'b';
        char c = 'c';


        try(DataOutputStream dos = new DataOutputStream(new FileOutputStream("sample.txt"));
            DataInputStream dis = new DataInputStream(new FileInputStream("sample.txt")))
        {
          //저장할때 데이터타입의 바이트 수만큼 그대로 저장하므로 저장한 순서,타입을 맞춰야 제대로 읽음
            dos.writeChar(a);//a를 char값으로 파일에씀
            dos.writeChar(b);
            dos.writeChar(c);
            dos.close(); // 파일과 객체의 연결을 끊으면서 저장함

            while(true){
                readTextInfo.append(dis.readChar()).append(System.lineSeparator());
            }

        }catch (EOFException e){
            System.out.println(readTextInfo);
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

Review

오늘도 프레디한테 도움을 얻은 하루다...

다름이아니라 자바의 정석 ch8에서 try-catch-resources 파트를 공부하고 있는데

File IO를 활용해, EOF를 일으켜 예외처리를 하는 예제가 재밌어보여 해보았는데 막상 잘 안되서

약간의 삽질을 했다...결국엔 프레디가 직접 기본 내부함수들의 코드를 뜯어보여주면서 알게됐지만

혼자서 알아내지 못했다?라는 생각은 약간 찝찝하게 남아있다.

매번 느끼지만 내부 코드를 보면서 원하는 내용을 이해하는 과정은 나에게도 정말 유익한 학습이 될 것 같으니까 공부해야겠다.

그리고 프레디랑 이야기를 하면서, 깃허브 PR을 할 때, Conversation Resolve는 일반적으로 리뷰어분들이 하시는 경우가 많은 것을 알게 됐다.

리뷰어분께 따로 질문을 드리기는 했지만 아무 말씀이 없으셔서 나는 오히려 내가 해야하는건가? 라는 생각을 했었다..ㅋㅋ

이부분은 그룹의 그라운드 룰 마다 다룰 수 있으므로, 따로 한번 더 물어봐야 할 것 같다.

오늘 드디어 다른 유저의 코드에 대한 코멘트 남기는 법을 배웠다. 다른 사람들 코드를 보면서 나도 코멘트를 남기고 싶었는데 드디어 하는법을 알게 돼 너무 기쁘다. File ChangedCommit Log 에서 리뷰하고 싶은 라인+ 버튼을 누르면 코멘트를 달 수 있다. + 버튼을 누르고 마우스를 쭉 내리면 여러줄을 선택해서 코멘트를 남길 수 있는데 정말 혁신인 것 같다 ㅋㅋ 그리고 이후에 코멘트를 한번에? 몰아서 올리는 기능으로 말씀을 해주셨는데 여기서 Request Response 였나? 건방져 보일 수 있으므로 , 안하는게 좋을 것 같다는 의견을 말씀해주셔서 나는 간단한 comment만 남기면서 떠돌아댕겨야겠다!


오늘의 꿀 플러그인!

  • 🏄‍♂️ surf

  • source graph

깃허브에서 코드리뷰하기에 정말 개꿀이다.
기존에 깃허브는 프로젝트 뷰가 트리형식이 아니어서, 보기가 정말 불편했는데 이점을 플러그인이 잘 보안한 것 같다.
에디터의 퀄리티(VS CODE 랑 동일)는 surf가 앞서지만
IDE처럼 사용된 메소드의 내부 메소드의 위치를 직관적으로 확인할 수 있는 건 source graph이다.
물론, 한 5분 써보고 말하는 리뷰다ㅋㅋ 아직 어떻게 될진 모르겠다 ㅎ.ㅎ


참고

Java - Try-with-resources로 자원 쉽게 해제하기

Java DataInputStream, DataOutputStream

profile
카르페디엠

0개의 댓글