JAVA(객체지향프로그래밍) - XIII / XIV

아현·2021년 5월 14일
0

Java

목록 보기
5/13
post-thumbnail

Why need Input/Output?

  • 프로그램을 실행하기 위해서는 데이터를 다른 곳에서 가져와야하기 때문에 I/O가 기반이 된다.

  • 속도 문제로 인하여 메인 메모리에서 파일을 가져오는 경우가 대부분이다.

  • 네트워크 또한 중요한 역할을 한다.

    • 다른 기기에 있는 데이터를 가져오는 것 (NIC)
  • Standard IO Programming

    • Keyboard / Display
  • IO Programming

    • File Input/Output
  • Socket Programming

    • Network Input/Output



Network IO


  • Java Network Programming : Socket Program

    • Based on Java IO

    • TCP/IP가 지원되기 시작하면서 사용되기 시작했다.

소켓(Socket)

  • 네트워크를 통해 TCP/IP 통신을 연결시켜주는 객체
  • 클라이언트와 서버가 연결된 상태를 만들어줌 (Session을 맺음)

  • 자바에서 파일을 다룰 때 일단 파일을 열어서 파일 객체를 생성한 뒤 스트림이나 채널을 열어 input, output 작업을 수행하고 파일을 닫아줍니다.

    네트워크 통신도 파일과 같다고 생각하면 됩니다. 소켓을 통해 서버-클라이언트 간 통신을 열어주는 것, 즉 세션을 맺어준 뒤 역시 스트림이나 채널을 열어 input, output 작업을 수행하면 됩니다.



Concept of IO Stream


  • Stream

    • 물의 흐름과 같이 "정렬 된 데이터의 연속적인 흐름"입니다.

    • 보통 고정 길이 없음

  • Input : Standard In, HDD, Connected Devices with NIC

  • Output: Standard Out, HDD, Connected Devices with NIC



Stream IO in Java


  • 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 Package


  • 두 가지 유형의 Java IO 클래스

    • Node Stream class : source or destination IO classes

    • Filtering Stream class : processing classes for IO

      • 중간의 완충역할을 해준다.

      • BufferedInputStream과 같이



Node Stream


  • Node Stream classes in Java IO

    • Console, Disk, Memory, NIC



Filtering Stream


  • Filtering Stream classes in Java IO

    • Buffering, Filtering, Data Processing, Printing



Input Stream chain example


  • Data Source : File in Disk

  • Filtering Processing :

    • Buffering, Data Processing

  • Text일 경우 변환해준 것이다.

  • 일반적으로는 BufferedInput을 사용한 두 단계의 구성이 가장 많이 사용된다.



Output Stream chain example


  • Destination : File in Disk

  • Filtering Processing :

    • Buffering, Data Processing



InputStream/OutputStream


  • 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(???) )

    • 받아서 바로 출력하는 것 (소스와 목적지가 어떻게 되는가)



1. Console IO



  • Stand I/O는 InputStream, OutputStream 클래스를 사용합니다.

    • 최상위 클래스인 콘솔에서 Read/Write Byte Stream
  • 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): 이 출력 스트림로 지정된 바이트를 출력합니다.



[실습 1-1]



Re-direction


  • Re-Didrectionsymbol : < , >

C:> java SimpleRead<SimpleRead.java
import java.io.IOException;
...

C:> java SimpleRead <SimpleRead.java >output.txt
C:> more output.txt
import java.io.IOException;




[실습 1-2]



[실습 1-3]




2. Byte I/O


  • InputStream의 소스와 OutputStream의 대상을 지정했습니다.

  • 대상 클래스

    • Console : System In, System Out

    • File : FileInputStream, FileOutputStream

    • Network


  • 공통 클래스 정의 : Copier.java

  • 사용 사례

    1)Console → File

    2)File → Console

    3)File → File

    4)Etc

    • CF: Console → Console : Simple Console IO



Copier.java


  • Copier : InputStream의 내용을 OutputStream에 복사



FileInputStream/FileOutputStream



  • 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



[실습 2-1]

이클립스 cmd 실행





[실습 2-2]




[실습 2-3]




3. Text I/O


  • 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)



[실습 3-1]




[실습 3-2]




4. Filtering I/O


  • Buffer

    • 데이터를 메모리에 보관하는 공간
  • Buffered IO

    • 조건이 충족 될 때까지 데이터를 임시로 보관하는 데 사용합니다.

  • Buffering for Byte IO

    • BufferedInputStream

    • BufferedOutputStream


  • Buffering for Text IO

    • BufferedReader

    • BufferedWriter


  • Data Processing for IO

    • I/O 중 지정된 데이터 읽기 및 쓰기

  • Data Processing for Byte IO

    • DataInputStream

    • DataOutputStream


  • Transferring Byte Type to Text Type

    • InputStreamReader

    • OutputStreamWriter



