메뉴 건너뛰기

2016.09.13 18:44

파일I/O 개요

조회 수 3507 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

파일I/O 개요


1. 입출력이란?

입출력이란 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다.

예를 들면 키보드로부터 데이터를 입력받는다든가 System.out.println()을 이용해서 화면에 출력한다던가 하는 것이 가장 기본적인 입출력의 예이다.


2. 스트림

자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림이라 한다.

스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.

스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고 받는다. 큐와 같은 FIFO(First In First Out)구조로 되어 있다고 생각하면 쉬울 것이다.

cf.) 스트림은 TV와 VCR을 연결하는 입력선과 출력선과 같은 역할을 한다.

스트림이란 데이터를 운반하는데 사용된느 연결통로이다.


3. 바이트기반 스트림 - InputStream, OutputStream

스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 다음과 같은 입출력 스트림이 있다.

스트림의 종류가 달라도 읽고 쓰는 방법은 동일하다.



입력스트림 

출력스트림 

입출력 대상의 종류 

 FileInputStream

 FileOutputStream

 파일 

 ByteArrayInputStream

 ByteArrayOutputStream 

 메모리(byte 배열) 

 PipedOnputStream

 PipedOutputStream 

 프로세스(프로세스간의 통신) 

 AudioInputStream

 AudioOutputStream 

 오디오 장치 


어떠한 대상에 대해서 작업을 할 것인지 그리고 입력을 할 것인지 출력을 할 것인지에 따라서 해당 스트림을 선택해서 사용하면 된다.

예를 들어, 어떤 파일의 내용을 읽고자 하는 경우 FileInputStream을 사용하면 될 것이다.

이들은 모두 InputStream 또는 OutputStream의 자손들이며, 각각 읽고 쓰는데 필요한 추상메서드를 자신에 맞게 구현해 놓았다.


※ InputStream과 OutputStream에 정의된 읽기와 쓰기를 수행하는 메서드

 InputStream

 OutputStream

 abstract int read() 

 abstract void write(int c

 int read(byte cbuf[]) 

 void write(byte cbuf[]) 

 int read(byte cbuf[], int offset, int length) 

 void write(byte cbuf[], int offset, int length) 

InputStream의 read()와 OutputStream의 write(int b)는 입출력의 대상에 따라 읽고 쓰는 방법이 다를 것이기 때문에 각 상황에 알맞게 구현하라는 의미에서 추상메소드로 정의되어 있다.


cf.) read()의 반환타입이 byte가 아니라 int인 이유는 read()의 반환값의 범위가 0~255와 -1이기 때문이다.


public abstract class InputStream{

...

abstract int read();

// 입력스트림으로부터 1byte를 읽어서 반환한다. 읽을 수 없으면 -1을 반환한다.

int read(byte[] b, int off, int len){

  // 입력스트림으로부터 ien개의 byte를 읽어서 byte배열 b의 off위치부터 저장한다.

...

for(int i-off, i < off+len; i++){

b[i]=(byte)read();

// read()를 호출해서 데이터를 읽어서 배열을 채운다.

}

...

}

int read(byte[] b){

  // 입력스트림으로부터 byte배열 b의 크기만큼 데이터를 읽어서 배열 b에 저장한다.

return read(b, 0, b.length);

}

...


4. 보조 스트림

스트림의 기능을 보완하기 위한 보조 스트림이 제공된다. 보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능을 없지만. 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.그래서 보조 스트림만으로는 입출력 처리를 할 수 없고, 스트림을 먼저 생성한 다음에 이를 이용해서 보조 스트림을 생성해야 한다.

예를 들어 test.txt라는 파일을 읽기 위해 FileInputStream을 사용할 때, 입력 성능을 향상시키기 위해 버퍼를 사용하는 보조 스트림인 BufferedInputStream을 사용하는 코드는 다음과 같다.


// 먼저 기반스트림을 생성한다.FileInputStream은 InputStream의 자손 클래스이다.

FileInputStream fis = new FileInputStream("test.txt");

// 기반스트림을 이용해서 보조스트림을 생성한다.

BufferedInputStream bis = new BufferedInputStream(fis);

// 보조 스트림인 BufferedInputStream으로 부터 데이터를 읽는다.

bis.read();

코드 상으로는 보조스트림인 BufferedinputStream이 입력기능을 수행하는 것처럼 보이지만, 실제 입력기능은 BuffterdinputStream과 연결된 FileInputStream이 수행하고, 

보조스트림인 BufferedinputStream은 버퍼만을 제공한다.


모든 보조 스트림은 InputStream과 OutputStream의 자손들이므로 입출력 방법이 같다.


5. 문자기반 스트림

바이트 기반이라 함은 입출력의 단위가 1byte라는 뜻이다. 문자 데이터를 입출력 할 때는 바이트기반 스트림 대신 문자기반 스트림을 사용하자.

Java에서는 한 문자를 의미하는 char형이 1byte가 아니라 2 byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를 처리하는데 어려움이 있다.

이 점을 보완하기 위해서 문자기반의 스트림이 제공된다. 문자데이터를 입출력할 때는 바이트기반 스트림 대신 문자기반 스트림을 사용하자.




List of Articles
번호 제목 날짜 조회 수
111 Spring Boot 프로젝트 생성 file 2016.09.02 4160
110 war로 묶지 않아도 컴파일된 소스 위치 확인하기 file 2016.08.29 4116
109 Database Connections 생성하기 (오라클) file 2016.08.29 4072
108 jquery 스크롤(scroll) 따라다니는 배너 레이어 / 위로 버튼 / 화면 상단으로 이동 / scroll layer 이벤트 file 2017.07.05 4057
107 [자바(스프링&mybatis&jsp) 프로젝트 & 아파치 &톰켓 연동 ]9. 이클립스 압타나 플러그인 설치 file 2016.08.18 4012
106 프로젝트 & 아파치 &톰켓 연동 ]1. 폴더 만들기 file 2016.08.18 3983
105 변수의 종류 2016.09.13 3978
104 [자바(스프링&mybatis&jsp) 프로젝트 & 아파치 &톰켓 연동 ]11. 이클립스 프로젝트 생성 file 2016.08.18 3972
103 iBATIS 동적으로 맵핑하기 2016.12.09 3948
102 개인정보 마스킹처리 (휴대폰번호, 이메일) 2018.06.26 3941
101 로그인 컴포넌트 설치시 뷰 생성 에러 해결방법 (ORA-01031: 권한이 불충분합니다) file 2016.08.29 3874
100 [자바(스프링&mybatis&jsp) 프로젝트 & 아파치 &톰켓 연동 ] 이클립스 프로젝트 생성 순서07.commons-collection 설치 file 2016.08.18 3845
99 Select statements cannot be executed as an update. 에러 해결방법 file 2016.08.29 3844
98 새로 만든 모듈의 iBatis 쿼리를 새로운 xml 파일에 만들고 싶다면 이렇게 하자. file 2016.08.29 3773
97 static멤버와 관련된 예제 2016.09.21 3768
96 바이트 기반의 스트림 file 2016.09.13 3763
95 [자바(스프링&mybatis&jsp) 프로젝트 & 아파치 &톰켓 연동]3. 이클립스 설치 file 2016.08.18 3756
94 클래스 메서드와 인스턴스 메서드 2016.09.13 3720
93 BigDecimal타입의 사칙연산 2016.12.22 3713
92 JAR 파일 2016.09.19 3713
Board Pagination Prev 1 2 3 4 5 6 7 8 Next
/ 8

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved