File IO(Input/Output)

JAVA에서의 파일 입출력은 Stream(데이터의 흐름)을 통해 이루어진다.

Stream은 다음과 같이 나눌 수 있다.

  • 흐름의 방향
    • Input
    • Output
  • Data Type
    • Byte
    • Character

Byte stream

Byte stream의 경우 아래와 같은 Class들을 사용할 수 있다.
Java FileIO
[ Tutorials Point 에서 퍼온 그림 ]

아래 소스는 input.txt8-bit Byte 단위로 data를 읽어서 output.txt 에 복사한다.

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
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileIO {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}

Character stream

Character stream16-bit unicode 단위로 data를 처리한다.

Byte stream과 다른 점은 FileReaderFileWriter를 사용한다는 것이다.

이 두 가지 Class는 내부적으로는 FileInputStreamFileOutputStream을 사용하지만 한 번에 2 byte 씩 처리한다는 것이 차이점이다.

아래 소스는 input.txt16-bit, 2 Byte 단위로 data를 읽어서 output.txt 에 복사한다.

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
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileIO {
public static void main(String[] args) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}

Scanner

위에서 본 것과 같이 입력 파일 처리 시 Byte 또는 Character 단위로 read 하기 때문에 (물론 BufferedReader는 Line 단위로 읽을 수 있지만) Parsing이 상당히 귀찮아진다.

Java 5부터 추가된 Scanner를 사용하면 귀찮은 작업을 건너뛸 수 있다. 변수 및 메소드에 대한 정의는 여기를 참조하자. 다양한 type을 지원하며, 정규표현식 (REGEX-Regular Expression-)도 지원한다.

주의할 점은 Scanner 또한 File을 다루기 때문에 close()를 해줘야 한다는 것과 character type과 관련된 메소드는 제공하지 않는다는 것이다.

아래 코드는 input.txt에서 내용을 읽어서 parsing 후 콘솔로 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class FileIO {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new File("input.txt")); // File 대신 System.in 을 받을 수도 있다.
while (sc.hasNext()) {
System.out.println(sc.next());
}
sc.close();
}
}

추가정보

  • flush() - Buffer의 내용을 출력(흘려보내고)하고 비운다.
  • close() - 메모리가 낭비되지 않도록 close()를 호출해줘야 하고, close()가 호출 될 때 자동으로 flush()가 수행된다.
  • File Class - File Class가 가지는 메소드들에 대해서는 여기를 참조하자.
  • BufferedInputStream - JavaDoc - BufferedInputStream
  • BufferedOutputStream - JavaDoc- BufferedOutputStream
  • BufferedReader - JavaDoc - BufferedReader
  • BufferedWriter - JavaDoc - BufferedWriter

    BufferedReader에는 BufferedInputStream에는 없는 readLine() 메소드가 존재하고 BufferedWriter에는 BufferedOutputStream에는 없는 newLine() 메소드가 존재한다.


출처

아래의 글들을 교재삼아 작성하였습니다.

Share