BufferedInputStream/BufferedOutputStream



  • 일반적으로 대용량 파일 또는 데이터 전송에 사용

  • BufferedInputStream

    • 버퍼를 사용하여 바이트 입력 성능을 향상시키는 클래스

    • 생성자

      • BufferedInputStream(InputStream in, int size)

      • BufferedInputStream(InputStream in)


  • BufferedOutputStream

    • 버퍼를 사용하여 바이트 출력 성능을 향상시키는 클래스

    • 생성자

      • BufferedOutputStream(OutputStream out, int size)

      • BufferedOutputStream(OutputStream out)



InputStreamReader/OutputStreamWriter



  • 연속적인 문자 데이터 전송에 사용 (예 : 채팅)

  • InputStreamReader

    • 입력 스트림을 Reader 유형으로 변환하는 데 사용하는 클래스

    • 생성자

      • InputStreamReader(InputStream in, String enc)

      • InputStreamReader(InputStream in)


  • OutputStreamWriter

    • 버퍼를 사용하여 바이트 출력 성능을 향상시키는 클래스

    • 생성자

      • OutputStreamWriter(OutputStreamout,Stringenc)

      • OutputStreamWriter(OutputStreamout)



DataInputStream/DataOutputStream



  • 지정된 데이터를 처리하는 데 사용

  • DataInputStream

    • 지정된 유형의 데이터를 읽는 데 사용하는 클래스

    • 생성자

      • DataInputStream(InputStream in)
    • 메소드

      • readChar(), readDouble(), readInt()

  • DataOutputStream

    • 지정된 유형의 데이터를 쓰는 데 사용하는 클래스

    • 생성자

      • DataOutputStream(InputStream in)
    • 메소드

      • writeChar(), writeInt()



[실습 4-1]

✔ flush() 란?

  • 출력 스트림과 버퍼된 출력 바이트를 강제로 쓰게 한다.

  • flush()는 현재 버퍼에 저장되어 있는 내용을 클라이언트로 전송하고 버퍼를 비운다.




BufferedReader/BufferedWriter



  • BufferedReader

    • 데이터 읽기를 위해 버퍼를 사용하는 리더

    • 생성자

      • BufferedReader(Reader in, int sz)

      • BufferedReader(Reader in)

    • 메소드

      • String readLine()

  • BufferedWriter

    • 데이터 쓰기를 위해 버퍼를 사용하는 작성기

    • 생성자

      • BufferedWriter(Writer out, int sz)

      • BufferedWriter(Writer out)



[실습 4-2]

  • 데이터를 버퍼에 넣어서 comment면 (#이면) 넘어가고, comment가 아니라면 tokenizer 시켜서 첫번째 토근은 key로 두번째 토큰은 value로 정한다.




5. Scanner


  • BufferedReader와 유사하게 텍스트 데이터를 읽는 데 사용됩니다.

  • 생성자

    • Scanner sc = new Scanner (System.in);

    • CF: BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    • 즉 Scanner는 inputStreamReaderBufferedReader 둘 다를 포함하고 있다.


<스캐너와 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

  • BR은 필요할 때 예외 처리 기능을 정의합니다.



parsing primitive types


  • Scanner

    • nextInt(), nextFloat(), … for parsing types

  • BufferedReader

    • read(), readLine(), … none for parsing types

    • StringTokenizer가 필요하고 Integer.parseInt (token)과 같은 wrapper 클래스 메서드가 필요합니다.

      • BufferedReader의 단점



Checking End of File/Stream (EOF)


  • Scanner

    • nextLine() throws exception

    • 먼저 확인하려면 hasNextLine ()이 필요합니다.

    • nextInt(), hasNextInt(), …

    • 없으면 자동 종료


  • BufferedReader

    • readLine() returns null

    • read() returns -1

    • EOF를 구분 못하기 때문에 다음 줄이 없으면 에러 발생

      • 그래서 예외처리를 따로 해줘야하기 때문에 번거로움 있음



File I/O


  • 파일 입력에 스캐너 사용

    • 파일에 스캐너 사용

      • Scanner inFile= new Scanner(new File(“in.txt”));
    • hasNext… ()를 사용하여 EOF 확인

      • while (inFile.hasNext…())
    • next… ()를 사용하여 읽음

      • inFile.next…()

  • 파일 출력에 PrintWriter 사용 (Scanner는 Input만 가지기 때문, Output 기능 없다)

    • PrintWriter with File 사용

      • PrintWriter outFile= new PrintWriter(new File(“out.txt”));
    • 메소드

      • outFile.print(), println(), format(), flush(), close(), …



[실습 5-1]



[실습 5-2]



[실습 5-3]




참고: 참고1, 참고2, 참고3, 참고4

profile
For the sake of someone who studies computer science

0개의 댓글