본문 바로가기

IO 입출력

Java는 java.io 패키지에서 File 클래스와 여러가지 스트림 클래스를 제공한다.


스트림 클래스는 크게 다음과 같이 두 가지로 나뉜다.


① 바이트 기반 스트림

    - 그림, 문자를 비롯한 모든 종류의 데이터 입출력 가능

    - 1byte 단위로 입출력


② 문자 기반 스트림

    - 문자 데이터만 입출력 가능

    - 2byte 단위로 입출력(Java는 문자를 유니코드로 처리한다.)


InputStream 클래스와 OutputStream 클래스는 바이트 기반 스트림의 최상위 클래스로 

두 클래스 모두 추상 클래스다.


InputStream 클래스는 FileInputStream, BufferedInputStream, DataInputStream 클래스 등을 하위 클래스로 갖고, 

OutputStream 클래스는 FileOutputStream, PrintStream, BufferedOutputStream, DataOutputStream 클래스 등을 하위 클래스로 갖는다.



InputStream 클래스에는 다음과 같은 메소드가 정의되어 있다.


Return Type

 Method

 Description

 int

 read()

 입력 스트림으로부터 1바이트를 읽고 그 값을 리턴한다.

 int

 read(byte[] b)

 입력 스트림으로부터 읽은 바이트들을 b에 저장하고 실제로

 읽은 바이트 수를 리턴한다.

 int

 read(byte[] b, int off, int len)

 입력 스트림으로부터 읽은 바이트를 b[off]부터 len개 

 저장하고 실제로 읽은 바이트 수를 리턴한다.

 void

 close()

 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다.


입력스트림으로부터 1바이트를 읽고 4바이트인 int 타입으로 리턴하므로 리턴한 4바이트중 맨 끝 1바이트에만 데이터가 들어있다.

만약 더이상 읽을 데이터가 없다면 read 메소드는 -1을 리턴한다.

따라서  while(is.read() != -1) 과 같은 방법으로 1바이트씩 모든 데이터를 읽을 수 있다.


다만 100개의 바이트를 읽는다면 read() 메소드를 100번 호출하기보다는 바이트 배열을 버퍼로 사용하는 read(byte[] b) 와  read(byte[] b, int off, int len) 메소드로 읽어오는 것이 루핑 횟수를 줄이는 방법이다.


read(byte[] b, int off, int len) 메소드는 b[off]부터 len개 읽으므로 read(b, 3, 3)와 같이 호출하면

b[3] ~ b[5]에 1바이트씩 저장된다.


또한 InputStream을 더이상 사용하지 않을 경우 close() 메소드를 호출해 InputStream에서 사용한 시스템 자원을 풀어주는 것이 좋다.



OutputStream에는 다음과 같은 메소드가 정의되어 있다.


Return Type

 Method

 Description

 void

 write(int b)

 b의 끝 1바이트를 출력스트림으로 출력한다.

 void

 write(byte[] b)

 출력 스트림으로 b의 내용을 모두 출력한다.

 void

 write(byte[] b, int off, int len)

 출력 스트림으로 b[off]부터 len바이트를 출력한다.

 void

 flush()

 모든 바이트를 출력한다.

 void

 close()

 사용한 시스템 자원을 반납하고 출력 스트림을 닫는다.



String 클래스에는 다음과 같은 생성자와 메소드가 있다.


Constructor

- public String(byte[] bytes)

- public String(byte[] bytes, int offset, int length)


Method

- public byte[] getBytes()


바이트 배열로 문자열을 생성하거나, 문자열의 내용을 바이트 배열로 바꿀 수 있기 때문에

바이트 기반 스트림으로 입출력할 때 유용하다.




Reader와 Writer는 문자 기반 스트림의 최상위 클래스로, 두 클래스 모두 추상 클래스다.


Reader 클래스는 FileReader, BufferedReader, InputStreamReader 등의 클래스들을 하위 클래스로 갖고,

Writer 클래스는 FileWriter, BufferedWriter, PrintWriter, OutputStreamWriter 등의 클래스들을 하위 클래스로 갖는다.



Reader 클래스에는 다음과 같은 메소드가 정의되어 있다.


Return Type

 Method

 Description

 public int

 read()

 입력 스트림으로부터 문자 하나를 읽고 리턴한다.

 public int

 read(char[] cbuf)

 입력 스트림으로부터 읽은 바이트들을 b에 저장하고 실제로

 읽은 바이트 수를 리턴한다.

 public int

 read(char[] cbuf, int off, int len)

 입력 스트림으로부터 읽은 문자를 cbuf[off]부터 len개 

 저장하고 실제로 읽은 바이트 수를 리턴한다.

 public void

 close()

 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다.


마찬가지로 읽어오는 건 문자(2byte)지만 반환형은 int 형이므로 리턴한 4바이트 중 끝의 2바이트에만 데이터가 들어있다. 문자와 바이트의 차이 외에는 InputStream과 동일.



Writer 클래스에는 다음과 같은 메소드가 정의되어 있다.


