본문 바로가기

프로그래밍/Java

Java I/O

반응형

Java I/O

날짜: 2021년 6월 11일

학습목표

Java I/O 에 대해서 대학생때도 공부를 하지 않은 기억이 있다. 왜 인지는 모르겠지만, 이번 포스팅을 통해서 잘 알아보자.

  • Java의 I/O란?
  • Stream VS Reader&Writer

Java의 I/O란?

I/O는 프로그램에 있는 어떤 내용을

  • 파일에 읽거나 저장할 일이 있을 때
  • 다른 서버나 디바이스로 보낼 일이 있을 때

사용한다.

초기 자바에서는 I/O를 처리하기 위해 java.io 패키지만 제공했다. 바이트 기반의 데이터를 처리하는 Stream클래스, char 기반 문자열로 된 파일을 처리하는 Reader와 Writer를 제공했다.

자바에서 스트림이란? : 끊기지 않고 연속적인 데이터

JDK 1.4부터는 보다 빠른처리를 위해 NIO(New I/O)가 추가되었으며, NIO는 스트림기반이 아니라 버퍼와 채널 기반으로 데이터를 처리한다.

그리고, Java7에서는 NIO2가 추가되었다. NIO보다 더 효율적으로 파일을 처리하기위해 만들어졌다.

(자세한건 나중에 따로 알아보자)

File클래스

자바에는 java.io 패키지에 File클래스가 있다. 이 클래스는 이름은 File이지만, 명확하게는 File뿐 아니라 File의 경로까지 포함한다. 정체가 불분명하고, 싱볼릭 링크와 같은 유닉스 계열의 파일에서 사용하는 몇몇 기능을 제대로 제공하지 못한다. java7부터는 NIO2에 추가된 java.nio.file 패키지의 Files 클래스를 통해 메소드를 제공한다. 토대가 되는 File클래스를 알아보자.

File클래스는 생성한 파일 객체가 가리키고 있는 것이

  • 존재하는지
  • 파일인지 경로인지
  • 읽거나, 쓰거나 실행할 수 있는지
  • 언제 수정되었는지

를 확인하는 기능과

  • 이름을 바꾸고
  • 삭제하고,생성하고
  • 전체 경로를 확인

의 기능도 제공한다.

이외에 File객체가 가리키는 것이 파일이 아닌 경로일 경우, 해당 경로에 있는

  • 파일 목록을 가져오거나,
  • 경로를 생성하고 삭제한다.

의 기능도 있다.

각 메소드를 사용하는 법은 생략한다.

Stream

자바의 I/O는 기본적으로 InputStream과 OutputStream이라는 abstract클래스를 통해서 제공된다.

데이터를 읽을때는 InputStream을, 데이터를 쓸 때는 OutputStream을 사용한다.

InputStream

InputStream의 클래스 선언문을 살펴보자.

public abstract class InputStream
extends Object
implements Closeable

여기서 구현된 Closeable 인터페이스는무엇일까?? 이 인터페이스에는 close라는 메소드만 선언되어 있다. 어떤 리소스를 열었던 간에, 이 인터페이스를 구현하면 close()라는 메소드를 이용해 닫으라는 뜻이다. 참고로 여기서 "리소스"라는 것은 파일이 될 수도 있고, 네트워크 연결도 될 수있다. 스트림을 통해 작업할 수 있는 모든것을 리소라고 생각하면 된다.

다음은 InputStream에서 사용하는 메소드들이다. 간략하게 훑고 넘어가자.


가장 중요한 메소드는 read()와 close()다. 스트림을 읽을 때 read를, 닫을 때 close()를 사용한다. 스트림을 다룰때 다른 메소드는 몰라도 close()는 꼭 호출해야만 한다.

이런 InputStream클래스를 확장한 주요 3개의 클래스는 아래와 같다.

OutputStream

이번에는 OutputStream에 대해 살펴보자.

public abstract class OutputStream
extends Object
implements Closeable, Flushable

InputStream과 다른점은 Flushable 이라는 인터페이스를 추가적으로 구현하고 있다는 점이다.

Flushable 인터페이스는 무엇일까? 이 인터페이스 Closeable과 마찬가지로 1가지 메소드만 선언되어 있으며, 메소드 명은 flush()다.

일반적으로 어떤 리소스에 데이터를 쓸때, 매번 쓰기 작없을 요청시 마다 저장하면 효율이 좋지 않다. 따라서, 대부분 저장 시 버퍼를 갖고 데이터를 쌓아 두었다가 한순간에 데이터를 쓴다.

이때 flush() 메소드는 버퍼에있는 내용을 기다리지 말고 저장해 라는 동작을 한다.

그럼 OutputStream클래스의 메소드를 확인해 보자.

역시 close()는 반드시 호출해야한다!

Reader & Writer

지금까지 살펴본 Stream은 byte를 다루기 위한 것이며, char기반의 문자열을 처리하기 위해서는 Reader와 Writer를 사용해야 한다.

Reader

클래스 선언부와 메소드를 확인해보자.

public abstract class Reader
extends Object
implements Readable, Closeable

InputStream가 겹치는 메소드들이 많은것을 알수 있다.

Reader를 확장한 클래스 중 가장 많이 쓰이는 클래스는

  • BufferedReader
  • InputStreamReader

2가지가 존재한다.

Writer

Writer 클래스의 선언부와 메소드를 알아보자.

public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable

OutputStream클래스에는 없는 Appendable이라는 인터페이스를 구현했다. 각종 문자열을 추가하기 위해서 선언되었다. 마찬가지로 메소드를 알아보자.

이중에서 append() 메소드를 보게되면 CharSequence를 매개변수로 받고 있는것을 볼수 있다.

CharSequence는 인터페이스며, String, StringBuilder, StringBuffer가 구현한 인터페이스다. 즉, append()메소드는 대부분 문자열을 매개변수로 받아 처리한다는 것을 알 수있다.

Writer 클래스는 JDK1.1부터 제공되었는데, 그때는 wirte 메소드뿐이었다. append와 write메소드가 비슷해 보이겠지만, String이 아닌 StringBuffer나 StringBuilder를 쓴다면 append를 쓸것을 권장한다.

Feedback

전체적으로 문법에대한 숙지만 하고 넘어간 포스팅이다. 멘토링때도 크게 물어본 내용은 없던 단원.
여기서 Buffer가 잠깐 나오는데, 과제로도 해야하니 후에 체크하자!

알게된 점

  • Java의 I/O란?
    • Java의 입출력을 말한다.
  • Stream VS Reader&Writer
    • Stream은 바이트형식의 데이터를 처리하기 위한 클래스이고, Reader와 Write는 char기반의 문자열, 즉 텍스트 파일을 읽고 쓰는데 쓰이는 클래스이다.

알아야할 점

  • 버퍼(Buffer)

References

자바의신 VOL2

반응형

'프로그래밍 > Java' 카테고리의 다른 글

Serializable(2)  (0) 2021.06.13
Serializable(1)  (0) 2021.06.11
람다와 스트림의 사용법(2)  (0) 2021.06.10
람다와 스트림의 사용법(1)  (0) 2021.06.10
Thread(1)  (0) 2021.06.02