프로그램을 실행하기 위해서는 데이터를 다른 곳에서 가져와야하기 때문에 I/O가 기반이 된다.
속도 문제로 인하여 메인 메모리에서 파일을 가져오는 경우가 대부분이다.
네트워크 또한 중요한 역할을 한다.
Standard IO Programming
IO Programming
Socket Programming
Java Network Programming : Socket Program
Based on Java IO
TCP/IP가 지원되기 시작하면서 사용되기 시작했다.
소켓(Socket)
- 네트워크를 통해 TCP/IP 통신을 연결시켜주는 객체
- 클라이언트와 서버가 연결된 상태를 만들어줌 (Session을 맺음)
자바에서 파일을 다룰 때 일단 파일을 열어서 파일 객체를 생성한 뒤 스트림이나 채널을 열어 input, output 작업을 수행하고 파일을 닫아줍니다.
네트워크 통신도 파일과 같다고 생각하면 됩니다. 소켓을 통해 서버-클라이언트 간 통신을 열어주는 것, 즉 세션을 맺어준 뒤 역시 스트림이나 채널을 열어 input, output 작업을 수행하면 됩니다.
Stream
물의 흐름과 같이 "정렬 된 데이터의 연속적인 흐름"입니다.
보통 고정 길이 없음
Input : Standard In, HDD, Connected Devices with NIC
Output: Standard Out, HDD, Connected Devices with NIC
Java IO
Byte IO
Text IO
Byte IO
데이터 및 숫자와 같은 이진 데이터를 읽고 쓰는 데 사용됩니다.
예: Image, Video, Application Files
바이트 단위의 I/O 처리
InputStream
OutputStream
Text IO : Character Data
텍스트 파일과 같은 문자 데이터 읽기 / 쓰기에 사용
Uni-Code 인코딩 또는 KSC5601 인코딩과 같은 문자 데이터 인코딩 변환 필요
Reader
Writer
두 가지 유형의 Java IO 클래스
Node Stream class : source or destination IO classes
Filtering Stream class : processing classes for IO
중간의 완충역할을 해준다.
BufferedInputStream과 같이
Node Stream classes in Java IO
Filtering Stream classes in Java IO
Data Source : File in Disk
Filtering Processing :
Text일 경우 변환해준 것이다.
일반적으로는 BufferedInput을 사용한 두 단계의 구성이 가장 많이 사용된다.
Destination : File in Disk
Filtering Processing :
I/O 스트림을 사용한 처리 단계
InputStream에서 읽기
입력 데이터 처리
결과 데이터를 OutputStream에 쓰기
입력 및 출력 스트리밍의
Specification of InputStream
Specification of OutputStream
입력 소스 및 출력 대상 클래스의 사양이 필요합니다.
Basic: InputStream → Read, Write → OutputStream
Extends : InputStream → Read, Processing, Write → OutputStream
예
Copier.java ( Input Source(???) → OutputDestination(???) )
받아서 바로 출력하는 것 (소스와 목적지가 어떻게 되는가)
Stand I/O는 InputStream, OutputStream 클래스를 사용합니다.
System.in, System.out
System.in: keyboard of Console
System.out: display of Console
메소드
abstract int read (): 입력 스트림로부터 다음의 바이트 데이터를 읽어들입니다.
int read (byte[] b): 입력 스트림로부터 바이트수를 읽기, 그것을 버퍼 배열 b에 포함합니다.
int read (byte[] b, int off, int len): 입력 스트림로부터 len 바이트까지의 데이터를 바이트 배열에 읽어들입니다.
void write (byte[] b): 지정된 바이트 배열로부터 이 출력 스트림에 b.length 바이트를 출력합니다.
void write (byte[] b, int off, int len) : 오프셋(offset) off로 부터 시작되는 지정의 바이트 배열로부터 이 출력 스트림에 len 바이트를 출력합니다.
abstract void write (int b): 이 출력 스트림로 지정된 바이트를 출력합니다.
C:> java SimpleRead<SimpleRead.java
import java.io.IOException;
...
C:> java SimpleRead <SimpleRead.java >output.txt
C:> more output.txt
import java.io.IOException;
InputStream의 소스와 OutputStream의 대상을 지정했습니다.
대상 클래스
Console : System In, System Out
File : FileInputStream, FileOutputStream
Network
사용 사례
1)Console → File
2)File → Console
3)File → File
4)Etc
FileInputStream
주어진 파일에서 바이트 단위로 내용을 읽는 데 사용됩니다.
생성자
FileInputStream(File file)
FileInputStream(String name)
FileOutputStream
주어진 파일에 바이트 단위로 결과 내용을 쓰는 데 사용됩니다.
생성자
FileOutputStream(File file)
FileOutputStream(String name, boolean append)
FileOutputStream(String name)
FileInputStream / FileOutputStream의 주요 유형
Files in Disk
Data from/to console
Reader의 소스와 Writer의 대상을 지정했습니다.
대상 클래스
File : FileReader, FileWriter
Console : System.in, System.out
FileReader
주어진 파일에서 문자 단위로 내용을 읽는 데 사용합니다.
생성자
FileReader(File file)
FileReader(String fileName)
FileWriter
주어진 파일에 텍스트 데이터를 쓰는 데 사용
생성자
FileWriter(File file)
FileWriter(String fileName, boolean append)
FileWriter(String fileName)
Buffer
Buffered IO
Buffering for Byte IO
BufferedInputStream
BufferedOutputStream
Buffering for Text IO
BufferedReader
BufferedWriter
Data Processing for IO
Data Processing for Byte IO
DataInputStream
DataOutputStream
Transferring Byte Type to Text Type
InputStreamReader
OutputStreamWriter
BufferedInputStream
버퍼를 사용하여 바이트 입력 성능을 향상시키는 클래스
생성자
BufferedInputStream(InputStream in, int size)
BufferedInputStream(InputStream in)
BufferedOutputStream
버퍼를 사용하여 바이트 출력 성능을 향상시키는 클래스
생성자
BufferedOutputStream(OutputStream out, int size)
BufferedOutputStream(OutputStream out)
InputStreamReader
입력 스트림을 Reader 유형으로 변환하는 데 사용하는 클래스
생성자
InputStreamReader(InputStream in, String enc)
InputStreamReader(InputStream in)
OutputStreamWriter
버퍼를 사용하여 바이트 출력 성능을 향상시키는 클래스
생성자
OutputStreamWriter(OutputStreamout,Stringenc)
OutputStreamWriter(OutputStreamout)
DataInputStream
지정된 유형의 데이터를 읽는 데 사용하는 클래스
생성자
메소드
DataOutputStream
지정된 유형의 데이터를 쓰는 데 사용하는 클래스
생성자
메소드
✔ flush() 란?
출력 스트림과 버퍼된 출력 바이트를 강제로 쓰게 한다.
flush()는 현재 버퍼에 저장되어 있는 내용을 클라이언트로 전송하고 버퍼를 비운다.
BufferedReader
데이터 읽기를 위해 버퍼를 사용하는 리더
생성자
BufferedReader(Reader in, int sz)
BufferedReader(Reader in)
메소드
BufferedWriter
데이터 쓰기를 위해 버퍼를 사용하는 작성기
생성자
BufferedWriter(Writer out, int sz)
BufferedWriter(Writer out)
생성자
Scanner sc = new Scanner (System.in);
CF: BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
즉 Scanner는 inputStreamReader
와 BufferedReader
둘 다를 포함하고 있다.
<스캐너와 BufferedReader의 차이점>
1), 2)는 BufferedReader의 장점
3), 4)는 Scanner의 장점
1)Size
SC : 1024byte, br: =8096byte
BR의 속도는 Scanner보다 빠릅니다.
2)Synchronization
BR은 다중 스레드 제어로 가능합니다.
스캐너는 다중 스레드에서 사용하지 않습니다.
따라서 BR은 소켓 프로그램에서 더 유용합니다.
3)Parsing
Scanner에는 구문 분석 기능(parsing function)이 있습니다.
BR은 StringTokenizer를 사용하여 구문 분석(parse)
4)Exception function
Scanner
BufferedReader
read(), readLine(), … none for parsing types
StringTokenizer가 필요하고 Integer.parseInt (token)과 같은 wrapper 클래스 메서드가 필요합니다.
Scanner
nextLine() throws exception
먼저 확인하려면 hasNextLine ()이 필요합니다.
nextInt(), hasNextInt(), …
없으면 자동 종료
BufferedReader
readLine() returns null
read() returns -1
EOF를 구분 못하기 때문에 다음 줄이 없으면 에러 발생
파일 입력에 스캐너 사용
파일에 스캐너 사용
hasNext… ()를 사용하여 EOF 확인
next… ()를 사용하여 읽음
파일 출력에 PrintWriter 사용 (Scanner는 Input만 가지기 때문, Output 기능 없다)
PrintWriter with File 사용
메소드