본문 바로가기

IT일반과목/java

입출력1 (집공부)

1. IO 패키지 소개


자바에서 데이터는 스트림(Stream)을 통해 입출력되므로 스트림의 특징을 잘 이해해야 한다.

스트림은 단일 방향으로 연속적으로 흘러가는 것을 말하는데, 물이 높은곳에서 낮은곳으로 흐르듯이 데이터는 출발지에서 나와 도착지로 들어간다는 개념이다.


2. 입력 스트림과 출력 스트림


입력스트림(InputStream) - 프로그램이 데이터를 입력받을 때

출력스트림(OutputStream) - 프로그램이 데이터를 보낼 때


자바의 기본적인 데이터 입출력 API는 java.io 패키지에서 제공하고 있다.


 java.io 패키지의 주요 클래스 

 설명 

 File 

 파일 시스템에의 파일 정보를 얻기 위한 클래스 

 Console 

 콘솔로부터 문자를 입출력하기 위한 클래스 

 InputStream / OutputStream 

 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스 

 FileInputStream / FileOutputStream

 DataInputStream / DataOutputStream

 ObjectInputStream / ObjectOutputStream

 PrintStream

 BufferedInputStream / BufferedOutputStream 

 바이트 단위 윕출력을 위한 하위 스트림 클래스 

 Reader / Writer 

 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스 

 FileReader / FileWriter

 InputStreamReader / OutputStreamWriter

 PrintWriter

 BufferedReader / BufferedWriter

 문자 단위 입출력을 위한 하위 스트림 클래스 


※ 스트림 클래스는 크게 2가지 종류가 있다.

2-1. 바이트(byte) 기반 스트림

ex) 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 주고 받을 수 있다.


2-2. 문자(character) 기반 스트림

ex) 오로지 문자만 받고 보낼수 있도록 특화되어 있다.


InputStream - 바이트 기반 입력 스트림의 최상위 클래스

OutputStream - 바이트 기반 출력 스트림의 최상위 클래스


하위 클래스일경우 XXXInputStream, XXXOutputStream이렇게 앞에 접미사가 붙는다.


Reader - 문자 기반 입력 스트림의 최상위 클래스

Writer - 문자 기반 출력 스트림의 최상위 클래스


하위 클래스일경우 XXXReader, XXXWriter이렇게 앞에 접미사가 붙는다.


----------------------------------------------------------------------------------------------------------------------

1) InputStream

리턴 타입 

메소드 

설명 

 int 

 read() 

 입력 스트림으로부터 1바이트를 읽고 읽은 바이트를 리턴한다. 

 int

 read(byte[]b) 

 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열 b에 저장하고 실제로 읽은 바이트 수를 리턴한다. 

 int

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

 입력 스트림으로부터 len개의 바이트만큼 읽고 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 실제로 읽은 바이트수인 len개를 리턴한다. 만약 len개를 모두 읽지 못하면 실제로 읽은 바이트 수를 리턴한다. 

 void 

 close() 

 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다. 


1-1) read() 메소드

-> 입력 스트림으로부터 1바이트를 읽고 4바이트 int 타입으로 리턴한다. 따라서 리턴된 4바이트 중 끝의 1바이트에만 데이터가 들어있다.

-> 더이상 입력 스트림으로부터 바이트를 읽을 수 없다면 read() 메소드는 -1을 리턴한다.

ex)

InputStream is = new FileInputStream(C:\test.jpg);

int readByte;

while((readByte=is.read()) !=-1){.....}


1-2) read(byte[] b) 메소드

-> 입력 스트림으로부터 매개값으로 주어진 바이트 배열의 길이만큼 바이트를 읽고 배열에 저장한다. 

-> 바이트를 더이상 읽을 수 없다면 -1을 리턴한다.

ex)

InputStream is = new FileInputStream(C:\test.jpg);

int readByteNo;

byte [] readBytes = new Byte[100];

while((readByteNo=is.read(readBytes)) !=-1){...}


1-3) read(byte[] b, int off, int len) 메소드

-> 입력스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열b[off]부터 len개까지 저장한다.

-> 그리고 읽은 바이트 수인 len개를 리턴한다.

