개발/Spring

자바 I/O

728x90

일반적인 웹 개발을 하면서 IO를 다룰 일은 많지 않지만 자바 개발을 계속 하다보면 언젠간 IO를 다룰 일이 생긴다.

 

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

I는 Input, O는 Output의 약자로, 입력과 출력을 통칭 하는 언어로 IO라고 부른다.

 

JVM기준으로 읽을 때에는 Input을 파일로 쓰거나 외부로 전송할 대에는 Output이라는 용어를 사용한다.

 

Input과 Output은 JVM 기준이라는 것을 꼭 기억해두자!(알아두면 헷갈일이 거의 없다)

 

초기 단계의 자바에서는 이러한 IO를 처리하기 위해서 java.io 패키지에 있는 클래스만 제공했다.

 

이 패키지에서는 바이트 기반의 데이터를 처리하기 위해서 여러 종류의 스트립이라는 클래스를 제공한다.

 

읽는 작업은 InputStream, 쓰는 작업은 OutputStream을 통해서 작업하도록 되어 있다.

 

바이트가 아닌 char기반의 문자열로만 되어 있는 파일은 Reader, Writer라는 클래스로 처리한다.

 

자바에서의 스트림은 끊기지 않고 연속적인 데이터를 말한다.

 

JDK 1.4부터는 보다 빠른 IO를 처리하기 위해서 NIO라는 것이 추가되었다.

 

NIO는 스트림 기반이 아니라, 버퍼와 채널 기반으로 데이터를 처리한다.

 

Java 7 에서는 NIO2라는 것이 추가되었다. 파일을 효율적으로 처리하기 위해서 만들어졌고, 기존의 여러 단점들을 보완하고 있다.

 

 

 

자바의 File과 Files 클래스

 

자바에는 java.io 패키지에 file이라는 클래스가 있다. 이 클래스 이름은 File이지만 정확하게는 파일만 가리키는 것이 아니라 파일의 정보도 포함한다.

 

File 클래스는 정보가 불ㅁ분명 하고 심볼릭 링크와 같은 유닉스 계열의 파일에서 사용하는 몇몇 기능을 제대로 제공하지 못한다.

 

그래서 Java7 부터는 NIO2가 등장하면서 java.nio.file 패키지에 있는 Files라는 클래스에서 File 클래스에 있는 메소드들을 대체하여 제공한다.

 

그리고 File 클래스는 객체를 생성하여 데이터를 처리하는 데 반하여, Files 클래스는 모든 메소드를 스태틱으로 선언되어 있기 때문에 별도의 객체를 생성할 필요가 없다는 차이가 있다.

 

File 클래스는 방금 이야기한 대로 파일 및 경로 정보를 통제하기 위한 클래스다. File는 생성한 파일 객체가 가리키고 있는 것이

 

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

 

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

 

하는 등의 기능을 제공한다.

 

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

 

  • 파일의 목록을 가져오거나
  • 경로를 생성하고
  • 경로를 삭제하는 기능도 있다.

 

무엇보다, 메소드를 사용하려면 File 객체를 생성해야 하니 생성자를 살펴보면

 

  • File(File parent. Stirng child) : 이미 생서오디어 있는 File 객체와 그 경로의 하위 경로 이름으로 새로운 File 객체를 생성한다
  • File(String pathname)  : 지정한 경로의 이름으로 File 객체를 생성한다.
  • File(String parent, Sting child) : 상위 경로와 하위 경로로 File 객체를 생성한다.
  • File(URI uri)  : URI에 따른 File객체를 생성한다.

여기서 child라고 되어있는 값은 경로가 될 수 도 있고, 파일 이름이 될 수 도 있다. 그래서 두번째에 있는 pathname만 받는 생성자는 경로만 지정하는 것은 아니다. 만약 전체 경로와 파일이름이 pathname에 지정되어 있을경우에는 파일을 가리키는 File객체가 된다.

 

그리고 URI는 Uniform Resource Identifier의 약자로 어떠한 리소스를 가리키기 위한 경로를 뜻한다.

 

 

 

File 클래스를 이용하여 파일의 경로와 상태를 확인해보자

 

OS마다 각 디렉터리를 구분하는 기호가 다르기 때문에 

 

File.sperator

를 사용하는 것이 좋다.

 

 

파일 객체는 File을 나타내거나 경로를 나타낼 수 있다. 그래서 경로인지 확인하는 메소드 isDirectory()를 이용할 수 있다.

 

File 클래스의 메소드를 사용하여 현재 수행하고 있는 자바 프로그램이 해당 File 객체에 읽거나 스거나 실행할 수 있는 권한이 있는지를 확인할 수도 있다. 이렇게 권한을 확인할 때 사용하는 메소드는 can으로 시작한다.

 

파일이나 경로가 언제 생성되었는지 확인하는 file 클래스의 메소드는 lastModified이다.

 

 

File 클래스를 이용하여 파일을 처리하기

createNewFile()이라는 메소드를 이용하여 비어있는 새로운 파일을 생성할 수 있다.

 

createNewFile() 이라는 메소드는 IOException을 던진다고 정해져 있기 때문에 이와 같이 try-catch로 묶어 주었다.

 

 

'개발 > Spring' 카테고리의 다른 글

Java 8의 새로운 것들, 변경된 것들.  (0) 2021.03.07
자바 Java 제네릭 Generic  (0) 2021.03.05
가비지 컬렉터  (0) 2021.03.01
java.lang 패키지  (0) 2021.02.28
JVM이란?  (0) 2021.02.28