Transcript 12장

12장. 입출력
public class SumTest {
public static void main(String a1[])
{
int a, b, sum;
a = Integer.parseInt(a1[0]);
b = Integer.parseInt(a1[1]);
sum = a + b ; // 두 수를 더하는 부분입니다
System.out.println("두수의 합은 " + sum + "입니다");
}
}
1
학습목표
자바 시스템에서의 입출력 개요를 학습한다.
파일, 디렉터리와 연관된 클래스를 학습한다.
문자 스트림과 바이트 스트림 개요에 관해 학습한다.
문자 스트림 관련 클래스에 관해 학습한다. 문자 스트림을 통하여 파일에 입출력
하는 방법을 학습한다.
바이트 스트림 관련 클래스에 관해 학습한다. 바이트 스트림을 통하여 파일에 입
출력하는 방법과 객체를 입출력하는 방법에 관해 학습한다.
2
 목차
 section 1 java.io 패키지 개요
 section 2 파일과 디렉터리
 section 3 문자(Chraracter) 스트림과 바이트(Byte) 스트림
 section 4 문자 스트림
-
4-1 Writer 클래스와 Reader 클래스
-
4-2 FileWriter 클래스와 FileReader 클래스
 section 5 바이트 스트림
-
5-1 OutputStream 클래스와 InputStream 클래스
-
5-2 FileOutputStream 클래스와 FileInputStream 클래스
-
5-3 DataOutputStream 클래스와 DataInputStream 클래스
-
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
3
1 java.io 패키지 개요
 입출력 기능
-
프로그램에서 사용된 데이터를 영구적으로 저장하여 후에 다른 프로그램에서 사용하게 하
기 위해 필요한 기능
-
프로그램에서 생성된 데이터를 파일 형태로 컴퓨터의 하드디스크나 보조 기억장치에 저장
한 다음 다른 프로그램에서 이 데이터를 읽어 사용하는 기능
 스트림
-
12장. 입출력
순서가 있는 일련의 데이터를 의미하는 추상적인 개념
4
1 java.io 패키지 개요
 스트림을 통한 입출력의 예
395 page
12장. 입출력
5
1 java.io 패키지 개요
 java.io 패키지의 클래스 계층 구조
396 page
12장. 입출력
6
2 파일과 디렉터리
 File 클래스
-
자바는 입출력을 위해 필요한 파일과 디렉터리를 다루기 위해 File 클래스를 제공
 File 클래스의 생성자
형식
File(String directoryPath)
File(String directoryPath, String filename)
File(File dirObj, String filename)
File f1 = new File("/");
File f2 = new File("/", "autoexec.bat");
File f3 = new File(f1, "autoexec.bat");
12장. 입출력
파일의 경로만 가진 객체
경로명과 파일 이름을 가진 객체
경로명을 가진 File 객체와 파일 이름을 가진 객체
7
2 파일과 디렉터리
 File 클래스의 주요 메소드
메소드
설명
boolean()
파일이 읽기 가능하면 true, 아니면 false를 반환
boolean canWrite()
파일이 쓰기 가능하면 true, 아니면 false를 반환
boolean delete()
boolean equals(Object obj)
파일을 삭제하고 true를 반환, 파일을 삭제할 수 없으면 false를
반환
현재의 객체와 obj로 지정된 객체가 같은 파일을 가지고 있
으면 true, 아니면 false를 반환
String getAbsolutePath()
파일에 대한 절대 경로를 반환
String getCanonicalPath()
파일에 대한 정규 경로를 반환
String getParent()
부모 디렉터리 이름을 반환
String getName()
파일의 이름을 반환
String getPath()
파일의 경로를 반환
boolean isAbsolute()
경로가 절대 경로이면 true, 아니면 false를 반환
boolean isDirectory()
현재의 객체가 디렉터리이면 true, 아니면 false를 반환
12장. 입출력
8
2 파일과 디렉터리
 File 클래스의 주요 메소드
메소드
설명
boolean isFile()
현재의 객체가 파일이면 true, 아니면 false를 반환
long lastModified()
1970년 1월 1일(GMT)부터 파일이 마지막으로 수정된 날짜까지
의 시간을 밀리초로 반환
long length()
파일의 바이트 수를 반환
String[] list()
지정된 디렉터리에 있는 파일과 디렉터리를 문자열 배열로 반환
boolean mkdir()
boolean mkdirs()
boolean renameTo(File newName)
12장. 입출력
디렉터리를 생성. 경로로 지정된 모든 부모 디렉터리가 존재하여
야 한다. 지정한 디렉터리가 생성되면 true를 반환하고, 아니면
false를 반환
디렉터리를 생성. 경로로 지정된 디렉터리가 존재하지 않으면 생
성한 다음 지정한 디렉터리를 생성. 디렉터리가 생성되면 true를
아니면 false를 반환
파일이나 디렉터리의 이름을 newName으로 변경한 다음 true
를 반환. 이름을 변경하지 못하면 false를 반환
9
2 파일과 디렉터리
 실습예제
FileDirTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
12장. 입출력
import java.io.File;
public class FileDirTest1 {
public static void main(String args[]) {
String directory = "C:/Windows";
“C:/Windows”를 경로로 File 객체 생성
File f1 = new File(directory);
if (f1.isDirectory()) {
System.out.println("검색 디렉터리 " + directory);
System.out.println("=============================");
String s[] = f1.list();
디렉터리에 있는 모든 요소를 문자열 배열로 생성
for (int i=0; i < s.length; i++) {
File f = new File(directory + "/" + s[i]);
각 요소를 File 객체로 생성
if (f.isDirectory())
디렉터리인지, 파일인지를 판별
System.out.println(s[i] + " : 디렉터리");
else
System.out.println(s[i] + " : 파일");
}
}
10
2 파일과 디렉터리
 실습예제
FileDirTest1.java
18
19
20
21
22
else
System.out.println
("지정한 " + directory + " 는 디렉터리가 아님");
}
}
 프로그램 설명
-
05
: “C:/Windows” 디렉터리를 가지고 File 객체를 생성한다.
-
09
: list() 메소드는 현재 File 객체가 가지고 있는 디렉터리의 모든 요소(디렉터리 또는 파일)
들을 String 객체의 배열로 반환하는 메소드이다.
-
11
: “C:/Windows” 디렉터리에 있는 각 요소들을 가지고 File 객체를 생성한다.
-
12
: 각 요소에 대해 디렉터리인지를 검사하여 출력한다.
12장. 입출력
11
2 파일과 디렉터리
12장. 입출력
12
2 파일과 디렉터리
 실습예제
FileDirTest2.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
12장. 입출력
import java.io.File;
public class FileDirTest2 {
public static void main(String args[]) {
File f1 = new File("C:/log.txt");
“C:/log.txt”로 File 객체 생성
System.out.println("파일 이름 : " + f1.getName());
파일의 이름을 출력
System.out.println("파일 경로 : " + f1.getPath());
System.out.println("절대 경로 : " + f1.getAbsolutePath());
System.out.println(f1.exists() ? "파일 존재" : "파일 없음");
System.out.println(f1.canWrite() ? "수정가능" : "수정 불가능");
System.out.println(f1.canRead() ? "읽기가능" : "읽기 불가능");
System.out.println(f1.isDirectory() ? "디렉터리" : "디렉터리아님");
System.out.println(f1.isFile() ? "파일" : "파일 아님");
System.out.println(f1.isAbsolute() ? "절대 경로" : "상대 경로");
System.out.println
("1970년 1월 1일부터 파일이 마지막 수정된 날짜까지의 밀리초 : " +
f1.lastModifed());
System.out.println("파일의 크기 : " + f1.length() + " Bytes");
}
}
13
2 파일과 디렉터리
 프로그램 설명
-
04
: “C:/log.txt”로 File 객체를 생성하였다.
-
05~17
: File 클래스의 다양한 메소드를 사용하고 있다. lastModified() 메소드는 파일이 마지
막으로 수정된 날짜를 밀리초로 반환한다. 반환된 밀리초는 1970년 1월 1일부터 파일이 마지막
으로 수정된 날짜까지의 밀리초이다.
12장. 입출력
14
3 문자(Chraracter) 스트림과 바이트(Byte) 스트림
 문자 스트림
-
16비트 문자나 문자열들을 읽고 쓰기 위한 스트림
-
입출력을 위해서는 Reader, Writer 클래스와 그 하위 클래스를 이용
 바이트 스트림(또는 바이너리 스트림)
-
8비트의 바이트를 읽고 쓰기 위한 스트림
-
입출력을 위해서는 InputStream, OutputStream 클래스와 그 하위 클래스를 이용
12장. 입출력
15
4 문자 스트림
 문자 스트림과 연관된 클래스
403 page
12장. 입출력
16
4 문자 스트림
4-1
Writer 클래스와 Reader 클래스
 Writer 클래스
-
문자 스트림의 출력 기능을 제공
 Reader 클래스
-
12장. 입출력
문자 스트림의 입력 기능을 제공
17
4 문자 스트림
4-1
Writer 클래스와 Reader 클래스
 Writer 클래스의 주요 메소드
메소드
설명
void close( )
출력 스트림을 닫는다.
void flush( )
출력 버퍼에 저장된 모든 데이터를 출력 장치로 전송
void write(int c)
c의 하위 16비트를 스트림으로 출력
void write(char buffer[ ])
buffer 배열에 있는 문자들을 스트림으로 출력
void write(char buffer[ ], int index, int size)
buffer 배열의 index 위치부터 size 크기만큼의 문자들을 스트림으
로 출력
void write(String s)
문자열 s를 스트림으로 출력
void write(String s, int index, int size)
문자열의 index 위치부터 size 크기만큼의 문자들을 스트림으로 출
력
12장. 입출력
18
4 문자 스트림
4-1
Writer 클래스와 Reader 클래스
 Reader 클래스의 주요 메소드
메소드
void close( )
int read( )
int read(char buffer[ ])
int read(char buffer[ ], int offset, int numChars)
설명
입력 스트림을 닫는다.
다음 문자를 읽어 반환한다. 입력 스트림에 읽을 문자가 없으면 대
기한다. 읽은 문자가 파일의 끝이면 -1을 반환
입력 스트림으로부터 buffer 배열 크기만큼의 문자를 읽어
buffer에 저장
입력 스트림으로부터 numChars에 지정한 만큼의 문자를 읽어
buffer의 offset 위치에 저장하고 읽은 문자의 개수를 반환
void mark(int numChars)
입력 스트림의 현재의 위치에 mark 한다.
boolean markSupported( )
현재의 입력 스트림이 mark()와 reset()을 지원하면 true를 반환
boolean ready( )
void reset( )
int skip(long numChars)
12장. 입출력
다음 read()문을 수행할 수 있으면 true, 입력 스트림이 없어 기다려
야 되는 경우에는 false를 반환
입력 스트림의 입력 시작 부분을 현재의 위치에서 가장 가까운 이
전의 mark 위치로 설정
numChars로 지정된 문자 수만큼을 스킵하고 스킵된 문자의
수를 반환
19
4 문자 스트림
4-1
Writer 클래스와 Reader 클래스
 [예외를 호출한 메소드로 넘겨주는 방법]
public static void main(String args[]) throws IOException {
..........
FileWriter fw = new FileWriter(args[0]);
............
fw.write("Line " + i + "\n");
...........
fw.close();
}
12장. 입출력
호출한 메소드에
예외를 넘김
20
4 문자 스트림
4-1
Writer 클래스와 Reader 클래스
 [예외를 메소드 내에서 처리하는 방법]
public static void main(String args[]) {
............
try {
FileWriter fw = new FileWriter(args[0]);
............
fw.write("Line " + i + "\n");
...........
fw.close();
}
catch(IOException e) {
System.our.println("Exception: " + e);
}
..........
}
12장. 입출력
예외 발생 가능 영역 지정
예외 처리 루틴 작성
21
4 문자 스트림
4-2
FileWriter 클래스와 FileReader 클래스
 FileWriter 클래스
-
OutputStreamWriter 클래스로부터 상속된 클래스
 FileWriter 클래스의 생성자
형식
FileWriter(String filepath) throws IOException
FileWriter(String filepath, boolean append) throws IOException
FileWriter(File fileObj) throws IOException
 FileReader 클래스의 생성자
형식
12장. 입출력
FileReader(String filepath)
FileReader(File fileObj)
22
4 문자 스트림
4-2
FileWriter 클래스와 FileReader 클래스
 FileWriter 클래스와 FileReader 클래스의 역할
406 page
12장. 입출력
23
4 문자 스트림
4-2
FileWriter 클래스와 FileReader 클래스
 실습예제
FileWriterTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
12장. 입출력
import java.io.*;
public class FileWriterTest {
public static void main(String args[]) throws Exception
예외를 처리
String source = "비어있어야 비로서 가득해 지는 사랑\n" +
" 영원히 사랑한다는 것은\n" +
" 평온한 마음으로 아침을 맞는다는 것입니다.\n";
char input[] = new char[source.length()];
출력할 문자열 길이만큼의 문자 배열 생성
문자열을 문자 배열로 변환
source.getChars(0, source.length(),
input, 0);
FileWriter fw = new FileWriter(args[0]);
FileWriter 객체 생성
fw.write(input);
객체를 통해 문자 배열 내용 출력
fw.close();
파일을 닫는다.
}
}
24
4 문자 스트림
4-2
FileWriter 클래스와 FileReader 클래스
 프로그램 설명
-
03
: throws 절을 이용하여 예외를 처리하였다. 파일을 생성하고 입출력을 수행하기 위해서는
반드시 예외를 처리해 주어야 한다. 예를 들어 출력할 파일을 생성할 수 없다거나, 입력할 파일
이 존재하지 않는 경우를 대비하기 위해서이다.
-
07
: 출력할 문자열 source 크기에 해당하는 문자 배열 input을 생성하였다.
-
08
: getChars() 메소드는 String 클래스에 선언된 메소드이다. 문자열을 문자 배열로 변환하
는 메소드이다.
-
10
: FileWriter 객체를 생성하고 있다. 매개변수로 받은 파일 이름으로 파일을 생성한다.
-
11
: 파일에 input 문자 배열을 출력하고 있다. write() 메소드는 오버로딩되어 사용된다. 문자
열 source를 직접 write() 메소드를 이용하여 출력할 수도 있다. 즉 5,6번 문장을 삭제하고
fw.write(source)를 이용하여 문자열을 직접 출력할 수 있다.
-
12장. 입출력
12
: 파일을 닫는다. 즉 출력 스트림을 닫는다.
25
4 문자 스트림
4-2
FileWriter 클래스와 FileReader 클래스
 실습예제
