Java

Java Input/Output(I/O)

기기디 2024. 3. 7. 21:10

배경

  • java는 데이터 입력, 출력과 관련하여 추상클래스와 다양한 구현클래스를 제공한다.
  • InputStream : AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream
  • Reader : BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader, URLReader
  • OutputStream : ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, PipedOutputStream
  • Writer : BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

정의

입출력

  • 프로그램에서 데이터를 외부에서 읽고 다시 외부로 출력하는 작업에 사용하는것을 말한다.
  • 입출력의 예시 : 키보드입력, 파일입출력, 네트워크, 모니터출력

Stream

  • 단방향으로 연속적으로 데이터가 흘러가는것을 말한다. 단방향이라는 특성상 하나의 스트림으로 입력과 출력을 동시에 하는것이 불가능하다. 네트워크 환경에서 데이터 교환을 하기 위해서는 입력스트림과 출력스트림이 따로 있어야한다.

Java NIO

  • 버퍼와 채널기반의 입출력방식을 말한다. 자바4에 처음 등장했다.
  • NIO 방식은 버퍼를 사용하여 여러개의  바이트를 한꺼번에 입출력하는것이 가능하다.

Java NIO2

  • 자바7에 첫등장하였다. 이전 File클래스의 단점들을 보완하여 나왔다.
  • 심볼릭 링크처리 기능과 WatchService 인터페이스를 통하여 어떤파일이 변경되었는지 쉽게 확인하는것이 가능하다.

특징

Java NIO

  • 채널을 사용하여 스트림과 다르게 양방향 입출력이 가능하다. 기존 두개의 스트림으로 처리하던것을 하나의 채널로 처리하는것이 가능하다.
  • 기존 IO방식은 출력 스트림이 1바이트를 쓰면 입력 스트림이 1바이트를 읽는것에 반하여 버퍼를 사용함에 따라 여러개의 바이트를 입출력하는것이 가능하다. IO도 버퍼를 제공해주는 보조 스트림인 BufferedInputStream, BufferedOutputStream을 연결해서 사용하기도 한다.

Java NIO2

InputStream - OutputStream

  • 바이트기반 스트림. 데이터를 byte단위로 입력하고 출력한다.
  • 바이너리 형태 데이터를 다룰때 사용한다. 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 주고받을 수 있다.

Reader - Writer

  • 문자기반 스트림. 데이터를 char문자 단위로 입력하고 출력한다.
  • 문자를 주고받는데 특화되어있다. 바이트 코드를 읽어서 문자로 변환하고 문자를 바이트코드로 변환하여 출력하는것을 처리해준다.
  • 기본적으로 인코딩형식은 JVM의 default charset을 사용한다.
  • 일반적인 텍스트 파일을 읽을때는 Reader와 Writer의 구현클래스를 사용한다.

File

  • 파일크기, 파일속성, 파일이름등 정보를 조회하고 파일생성, 삭제기능을 제공하는 클래스다. OS에 디렉토리를 생성하거나 디렉토리에 존재하는 파일리스틑 조회하는것도 가능하다.
  • 파일의 데이터를 읽고 쓰는 기능은 스트림을 사용해야한다. FileInputStream, FileOutputStream, FileReader, FileWriter가 있다.
  • 단점 : 심볼릭링크,속성,파일의 권한등에 대한 기능이 없다 / 파일들 삭제하는 delete()메소드는 실패시 예외가 발생하지 않고 boolean타입의 결과만 반환한다.

주의해야할점

  • 파일이나 소켓통신으로 다른 회사와 협업하여 데이터를 송수신 처리하며 데이터의 규격을 정의할 때, 필드의 길이가 문자단위인지 byte단위인지 명확하게 정해야한다.

'Java' 카테고리의 다른 글

Java.lang  (0) 2024.03.05
Java Collection  (0) 2024.03.02
Effective Java 정리 #1  (1) 2023.12.10
동기와 비동기, Java Synchronized  (0) 2022.05.28
Servlet서블릿  (0) 2022.05.25