ex1)

InputStream is = ...;

byte[] readBytes = new byte[100];

int readByteNo=is.read(readBytes);

/////////////////////////////////////////////

ex2)

InputStream is = ....;

byte[] readBytes = new byte[100];

int readByteNo = is.read(readBytes,0,100);


1-4) close() 메소드

-> InputStream을 더 이상 사용하지 않을 경우에는 close() 메소드를 호출해서 InputStreamd에서 사용했던 시스템 자원을 풀어준다.


----------------------------------------------------------------------------------------------------------------------

2) OutputStream

 리턴 타입 

 메소드

 설명

 void

 write(int b)

 출력 스트림으로 1바이트를 보낸다(b의 끝 1바이트)

 void

 write(byte[] b)

 출력 스트림으로 주어진 바이트 배열 b의 모든 바이트를 보낸다.

 void

 write(byte[] b, int off, int len)

 출력 스트림으로 주어진 바이트 배열 b[off]부터 len개가지의 바이트를 보낸다. 

 void

 flush()

 버퍼에 잔류하는 모든 바이트를 출력한다.

 void

 close()

 사용한 시스템 자원을 반납하고 출력 스트림을 닫는다.


2-1) write(int b)메소드

-> 매개 변수로 주어진 int 값에서 끝에 있는 1바이트만 출력 스트림으로 보낸다.

ex)

OutputStream os = new FileOutputStream("C:\test.txt");

byte[] data = "ABC",getBytes();

for(int i=0; i<data.length; i++){

os.write(data[i]); // "A", "B", "C"를 하나씩 출력

}


2-2) write(byte[] b) 메소드

-> 매개값으로 주어진 바이트 배열의 모든 바이트를 출력 스트림으로 보낸다.

ex)

OutputStream os = new FileOutputStream("C:\test.txt");

byte[] data = "ABC".getBytes();

os.write(data); //"ABC" 모두 출력


2-3) write(byte[] b, int off, int len) 메소드

-> b[off]부터 len개의 바이트를 출력 스트림으로 보낸다.

ex)

OutputStream os = new FileOutputStream("C:\test.txt");

byte[] data = "ABC".getBytes();

os.write(data,1,2);//"BC"만 출력


----------------------------------------------------------------------------------------------------------------------

2-4) flush() 메소드 - 버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비우는 역할을 한다. -> 출력스트림일때 사용

ex) 프로그램에서 더이상 출력할 데이터가 없다면 flush() 메소드를 마지막으로 호출하여 버퍼에 잔류하는 모든 데이터가 출력되도록 해야 한다.


2-5) close() 메소드 - OutputStream을 더 이상 사용하지 않을 경우에는 close() 메소드를 호출해서 시스템 자원을 풀어준다.

ex)

OutputStream os = new FileOutputStream("C:\test.txt");

byte[] data = "ABC".getBytes();

os.write(data);

os.flush();

os.close();


----------------------------------------------------------------------------------------------------------------------

3) Reader

 메소드 

 설명

 int

 read()

 입력 스트림으로부터 한 개의 문자를 읽고 리턴한다.

 int

 read(char[] cbuf)

 입력 스트림으로부터 읽은 문자들을 매개값으로 주어진 문자 배열 cbuf에 저장하고 실제로 읽은 문자 수를 리턴한다.

 int

 read(char[] cbuf, int off, int len) 

 입력 스트림으로부터 len개의 문자를 읽고 매개값으로 주어진 문자 배열 cbuf[off]부터 len개 까지 저장한다. 그리고 실제로 읽은 문자 수인 len개를 리턴한다.

 void 

 close() 

 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다.


3-1) read() 메소드

-> 입력 스트림으로부터 한 개의 문자(2바이트)를 읽고 4바이트 int타입으로 리턴한다.

-> 더이상 입력 스트림으로부터 문자를 읽어 올수 없다면 read()메소드는 -1을 리턴한다.

ex)

char charData = (char)read();

/////////////////////////////////////////

ex2)

Reader reader = new FileReader("C:\test.txt");

int readData;

while((readData=reader.read()) !=-1){

char charData=(char) readData;

}