FileReaderTest.java
01
02
03
04
05
06
07
08
09
10
11
12장. 입출력
import java.io.*;
class FileReaderTest {
public static void main(String args[]) throws Exception {
FileReader fr = new FileReader(args[0]);
FileReader 객체를 생성
int i;
파일로부터 하나의 문자를 읽는다
while((i = fr.read()) != -1 ) {
System.out.print((char)i);
문자로 형변환하여 출력
}
fr.close();
}
}
26
4 문자 스트림
4-2
FileWriter 클래스와 FileReader 클래스
 프로그램 설명
-
04
: FileReader 클래스로부터 객체를 생성한다. 실행 시 매개변수로 지정된 파일로 객체를 생
성한다. 만일 그 파일이 없으면 예외가 발생한다.
-
06
: 하나의 문자를 읽어 int형의 변수 i에 저장한다. 자바는 배정 연산(=)을 포함한 모든 연산
을 int형으로 수행하므로 int형에 저장하여야 한다.
-
07
: i 변숫값은 int형이므로 그대로 출력하면 연속된 숫자가 출력되게 된다. int형의 변숫값을
char형으로 형변환하여 출력하여야 한다.
12장. 입출력
27
5 바이트 스트림
 바이트 스트림과 연관된 클래스
410 page
12장. 입출력
28
5 바이트 스트림
5-1 OutputStream 클래스와 InputStream 클래스
 OutputStream 클래스
-
바이트 스트림을 출력하는 메소드들을 제공
 InputStream 클래스
-
12장. 입출력
입력으로(키보드, 파일 등)부터 데이터를 읽어오는 메소드를 제공
29
5 바이트 스트림
5-1 OutputStream 클래스와 InputStream 클래스
 OutputStream 클래스의 주요 메소드
메소드
설명
void close() throws IOException
출력 스트림을 닫는다.
void flush() throws IOException
버퍼에 남아 있는 출력 스트림을 모두 출력
void write(int i) throws IOException
정수 i의 하위 8비트를 출력
void write(byte buffer[]) throws IOException
buffer의 내용을 출력
void write(byte buffer[], int index, int size)
throws IOException
buffer의 index위치부터 size만큼의 바이트를 출력
12장. 입출력
30
5 바이트 스트림
5-1 OutputStream 클래스와 InputStream 클래스
 InputStream 클래스의 주요 메소드
메소드
설명
int available()
현재 읽기 가능한 바이트의 수를 반환
void close()
입력 스트림을 닫는다.
int read()
int read(byte buffer[])
int read(byte buffer[], int offset,
int numBytes)
int skip(long numBytes)
입력 스트림으로부터 한 바이트를 읽어 int 값으로 반환한다. 더 이상
읽을 값이 없을 경우 -1을 반환
입력 스트림으로부터 buffer[] 크기만큼을 읽어 buffer 배열에 저장하
고 읽은 바이트 수를 반환
입력 스트림으로부터 numBytes만큼을 읽어 buffer[]의 offset 위치에
저장하고 읽은 바이트 수를 반환
numBytes로 지정된 바이트를 스킵(skip)하고 스킵된 바이트 수를 반
환
void mark(int numBytes)
입력 스트림의 현재의 위치에 mark 한다.
boolean markSupported()
현재의 입력 스트림이 mark()와 reset()을 지원하면 true를 반환
void reset()
입력 스트림의 입력 시작 부분을 현재의 위치에서 가장 가까운 이전
의 mark 위치로 설정
12장. 입출력
31
5 바이트 스트림
5-2 FileOutputStream 클래스와 FileInputStream 클래스
 FileOutputStream 클래스
-
OutputStream 클래스로부터 상속된 클래스
-
파일에 바이트 스트림을 출력할 수 있는 기능을 제공
 FileOutputStream 클래스 생성자
형식
12장. 입출력
FileOutputStream(String filepath) throws IOException
FileOutputStream(String filepath, boolean append) throws IOException
FileOutputStream(File fileObj) throws IOException
32
5 바이트 스트림
5-2 FileOutputStream 클래스와 FileInputStream 클래스
 FileInputStream 클래스
-
InputStream 클래스로부터 상속된 클래스
-
파일로부터 입력을 받을 수 있는 기능을 제공
 FileInputStream 클래스 생성자
