일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- full text indexing
- 형변환
- 페이징
- 상속예제
- 전체텍스트
- Full text
- 이클립스
- 다운캐스팅
- 스프링
- Login with OAuth Authentication
- while
- angular2
- Random
- 업캐스팅
- 25가지 효율적인 sql작성법
- 가변인자
- 자바 야구게임
- 야구게임
- 추상클래스
- 전자정부
- 로또
- 다형성
- 단축키
- jquery
- IBatis procedure
- Validations
- 자바
- 전체
- 상속
- Today
- Total
nalaolla
Java 입출력(I/O) 본문
Java 입출력(I/O)
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을 사용한다.