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을 사용한다.

+ Recent posts