Return Type

 Method

 Description

 void

 write(int b)

 b의 끝 1바이트를 출력스트림으로 출력한다.

 void

 write(char[] cbuf)

 출력 스트림으로 cbuf의 내용을 모두 출력한다.

 void

 write(char[] cbuf, int off, int len)

 출력 스트림으로 cbuf[off]부터 len바이트를 출력한다.

 void

 write(String str) 

 출력 스트림으로 문자열의 내용을 모두 출력한다.

 void

 write(String str, int off, int len)

 출력 스트림으로 str.subString(off, len)의 내용을 출력한다.

 void

 flush()

 모든 문자를 출력한다.

 void

 close()

 사용한 시스템 자원을 반납하고 출력 스트림을 닫는다.





Java는 파일을 java.io 패키지에서 제공하는 File 클래스로 제어한다.

File 클래스에는 파일의 크기, 이름 등의 정보를 얻거나, 파일을 생성하고 삭제하는 메소드들이 선언되어 있다. 그러나 파일에 데이터를 쓰거나, 파일의 데이터를 읽는 기능은 지원하지 않는다.


File 클래스의 생성자는 다음과 같다.


public File(String pathname)

public File(URI uri)


디렉토리 구분자는 OS마다 다르다. 윈도우는  \ 와  / , UNIX 계열은  / 를 사용한다.

 File.seperator  상수를 출력하면 현재 OS에서 사용하는 디렉토리 구분자를 알 수 있다.



주요 메소드들을 기능에 따라 분류하면 다음과 같다.


① 파일의 존재 여부


 Modifier and Type

Method

 Description

 public boolean

exists()

 파일의 존재 여부 파악


이 메소드로 파일의 존재 여부를 파악한 후 ②의 메소드를 사용해 파일을 생성 또는 삭제할 수 있다.


② 생성 및 삭제


 Modifier and Type

 Method

 Description

 public boolean

 createNewFile()

 파일을 생성한다. 

 public boolean

 mkdir()

 생성자에 주어진 디렉토리를 생성한다.

 public boolean

 mkdirs()

 생성자에 주어진 경로 상의 모든 디렉토리를 생성한다.

 public boolean

 delete()

 파일을 삭제한다.


다음과 같은 파일 객체가 있다고 하자.


File file = new File("C:\\Temp\\test1\\test2\\test3");


Temp 디렉토리에는 아무것도 없다고 하자.

이 경우  createNewFile()  메소드는  IOException 을 발생시키고

 mkdir()  메소드는 디렉토리를 생성하지 않고,  mkdirs()  메소드는 test1, test2, test3 디렉토리를 모두 생성한다.  mkdir()  메소드로 test3 디렉토리가 만들어지려면 Temp 밑에 test1이, test1 밑에 test2가 생성되어야 한다.



③ 파일의 속성 얻기


Modifier and Type

 Method

 Description

 public boolean

 canExecute()

 실행할 수 있는 파일이면 true, 아니면 false를 반환한다.

 public boolean

 canRead()

 읽을 수 있는 파일이면 true, 아니면 false를 반환한다.

 public boolean

 canWrite()

 쓸 수있는 파일이면 true, 아니면 false를 반환한다.

 public boolean

 isDirectory()

 디렉토리면 true, 아니면 false를 반환한다.

 public boolean

 isFile()

 파일이면 true, 아니면 false를 반환한다.

 public boolean

 isHidden()

 숨김 파일이면 true, 아니면 false를 반환한다.



③ 파일의 정보 얻기


Modifier and Type

 Method

 Description

 public long

 length()

 파일의 크기를 반환한다.

 public long

 lastModified()

 마지막 수정 날짜 및 시각을 반환한다.

 public String

 getName()

 파일의 이름을 반환한다.

 public String

 getParent()

 파일의 부모 디렉토리를 반환한다.

 public File

 getParentFile()

 파일의 부모 디렉토리를 File 객체로 반환한다.

 public String

 getPath()

 파일의 전체 경로를 반환한다.

 

부모 디렉토리는 파일이 속한 디렉토리를 의미한다.



④ 파일 목록 얻기


Modifier and Type 

 Method

 Description

 public String[]

 list()

 디렉토리에 포함된 파일과 서브디렉토리 목록을 

 String 배열로 반환한다.

 public String[]

 list(FileNameFilter filter)

 디렉토리에 포함된 파일과 서브디렉토리들 중 filter에 

 맞는 것만 String 배열로 반환한다.

 public File[]

 listFiles()

 디렉토리에 포함된 파일과 서브디렉토리 목록을 

 File 배열로 반환한다.

 public File[]

 listFiles(FileNameFilter filter)

 디렉토리에 포함된 파일과 서브디렉토리들 중 filter에 

 맞는 것만 File 배열로 반환한다.


 list() 의 경우 각 파일과 디렉토리의 이름을 문자열 배열에 저장하고,

 listFiles() 의 경우 각 파일과 디렉토리의 경로로 File 객체를 만들어 File 배열에 저장한다.


'Programming > Java' 카테고리의 다른 글

JVM  (0) 2019.07.04
Managed code  (0) 2019.07.04
자바에서의 배열 선언 및 초기화  (0) 2019.05.08
BigInteger 클래스  (0) 2019.04.17
용어 정리  (0) 2019.04.08