import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ExecMain {
public static void main(String[] args) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(".//Hello Polytech.rtf");
out = new FileOutputStream(".//Hello Polytech2.rtf");
System.out.println("실행1");
while(true) {
int data = in.read();
System.out.println("실행2");
if (data == -1) {
System.out.println("실행3");
break;
}
out.write(data);
System.out.println("실행4");
}
} catch (Exception e) {
System.out.println("실행5");
} finally { // try ~ catch 구문 뒤에 붙어 '작동을 보장해야 하는 로직'을 넣는다.
if (in != null) {
in.close();
}
if (out != null ) {
out.close();
}
System.out.println("실행6");
}
}
}
이렇게 하고 실행하면 어떤 순서로 실행 되는지를 확인할 수 있다.
Hello Polytech라는 파일에
H
라는 문자가 하나 있는 경우
결과 :
실행1
실행2
실행4
실행2
실행3
실행6
동일 디렉토리에 "H"이라는 문자 하나를 저장한 Hello Polytech2.txt 생성
Hello Polytech라는 파일에
He
라는 문자 2개가 있는 경우
결과 :
실행1
실행2
실행4
실행2
실행4
실행2
실행3
실행6
동일 디렉토리에 "H"이라는 문자 하나를 저장한 Hello Polytech2.txt 생성
while문만 보자.
"H" 문자 하나만 저장된 경우
2 > 4 > 2 > 3
"He" 문자 2개가 저장된 경우
2 > 4 > 2 > 4 > 2 > 3
"Hello Polytech" 공백 포함 문자 14개가 저장된 경우
2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 4 > 2 > 3
2 > 4 가 14번 반복된 후 2 > 3 을 타고 종료된다.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ExecMain {
public static void main(String[] args) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(".//Hello Polytech.txt");
out = new FileOutputStream(".//Hello Polytech2.txt");
System.out.println("실행1");
while(true) {
int data = in.read();
System.out.println("실행2 : " + data);
if (data == -1) {
System.out.println("실행3");
break;
}
out.write(data);
System.out.println("실행4");
}
} catch (Exception e) {
System.out.println("실행5");
} finally { // try ~ catch 구문 뒤에 붙어 '작동을 보장해야 하는 로직'을 넣는다.
if (in != null) {
in.close();
}
if (out != null ) {
out.close();
}
System.out.println("실행6");
}
}
}
결과 :
실행1
실행2 : 72 -> H
실행4
실행2 : 101 -> e
실행4
실행2 : 108 -> l
실행4
실행2 : 108 -> l
실행4
실행2 : 111 -> o
실행4
실행2 : 32 -> " "
실행4
실행2 : 80 -> P
실행4
실행2 : 111 -> o
실행4
실행2 : 108 -> l
실행4
실행2 : 121 -> y
실행4
실행2 : 116 -> t
실행4
실행2 : 101 -> e
실행4
실행2 : 99 -> c
실행4
실행2 : 104 -> h
실행4
실행2 : -1
실행3
실행6
data를 찍어보면 저렇게 문자별로 매칭이 된다. 문자를 읽기 못 할 경우 -1 False로 반환한다. 따라서 문자열 3개만 반환하겠다고 0 1 2 생각해서 2를 넣거나 하면 안 된다. '108'을 넣어 'l'이 나오면 멈추게 하는 것은 가능하지만... 그냥 -1 False일 경우 멈추는 형태의 공식으로만 이용하는 것이 좋다.
cf.
리치 텍스트 문자 같은 서식이 있는 문서는 텍스트 편집기로 열었을 때는 문자가 보이지 않지만 실제로는 서식을 정의하는 텍스트가 포함되어 있기 때문에 문자 1개만 들어있는 파일이라도 해당 서식을 정의하는 텍스트 문자열까지 인식해서 복사하기 때문에 많은 실행을 하게 된다.(html에서 실제로는 font-size : 12px 이런게 있어도 웹 페이지에는 보이지 않는 것과 마찬가지)
'개발자 > Java' 카테고리의 다른 글
Java (자바) HomeController의 locale, model, model.addAttribute() (0) | 2020.06.05 |
---|---|
Java (자바) HorseGame 말 달리기 (0) | 2020.05.30 |
Java (자바) 파일 경로, 디렉토리 (0) | 2020.05.30 |
Java (자바) ArrayList 정렬하기 (Comparator 이용) (0) | 2020.05.25 |
Java (자바) JCF(Java Collection Framework) - List, Set, Map (0) | 2020.05.24 |