Java io와 캐리지리턴


안녕하세요. 항상 좋은 답변 감사합니다! 혼자 공부를 하는데 구글에 찾아도 이해하기 어려울때마다 해시코드를 찾고 있습니다. 정말로 감사합니다.

io를 공부하고 있는데 출력값이 이상해서 여쭤보려고 왔습니다.

package streamEx;

import java.io.IOException;

public class inputStreamTest2 {

    public static void main(String[] args) {
        byte[] input = new byte[5];

        int i = 0;
        int cnt = 0; // count
        int tot = 0; // total
        System.out.println("컨솔창에 입력하여라!");
        try {
            while((i= System.in.read(input)) != -1){ 
                cnt++; // 반복문 횟수
                tot += i;

                System.out.println("i: "+i);
                System.out.write(input, 0, i);

            }    System.out.println("cnt: "+cnt);

            System.out.println("읽은 byte수: "+tot);
            System.in.close();
            System.out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

제가 AppleTest라고 이클립스에 입력을 하면

i: 5
Applei: 5
Test
i: 1

이렇게 출력되나

cmd를 통한 출력을 하게 되면

i: 5
Applei: 5
i: 1t

이렇게 출력됩니다.

제가 생각했을 때는

i: 5
Applei: 5
i: 1
Test

으로 되어야한다고 생각했는데

  1. cmd에선 왜 덮어씌어서 출력이 될까요?
  2. 그리고 이클립스와 cmd의 출력의 차이가 왜 있는 것일까요?

  3. 배열에 대한 메모리구조에 대해 질문있습니다. 소스를 보시면 input이라는 5byte짜리 배열을 선언했는데 제가 "AppleTest"라는 글자를 넣으면 '/r''/n' 까지 포함하여 11byte를 입력한건데 오버플로우가 안되고 왜 전부다 출력이 되는건지 궁금합니다. 설명을 보면 input스트림에

    "_ _ _ _ /n /r t e s T e l p p A "(_는 빈칸입니다.)
    

    입력이 되고, output스트림에는

    " i:5\nApllei:5Test\ri:1\n\n "
    

    로 입력이 된다는데 그럼 input[0] = "Apple", input[1] = "Test\r", input[2] ="\n" 이런식으로 들어간다는 말인가요??

비오는데 감기조심하세요~~~

  • 2016년 05월 06일에 작성됨
    해시코드를 사랑합니다

조회수 286


1 답변


좋아요
1
싫어요
채택취소하기

일단 \r 과 \n 에 대한 차이점을 이해할 필요가 있습니다.

옛날의 타자기에서 줄바꿀때 일어나는 일을 표현한 것입니다.

  • \n (라인피드) 은 줄바꿈이며
  • \r (캐리지리턴) 은 행의 첫줄로 헤드를 옮기는 것입니다.

이게 전자식 타자기로 바뀔 때, 줄바꿈과 행의 첫줄로 옮기는 일이 동시에 일어나도록 수정됩니다.

일단 윈도우즈는 위의 라인피드와 캐리지 리턴을 분리해서 다루고, 유닉스계열은 \n으로 두가지를 동시에 표현합니다.

AppleTest 로 입력하면

input 배열의 크기가 5 임으로,

  • 첫번째 반복에서 "Apple" 이 저장됩니다.
  • 두번째 반복에서는 "Test\r" 이 저장됩니다.
  • 세번째 반복에서는 "\n"이 저장될 겁니다.

위를 순서대로 출력하면

i:5
Apple

이 처음에 출력되고 이어서

i:5
Test\r

이 출력됨으로 합치면

i:5
Applei:5
Test

인데, 이 때 커서는 T의 앞에 위치하게 됩니다. 마지막으로 출력은

i:1
\n

임으로, 최종적으로는

i:5
Applei:5
i:1t

로 커서의 위치에서 i:1을 출력하여 Tes가 덮어씌어지고, \n에 의해 개행하게 됩니다.

이클립스는 아마도 \r와 \n 을 유닉스처럼 동일하게 처리하는 것으로 생각됩니다. (어딘가에 설정을 바꾸면 cmd와 똑같게 할 수도 있을 것 같습니다.)

  • 2016년 05월 06일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close