형식
12장. 입출력
FileInputStream(String filepath) throws FileNotFoundException
FileInputStream(File fileObj) throws FileNotFoundException
33
5 바이트 스트림
5-2 FileOutputStream 클래스와 FileInputStream 클래스
 FileOutputStream 클래스와 FileInputStream 클래스의 역할
412 page
12장. 입출력
34
5 바이트 스트림
5-2 FileOutputStream 클래스와 FileInputStream 클래스
 실습예제
FileOutputStreamTest.java
01
02
03
04
05
06
07
08
09
10
11
12
12장. 입출력
import java.io.*;
public class FileOutputStreamTest {
public static void main(String args[]) throws IOException {
FileOutputStream fos = new FileOutputStream(args[0]);
for(int i = 1; i <= 5 ; i++) {
fos.write(i);
int i의 하위 8비트만 출력
}
fos.close();
System.out.println
("지정한 화일명으로 ByteStreamFile을 생성하였습니다.");
}
}
FileOutputStream 객체 생성
35
5 바이트 스트림
5-2 FileOutputStream 클래스와 FileInputStream 클래스
 프로그램 설명
-
05
: 실행 시 매개변수로 받은 파일 이름으로 FileOutputStream 객체를 생성하였다.
-
06
: 반복문에서 1~5 사이의 숫자를 write() 메소드를 통해 출력하고 있다. 이 경우 int형의 하
위 8비트만 출력된다. 프로그램을 수정하여 1부터 300까지를 반복하여 출력해보면 그 결과를
알 수 있다.
12장. 입출력
36
5 바이트 스트림
5-2 FileOutputStream 클래스와 FileInputStream 클래스
 실습예제
FileInputStreamTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
12장. 입출력
import java.io.*;
class FileInputStreamTest {
public static void main(String args[]) throws IOException {
FileInputStream fs = new FileInputStream(args[0]);
FileInputStream 객체를 생성
int i;
한 바이트를 읽는다.
while((i = fs.read()) != -1) {
System.out.println(i);
}
fs.close();
System.out.println
("지정한 파일로부터 바이트 스트림을 입력받아 화면에 출력하였습니다.") ;
}
}
37
5 바이트 스트림
5-2 FileOutputStream 클래스와 FileInputStream 클래스
 프로그램 설명
-
00
: 실행 시 매개변수로 받은 파일 이름으로 FileInputStream 객체를 생성한다.
-
00
: 파일로부터 한 바이트를 읽어들여 int형의 변수에 저장한다.
-
00
: int형 변수의 값을 출력한다. 앞의 FileOutputStreamTest.java 프로그램을 수정하여
1~260까지를 저장한 다음 위의 프로그램을 수행시켜보면, 1부터 255까지 출력되고
0, 1, 2, 3, 4 까지 출력됨을 볼 수 있다. 8비트 단위의 입출력이고 입출력된 내용이 int형에 저장
되었기 때문에 28-1=255까지 출력됨을 볼 수 있다. 일반적인 byte 단위의 수 표현에서는 가장
왼쪽 비트를 부호비트로 취급하므로 27-1=127 까지만 표현이 가능하다.
12장. 입출력
38
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 DataOutputStream 클래스
-
FilterOutputStream 클래스로부터 상속되었고 DataOutput 인터페이스를 사용하여 구현된
클래스
-
자바의 기본 자료형 데이터를 바이트 스트림으로 출력하는 기능을 제공
 DataOutputStream 클래스 생성자
형식
DataOutputStream(OutputStream outputStream)
12장. 입출력
39
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 DataOutputStream 클래스에 구현된 DataOutput 인터페이스의 메소드
메소드
설명
void write(int i) throws IOException
i를 스트림으로 출력
void write(byte buffer[]) throws IOException
buffer를 스트림으로 출력
void write(byte buffer[], int index, int size) throws IOException
buffer의 index 위치부터 size만큼의 바이트를 스트림으로 출력
void writeByte(int i) throws IOException
i의 하위 8비트를 스트림으로 출력
void writeBytes(String s) throws IOException
문자열 s를 스트림으로 출력
void writeChar(int I) throws IOException
i의 하위 16비트를 스트림으로 출력
void writeChars(String s) throws IOException
문자열 s를 스트림으로 출력
void writeDouble(double d) throws IOException
d를 스트림으로 출력
void writeFloat(float f) throws IOException
f를 스트림으로 출력
void writeInt(int I) throws IOException
i를 스트림으로 출력
void writeLong(long l) throws IOException
l을 스트림으로 출력
void writeShort(short s) throws IOException
s를 스트림으로 출력
void writeUTF(String s) throws IOException
s를 스트림으로 출력. 유니코드를 UTF-8 엔코딩을 이용하여 변환
12장. 입출력
40
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 DataOutputStream 클래스와 DataInputStream 클래스의 역할
417 page
12장. 입출력
41
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 DataInputStream 클래스
-
FilterInputStream 클래스로부터 상속되고 DataInput 인터페이스를 사용하여 구현된 클래스
-
바이트 스트림으로부터 자바의 기본 자료형 데이터를 읽는 기능을 제공
 DataInputStream 클래스 생성자
형식
DataInputStream(InputStream inputStream)
12장. 입출력
42
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 DataInputStream 클래스에 구현된 DataInput 인터페이스의 메소드
메소드
설명
boolean readBoolean(boolean b) throws IOException
스트림으로부터 읽은 boolean을 반환
byte readByte( ) throws IOException
스트림으로부터 읽은 byte를 반환
char readChar( ) throws IOException
스트림으로부터 읽은 char를 반환
double readDouble( ) throws IOException
스트림으로부터 읽은 double을 반환
float readFloat( ) throws IOException
스트림으로부터 읽은 float를 반환
long readLong( ) throws IOException
스트림으로부터 읽은 long을 반환
short readShort( ) throws IOException
스트림으로부터 읽은 short를 반환
int readInt( ) throws IOException
스트림으로부터 읽은 int를 반환
void readFully(byte buffer[ ]) throws IOException
스트림으로부터 buffer 크기만큼의 바이트를 읽어 buffer 배열에 저장
void readfully(byte buffer[ ] int index, int size) throws IOExcepti
on
스트림으로부터 size만큼의 바이트를 읽어 buffer의 index 위치에 저장
int readUnsignedByte( ) throws IOException
스트림으로부터 읽은 unsigned byte를 반환
int readUnsignedShort( ) throws IOException
스트림으로부터 읽은 unsigned short를 반환
int skipBytes(int n)
입력 스트림으로부터 n 바이트를 스킵
12장. 입출력
43
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 실습예제
DataOutputStreamTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
12장. 입출력
import java.io.*;
public class DataOutputStreamTest {
public static void main(String args[]) throws IOException {
FileOutputStream fos =
파일에 출력하기 위한 객체 생성
new FileOutputStream(args[0]);
DataOutputStream dos =
데이터를 파일에 출력하기 위한 객체 생성(파일객체와 연계)
new DataOutputStream(fos);
dos.writeBoolean(false);
dos.writeByte(Byte.MAX_VALUE);
Byte 클래스에 선언된 상수 MAX_VALUE 사용
dos.writeChar('김');
문자를 출력하는 writeChar() 메소드 수행
dos.writeDouble(Double.MAX_VALUE);
dos.writeFloat(Float.MIN_VALUE);
dos.writeInt(Integer.MAX_VALUE);
dos.writeLong(Long.MAX_VALUE);
dos.writeShort(Short.MAX_VALUE);
fos.close();
}
}
44
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 프로그램 설명
-
04
: 파일에 출력하기 위해 매개변수로 지정된 값을 가지고 FileOutputStream 객체를 생성하
였다.
-
05
: 파일에 자바의 기본 자료형 데이터를 출력하기 위해 DataOutputStream 객체를 생성하
는데, 앞에서 생성된 파일 객체를 이용해서 생성한다. 이렇게 생성된 객체는 자바의 기본 자료
형 데이터를 파일에 출력할 수 있는 특성을 가지게 된다.
-
07~13
: 기본 자료형 클래스에는 MAX_VALUE와 MIN_VALUE라는 상숫값을 가지고 있기 때
문에 프로그램에서 자유롭게 사용이 가능하다.
 실행결과
-
위 프로그램은 아무런 결과를 출력하지 않고, 파일만 생성한다. 파일의 내용은 바이트 단위
로 저장되므로 파일의 내용을 볼 수 없다.
12장. 입출력
45
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 실습예제
DataInputStreamTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
12장. 입출력
import java.io.*;
class DataInputStreamTest {
public static void main(String args[]) throws IOException {
FileInputStream fs =
파일 입력을 위한 객체 생성
new FileInputStream(args[0]);
DataInputStream dis = new DataInputStream(fs);
기본 자료형 입력 객체 생성(파일과 연계)
System.out.println(dis.readBoolean());
System.out.println(dis.readByte());
System.out.println(dis.readChar());
기본 자료형 데이터를 읽는다.
System.out.println(dis.readDouble());
System.out.println(dis.readFloat());
System.out.println(dis.readInt());
System.out.println(dis.readLong());
System.out.println(dis.readShort());
fs.close();
}
}
46
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
 프로그램 설명
