티스토리 뷰

자바에서 bufferedWriter 사용 중 int형 값 1만 있을 때는 출력이 되지 않는다.

  • 알고리즘 문제를 푸는 중 for문 사용하여 bufferedWriter로 i의 값을 출력하는 중에 i의 값이 출력이 되지 않는 현상 발생

문제의 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args){
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        try(BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));) {
            String[] temp = bufferedReader.readLine().split(" ");
            int N = Integer.parseInt(temp[0]);
            int X = Integer.parseInt(temp[1]);
            boolean checkStrat = false;
            String[] sequenceA = bufferedReader.readLine().split(" ");

            for(int i=0; i<N; i++) {
                if(Integer.parseInt(sequenceA[i]) < X && checkStrat == false){
                    bufferedWriter.write(Integer.parseInt(sequenceA[i])); // 문제의 write 부분
                    checkStrat = true;
                } else if(Integer.parseInt(sequenceA[i]) < X){
                    bufferedWriter.write(" " + Integer.parseInt(sequenceA[i]) );
                }
            }
            bufferedWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

원인

  • bufferedWriter.write()의 인자값으로 int형을 넘겨줄 시 메서드를 확인해보았다.
      public void write(int c) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (nextChar >= nChars)
                flushBuffer();
            cb[nextChar++] = (char) c; // 이게 문제고만
        }
    }
  • 내가 넘겨준 int형 값을 char형으로 변환하고 있다.
  • int형을 Character.forDigit()이 아닌 (char)로 변환 시 해당 값은 아스키 코드로 10진->문자 변환이 된다.
  • (char)로 형변환 시에는 아스키코드 1~32까지는 공백문자와 제어문자임으로 값 출력이 안 보이고 33부터는 다른 문자 값이 출력이 된다.
  • https://shaeod.tistory.com/228 오뇽님의 블로그에서 아스키 코드표 참고를 하면 된다.

후기

  • 자바 메서드를 통해 발생한 장애를 직접 메서드의 소스를 살펴보면서 원인을 제대로 분석하긴 처음인 것 같다.
  • 바로 서칭을 하기보다 이런 식으로 메소드를 먼저 이해하는 방법도 재미있었고 앞으로 서칭보다 먼저 메서드를 이해하는 태도를 가져야 겠다.
댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
377
Today
0
Yesterday
0
링크
«   2020/08   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함