3-2) read(char[] cbuf) 메소드

-> 입력 스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장한다.

-> 그리고 읽은 문자 수를 리턴한다.

-> 역시 읽을수 없을땐 -1을 리턴한다.

ex)

Reader reader = new FileReader(C:\test.txt);

int readCharNo;

char[] cbuf = new char[2];

while((readCharNo=reader.read(cbuf)) !=-1){.....}


3-3) read(char[] cbuf, int off, int len) 메소드

-> 입력 스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자 배열 cbuf[off]부터 len개까지 저장한다. 읽은 문자수인 len개를 리턴한다.

-> off를 0으로, len을 배열의 길이로 준다면 read(char[] cbuf)와 동일하다.

ex)

Reader reader=...;

char[] cbuf = new char[100];

int readCharNo = is.read(cbuf);

/////////////////////////////////////

ex2)

Reader reader=...;

char[]cbuf=new char[100];

int readCharNo = is.read(cbuf,0,100);


3-4) close() 메소드

->마지막으로 Reader를 더이상 사용하지 않을 경우에는 close() 메소드를 호출해서 Reader에서 사용했던 시스템 자원을 풀어준다.

ex)

reader.close();


----------------------------------------------------------------------------------------------------------------------


4) Writer

 리턴 타입

 메소드

 설명

 void

 write(int c) 

 출력 스트림으로 주어진 한 문자를 보낸다(c의 끝 2바이트)

 void

 write(char[] cbuf)

 출력 스트림으로 주어진 문자 배열 cbuf의 모든 문자를 보낸다.

 void

 write(char[] cbuf, int off, int len)

 출력 스트림으로 주어진 문자 배열 cbuf[off]부터 len개까지의 문자를 보낸다.

 void

 write(String str)

 출력 스트림으로 주어진 문자열을 전부 보낸다.

 void

 write(String str, int off, int len)

 출력 스트림으로 주어진 문자열 off 순번부터 len개까지의 문자를 보낸다.

 void

 flush()

 버퍼에 잔류하는 모든 문자열을 출력한다.

 void

 close()

 사용한 시스템 자원을 반납하고 출력 스트림을 닫는다.


4-1) write(int c) 메소드

-> 매개 변수로 주어진 int 값에서 끝에 있는 2바이트(한개의 문자)만 출력 스트림으로 보낸다.

ex)

Writer writer = new FileWriter(C:\test.txt);

char[] data = "홍길동".toCharArray();

for(int i=0; i<data.length; i++){

writer.write(data[i]); //"홍", "길", "동" 을 하나씩 출력

}


4-2) write(char[] cbuf) 메소드

-> 매개값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보낸다.

ex)

Writer writer = new FileWriter(C:\test.txt);

char[] data = "홍길동".toCharArray();

writer.write(data); //"홍길동" 모두 출력


4-3) write(byte[] b, int off, int len) 메소드

-> c[off]부터 len개의 문자를 출력스트림으로 보낸다.

ex)

Writer writer = new FileWriter("C:\test.txt");

char[] data = "홍길동".toCharArray();

writer.write(data,1,2); //"길동'만 출력


4-4) write(String str)와 write(String str, int off, int len) 메소드

-> Writer는 문자열을 좀 더 쉽게 보내기 위해서 write(String str)와 write(String str, int off, int len) 메소드를 제공한다. wirte(String str)은 문자열 전체를 출력 스트림으로 보내고, write(String str, int off, int len)은 주어진 문자열 off순번부터 len개까지의 문자를 보낸다.

ex)

Writer writer = new FileWriter("C:\test.txt");

String data = "안녕 자바 프로그램";

writer.write(data);

writer.flush();

writer.close();




'IT일반과목 > java' 카테고리의 다른 글

입출력3 (집공부)  (0) 2018.08.08
입출력2 (집공부)  (0) 2018.08.08
20180807 입출력 오늘 총 한것(학원)  (0) 2018.08.07
16진수 10진수 바꾸는 코드  (0) 2018.08.07
글자텍스트를 그림으로 바꾸기 inOUT실습  (0) 2018.08.07