1. 입출력 I/O
- 입력(Input), 출력(Output)이라고 한다.
- 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다.
2. 스트림(stream)
- 데이터를 운반(입출력)하는데 사용되는 연결통로이다.
- 연속적인 데이터의 흐름을 물(stream)에 비유해서 붙여진 이름이다.
- 하나의 스트림으로 입출력을 동시에 수행할 수 없다.(단방향 통신)
- 입출력을 동시에 수행하려면, 입력스트림(input stream), 출력스트림(ouput stream) 2개의 스트림이 필요하다.
- 먼저 보낸 데이터를 먼저 받게 되어있고, 연속적으로 데이터를 주고받는다.
3. 바이트기반 스트림 - InputStream, OutPutStream
- 바이트단위로 데이터를 전송하며, 입출력 대상에 따라 다음과 같은 입출력스트림이 있다.
입력스트림 |
출력스트림 |
입출력 대상의 종류 |
FileInputStream |
FileOutputStream |
파일 |
ByteArrayInputStream |
ByteArrayOutPutStream |
메모리(byte 배열) |
PipedInputStream |
PipedOutputStream |
프로세스(프로세스간의 통신) |
AudioInputStream |
AudioOutputStream |
오디오장치 |
- 읽기와 쓰기를 수행하는 메서드
InputStream |
OutPutStream |
abstract int read() |
abstract void writy(int b) |
int read(byte[] b) |
void write(byte[] b) |
int read(byte[] b, int off, int len) |
void write(byte[] b, int off, int len) |
4. 보조스트림
- 독립적으로 데이터 입출력을 수행할 수 없다.
- 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용한다.
- 먼저 기반스트림을 생성하고, 기반스트림을 이용해서 보조스트림을 생성한다.
입력 |
출력 |
설명 |
FilterInputStream |
FilterOutputStream |
필터를 이용한 입출력 처리 |
BufferedInputStream |
BufferedOuputStream |
버퍼를 이용한 입출력 성능향상 |
DataInputStream |
DataOutputStream |
int, float와 같은 기본형 단위로 데이터를 처리하는 기능 |
SequenceInputStream |
sequenceOutputStream |
두 개의 스트링을 하나로 연결 |
LineNumberInputStream |
없음 |
읽어 온 데이터의 라인 카운트 (JDK1.1 부터 LineNumberReader로 대체) |
ObjectInputStream |
ObjectOutputStream |
데이터를 객체단위로 읽고 쓰는데 사용, 주로 파일을 이용하며 객체 직렬화와 관련 있음 |
없음 |
PrintStream |
버퍼를 이용하며, 추가적인 print관련 기능 (print, printf, println 메서드) |
PushbackInputStream |
없음 |
버퍼를 이용해서 읽어온 데이터를 다시 되돌리는 기능 (unread, push back to buffrer) |
5. 문자기반 스트림 - Reader, Writer
- 입출력 단위가 문자(char, 2byte)인 스트림이다.
- 문자기반 스트림의 최고 조상이다.
- 바이트기반 스트림의 이름에서 InputStream은 Reader로, OutputStream Writer로 바꾸면 된다.
- 단, ByteArrayInputStream에 대응하는 문자기반 스트림은 CharArrayReader 이다.
- 메서드는 byte배열 대신 char배열을 사용한다는 것과 추상메서드가 달라졌다.
- 보조스트림 역시 문자기반 보조스트림이 존재하며 사용목적과 방식은 바이트기반 보조스트림과 다르지 않다.
6. 표준입출력 - System.in, System.out, System.err
- 콘솔을 통한 데이터 입출력을 의미한다.
- 자바 어플리케이션의 실행과 동시에 사용할 수 있게 자동적으로 생성된다.
- System.in : 콘솔로부터 데이터를 입력받는데 사용
- System.out : 콘솔로부터 데이터를 출력하는데 사용
- System.err : 콘솔로부터 데이터를 출력하는데 사용
- BufferedInputStream과 BufferedOutputStream의 인스턴스를 사용한다.
- setIn(), setOut(), setErr()를 사용하면 입출력을 콘솔이외에 다른 입출력 대상으로 변경하는 것이 가능하다.
7. RandomAccessFile
- 하나의 클래스로 파일에 대한 입출력을 모두 수행할 수 있는 스트림이다.
- 다른 스트림들과 달리 Object의 자손이고, DataInput, DataOutput 인터페이스를 모두 구현했기 때문에 읽기 쓰기가 모두 가능하다.
- 파일의 포인터를 이용하여 어느 위치에서나 읽기 쓰기가 가능하다.
생성자 |
설 명 |
RandomAccessFile(File file, String mode) RandomAccessFile(String fileName, String mode) |
주어진 file에 읽기 또는 읽기와 쓰기를 하기 위한 RandomAccessFile 인스턴스를 생성한다. mode에는 "r(읽기)"과 "rw(읽기,쓰기)" 두 가지 값이 지정가능하다. |
반환형 |
메서드 |
설명 |
long |
getFilePointer() |
파일 포인터의 위치를 알려 준다. |
long |
length() |
파일의 크기를 얻을 수 있다. (단위 byte) |
void |
seek(long pos) |
파일 포인터의 위치를 변경한다. 위치는 파일의 첫 부분 부터 pos 크기만큼 떨어진 곳이다. (단위 byte) |
void |
setLength(long newLength) |
파일의 크기를 지정된 길이로 변경한다. (단위 byte) |
int |
skipBytes(int n) |
지정된 수만큼의 byte를 건너뛴다. |
// RandomAccessFileTest.java import java.io.EOFException; import java.io.IOException; import java.io.RandomAccessFile; public class RandomAccessFileTest { public static void main(String[] args) { // 번호, 국어, 영어, 수학 int[] score = { 1, 100, 90, 90, 2, 70, 90, 100, 3, 100, 100, 100, 4, 70, 60, 80, 5, 70, 90, 100 }; try { RandomAccessFile raf = new RandomAccessFile("score.dat", "rw"); for (int i = 0; i < score.length; i++) { raf.writeInt(score[i]); } // for raf.seek(0); // 파일포인터의 위치를 처음으로 이동시킨다. while (true) { System.out.println(raf.readInt()); } // while } catch (EOFException eof) { // readInt()를 호출 했을 때 더이상 읽을 내용이 없으면 EOFException이 발생한다. } catch (IOException ioe) { ioe.printStackTrace(); } // try - catch } // main } // RandomAccessFileTest /* * 결과 * * 90 * 100 * 3 * 100 * 100 * 100 * 4 * 70 * 60 * 80 * 5 * 70 * 90 * 100 * */
// // RandomAccessFileTest2.java import java.io.EOFException; import java.io.IOException; import java.io.RandomAccessFile; public class RandomAccessFileTest2 { public static void main(String[] args) { int sum = 0; try { RandomAccessFile raf = new RandomAccessFile("score.dat", "r"); int i = 4; // 한 학생의 데이터가 번호와 3과목의 점수로 모두 4개의 int 값 while (true) { raf.seek(i); sum += raf.readInt(); i += 16; // 국어과목만의 점수만을 합계로 내기 위하여 4 * 4 = 16 byte 으로 되어있기 떄문에 포인터 값을 16씩 증가 System.out.println(" i 값 : " + i); System.out.println(" while sum 값 : " + sum); } // while } catch (EOFException eof) { // readInt()를 호출 했을 때 더이상 읽을 내용이 없으면 EOFException이 발생한다. System.out.println(); System.out.println("읽을 내용이 없는 최종 sum : " + sum); } catch (IOException ioe) { ioe.printStackTrace(); } // try - catch } // main } // RandomAccessFileTest2 /* * 결과 * * i 값 : 20 * while sum 값 : 100 * i 값 : 36 * while sum 값 : 170 * i 값 : 52 * while sum 값 : 270 * i 값 : 68 * while sum 값 : 340 * i 값 : 84 * while sum 값 : 410 * * 읽을 내용이 없는 최종 sum : 410 * */
8. File
- 파일과 디렉토리를 다룰 수 있다.
생성자 |
설명 |
File(String fileName) |
주어진 문자열을 이름으로 갖는 파일 또는 디렉토리를 위한 File 인스턴스를 생성한다. 경로(path)를 포함해서 지정해주지만, 파일 이름만 사용해도 되는데 이 경우 프로그램이 실행되는 위치가 경로(path)로 간주된다. |
File(String pathName, String fileName) File(File pathName, String fileName) |
파일 경로와 이름을 따로 분리해서 지정할 수 있도록 한 생성자, 이 중 두번째 것은 경로를 문자열이 아닌 File 인스턴스인 경우를 위해서 제공된 것이다. |
반환형 |
메서드 |
설명 |
String |
getName() |
파일이름을 String 으로 반환한다. |
String |
getPath() |
파일의 경로(path)를 String 으로 반환한다. |
Stirng File |
getAbsolutePath() getAbsoluteFile() |
파일의 절대경로를 String으로 반환한다. 파일의 절대경로를 File로 반환한다. |
String File |
getParent() getParentFile() |
파일의 조상 데릭토리를 String으로 반환한다. 파일의 조상 디렉토리를 File로 반환한다. |
String File |
getCanonicalPath() getCanonicalFile() |
파일의 정규경로를 String으로 반환한다. 파일의 정규경로를 File로 반환한다. |
9. 직렬화(Serialization)
- 객체에 저장된 데이터를 스트림에 쓰기위해 연속적인 데이터로 변환하는 것이다.
- 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 과정을 역직렬화(deserialization)라고 한다.
- 객체를 저장하기 위해서는 직렬화해야 한다.
- 객체를 저장한다는 것은 객체의 모든 인스턴스변수의 값을 저장하는 것이다.
- ObjectInputStream, ObjectOutputStream을 사용한다.
'Java > Java SE' 카테고리의 다른 글
Java JDBC SWING 프로그래밍 예제 - 성적관리 (9) | 2013.08.24 |
---|---|
Java 이클립스(Eclipse) JDBC 오라클(ORACLE) 개발 환경 설정 (2) | 2013.08.23 |
Java 쓰레드(Thread) (0) | 2013.08.19 |
Java 이름 규칙(Naming Rule) (0) | 2013.08.16 |
Java Deep Copy, Shallow Copy (0) | 2013.08.12 |