-
04
: 파일로부터 입력받기 위해 매개변수로 지정된 값을 가지고 FileInputStream 객체를 생성
하였다.
-
05
: 파일로부터 자바의 기본 자료형 데이터를 입력받기 위해 DataInputStream 객체를 생성
하는데, 앞에서 생성된 파일 객체를 이용해서 생성한다. 이렇게 생성된 객체는 자바의 기본 자
료형 데이터를 파일로부터 입력할 수 있는 특성을 가지게 된다.
-
07~14
: 기본 자료형 데이터를 읽어들인다. 출력한 순서대로 입력하여야 정확한 데이터를 얻
을 수 있다. 만일 순서가 틀리게 되면 예상치 않은 데이터가 출력되게 된다.
12장. 입출력
47
5 바이트 스트림
5-3 DataOutputStream 클래스와 DataInputStream 클래스
12장. 입출력
48
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 직렬화된 데이터
-
객체를 순차적인 바이트로 표현한 데이터를 의미
 영속성
-
객체가 자신의 상태를 기록해 두어 다음 기회에 또는 다른 환경에서 재생될 수 있는 능력을
의미
12장. 입출력
49
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 Serializable 인터페이스를 포함하는 클래스
형식
class Box implements Serializable {
int w;
int h;
int d;
}
12장. 입출력
Serializable 인터페이스를 포함
50
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 ObjectOutputStream 클래스 생성자
형식
12장. 입출력
ObjectOutputStream(OutputStream outputStream)
51
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 ObjectOutputStream 클래스의 주요 메소드
메소드
void close( )
void flush( )
void write(byte[ ] b, int index, int size)
void write(byte[ ] b)
void write(int ontbyte)
void writeBoolean(boolean data)
void writeByte(int data)
void writeBytes(String str)
void writeChar(int data)
void writeChars(String str)
void writeDouble(double data)
void writeFloat(float data)
void writeInt(int data)
void writeLong(long data)
void writeObject(Object obj)
void writeShort(int data)
void writeUTF(String data)
12장. 입출력
설명
스트림을 닫는다.
버퍼의 모든 내용을 출력한다.
바이트 배열 b의 index 위치부터 size만큼을 출력한다.
바이트 배열 b를 출력한다.
int 값의 하위 한 바이트를 출력한다.
boolean 값을 출력한다.
한 바이트를 출력한다.
str 문자열을 연속된 바이트로 출력한다.
한 문자를 출력한다.
str 문자열을 연속된 문자로 출력한다.
double 값을 출력한다.
float 값을 출력한다.
int 값을 출력한다.
long 값을 출력한다.
객체를 출력한다.
short 값을 출력한다.
문자열을 UTF 인코딩으로 출력한다.
52
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 ObjectInputStream 클래스
-
직렬화된 데이터로부터 역 직렬화(Deserialization)를 수행하여 원래의 데이터로 복구하는
기능을 제공하는 클래스
 ObjectInputStream 클래스 생성자
형식
12장. 입출력
ObjectInputStream(InputStream inputStream)
53
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 ObjectOutputStream 클래스의 주요 메소드
메소드
설명
void close()
스트림을 닫는다.
int read()
한 바이트를 읽는다.
int read(byte[] b, int off, int len)
바이트 배열로 읽어들인다.
boolean readBoolean()
boolean 값을 읽는다.
byte readByte()
한 바이트를 읽는다.
char readChar()
문자를 읽는다.
double readDouble()
double 값을 읽는다.
float readFloat()
float 값을 읽는다.
int readInt()
int 값을 읽는다.
long readLong()
long 값을 읽는다.
Object readObject()
객체를 읽는다.
short readShort()
short 값을 읽는다.
int readUnsignedByte()
부호 없는 바이트 값을 읽는다.
int readUnsignedShort()
부호 없는 short 값을 읽는다.
String readUTF()
UTF 인코딩을 읽어서 문자열 타입으로 반환
12장. 입출력
54
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 실습예제
ObjectWriteTest.java
01
02
03
04
05
06
07
08
09
10
11
12
12장. 입출력
import java.io.*;
class Box implements Serializable {
int w;
int h;
int d;
public Box(int a, int b, int c)
{
w = a;
h = b;
d = c;
}
}
Serializable 인터페이스를 포함하는
클래스 생성
55
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 실습예제
ObjectWriteTest.java
13
14
15
16
17
18
19
20
21
22
23
24
25
12장. 입출력
public class ObjectWriteTest {
public static void main(String args[]) throws Exception {
String s1 = "***박스의 가로,세로,높이***";
Box mybox1 = new Box(10,20,30);
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream
("tmp.txt"));
객체를 파일에 출력하기 위한 객체 생성
oos.writeObject(s1);
String 객체 출력
oos.writeObject(mybox1);
Box 객체 출력
oos.writeDouble(123.456);
Double 객체 출력
oos.close();
}
}
56
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 프로그램 설명
-
02
: Box 클래스의 객체를 저장하기 위해서 클래스를 작성할 때 Serializable 인터페이스를 포
함하여 작성하였다.
-
17
: 파일에 객체를 저장하기 위해 파일 이름을 가지고 FileOutputStream 객체를 생성한 다음
, 그 객체를 가지고 ObjectOutputStream 객체를 생성하였다. 위 문장은 두 개의 문장을 하나의
문장으로 작성한 것이다. 즉 위 문장은 다음 문장과 같은 의미이다.
FileOutputStream oof = new FileOutputStream("tmp.txt");
ObjectOutputStream oos = new ObjectOutputStream(oof);
-
18
-
20~21
12장. 입출력
: writeObject() 메소드를 이용하여 String 객체 s1을 출력하였다.
: Box 객체와 Double 객체를 출력하였다.
57
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 실습예제
ObjectReadTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
12장. 입출력
import java.io.*;
public class ObjectReadTest {
public static void main(String args[]) throws Exception {
ObjectInputStream ois =
파일로부터 객체를 읽기 위한 객체
new ObjectInputStream(new FileInputStream("tmp.txt"));
생성
String s2 =
하나의 객체를 읽어 String으로 형변환
(String)ois.readObject();
하나의 객체를 읽어 Box로 형변환
Box mybox2 = (Box)ois.readObject();
System.out.println(s2);
읽은 객체를 출력
System.out.println("박스의 가로는 :
읽은 객체의 요소를 출력
"+mybox2.w);
System.out.println("박스의 세로는 :
읽은 Double 객체의 값 출력
"+mybox2.h);
System.out.println("박스의 높이는 : "+mybox2.d);
System.out.println("Double 값은 : " + ois.readDouble());
}
}
58
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
 프로그램 설명
-
04, 05
: FileInputStream 클래스와 ObjectInputStream 클래스를 이용하여 파일로부터 객체
를 읽어들일 수 있는 특성을 가진 객체를 생성하였다.
-
06
: 생성된 객체를 이용하여 하나의 객체를 읽어들인 다음, String 클래스의 객체로 형변환을
하였다. readObject() 메소드가 반환하는 객체는 Object 클래스형의 객체이고 이 객체를
Object 클래스(자바의 최상위 클래스)의 하위 클래스인 String형의 객체 변수에 배정하려면 명
시적인 형변환 문장이 요구된다. 형변환 문장을 기술하지 않으면 오류가 발생한다.
-
08
: 하나의 객체를 읽어들여 Box형으로 변환한다.
-
10~14
-
15 : Double 객체를 readDouble() 메소드(64비트:8바이트를 읽어들임)를 사용하여 읽어들였
: 객체의 요소들을 출력하였다.
다. 만일 readFloat() 메소드(32비트 : 4바이트를 읽어들임)로 읽어들이면 틀린 값이 출력되게 된
다.
12장. 입출력
59
5 바이트 스트림
5-4 OjbectOutputStream 클래스와 OjbectInputStream 클래스
12장. 입출력
60
 학습정리
 java.io 패키지 개요
① 자바의 입출력은 하드웨어와 독립적으로 설계되어 어떠한 컴퓨터에서나 일관된 입
출력을 수행한다.
② 자바의 입출력은 스트림(stream)을 사용한다. 스트림은 순서가 있는 일련의 데이터
를 의미한다.
 파일과 디렉터리
① 자바는 파일과 디렉터리를 다루기 위해 File 클래스를 제공한다. 다양한 메소드를
이용하여 디렉터리와 파일에 관한 정보를 얻을 수 있다.
 문자 스트림과 바이트 스트림
① 스트림에는 문자 스트림과 바이트 스트림 두 가지 형태가 있다.
② 문자 스트림은 16비트 문자나 문자열들을 읽고 쓰기 위한 스트림이고, 바이트 스트
림(또는 바이너리 스트림)은 8비트의 바이트를 읽고 쓰기 위한 스트림이다.
61
 학습정리
 문자 스트림
① Writer와 Reader 클래스는 문자 스트림 입출력을 대표하는 추상 클래스로서 다양한 메소
드를 가지고 있다. 이러한 추상 클래스는 하위 클래스에서 오버라이딩되어 사용된다.
② FileWriter 클래스와 FileReader 클래스는 파일에 문자 스트림을 입출력하기 위해 사용하
는 클래스이다.
 바이트 스트림
① OutputStream 클래스와 InputStream 클래스는 바이트 스트림 입출력을 대표하는 추상
클래스로서 다양한 메소드를 가지고 있다. 이러한 추상 클래스는 하위 클래스에서 오버
라이딩되어 사용된다.
② FileOutputStream 클래스와 FileInputStream 클래스는 파일에 바이트 스트림을 입출력하
기 위해 사용하는 클래스이다.
③ DataOutputStream 클래스와 DataInputStream 클래스는 자바의 기본 자료형 데이터를
바이트로 입출력하기 위해 사용하는 클래스이다.
④ OjbectOutputStream 클래스와 OjbectInputStream 클래스는 객체를 입출력하기 위한 클
래스이다. 객체를 입출력하기 위해 자바는 직렬화된 데이터를 사용한다.
62
12장. 입출력
63