- Input과 Output은 JVM기준으로 실행된다.
- java.io 패키지에는 Byte 기반의 데이터를 처리하기위한 Stream(InputStream, OutputStream), char기반의 데이터를 처리하기 위한 Reader, Writer 클래스가 존재한다.
- JDK 1.4 부터는 NIO의 등장으로 Buffer와 Channel 기반으로 데이터를 처리하기 시작했다. 기존 방식보다 성능이 좋다.
ㆍFile
- File 클래스의 객체는 파일, 파일의 경로를 포함할 수 있는 클래스이다.
- java7 에서 NIO2가 도입됨에 따라 java.nio.file 패키지의 Files 클래스에서 File 클래스의 메소드들을 대체하여 사용. File은 객체를 생성하여 처리해야하지만, Files 클래스는 모든 메소드가 static으로 선언되어있어, 객체 생성이 필요없다.
- File 클래스의 생성자의 매개변수에는 '보통 파일 경로'가 포함되며 URI(Uniform Resource Identifier, 리소스를 가리키기위한 경로)를 매개변수로 받는 생성자가 하나 존재한다.
- 경로를 나타내는 문자는 윈도우에서 ' \ ' 기호를 사용한다. 하지만 운영체제별로 이 기호가 상이하므로 File의 static 변수인 separator 를 사용하면 컴파일시 운영체제에 맞게 separator가 변환된다.
File file1 = new File("C:\\gerthread\\test", "test.txt");
// File.separator 변수 사용
File file2 = new File("C:" + File.separator + "gerthread" +
File.separator + "test", "test.txt");
- File 클래스에서 File 객체의 상태를 확인할 수 있는 메소드는 다음과 같다.
File file = new File("C:\\gerthread\\test");
// 파일 객체의 디렉터리가 존재하는지 확인
file.exists();
// 파일 객체의 디렉터리 생성(하위 디렉터리 포함)
file.mkdirs();
// 파일이 디렉터리인지,파일인지, 숨겨져있는지 확인
file.isDirectory();
file.isFile();
file.isHidden();
// 파일의 권한(읽기, 쓰기, 실행)을 확인
file.canRead();
file.canWrite();
file.canExecute();
// 파일이나 경로가 언제 생성되었는지 확인, 리턴값이 long이기 때문에 Date객체로 처리
new Date(file.lastModified());
// 파일이나 경로를 삭제
file.delete();
File file2 = new File("C:\\gerthread\\test", "test.txt");
// 파일을 생성. 파일이 이미 존재할경우 생성하지 않는다.
// createNewFile 메소드는 예외 발생가능성이 있기때문에 예외처리를 필요로한다.
try {
file2.createNewFile();
} catch(Exception e) {
}
디렉터리 목록을 확인하기위한 메소드
- listRoots() : OS에서 사용중인 파일 시스템의 루트 디렉터리 목록을 File 배열로 리턴. (return File[])
- list() : 현재 디렉터리 하위 목록을 String 배열로 리턴
- list(FilenameFilter filter) : 현재 디렉터리의 하위 목록들 중, FilenameFilter의 조건에 맞는 목록만 String 배열로 리턴
- listFiles() : 현재 디렉터리의 하위 목록을 File 배열로 리턴
- listFiles(FilenameFilter filter) : 현재 디렉터리의 하위 목록들 중 filter 조건에 맞는 목록만 File 배열로 리턴
- listFiles(FileFilter filter) : 현재 디렉터리의 하위 목록들 중 filter 조건에 맞는 목록만 File 배열로 리턴
- 메소드에 Filter 객체를 매개변수로 넘겨주면 특정 파일만 목록에 추가할 수 있다.
- 클래스를 특정 파일만 추출하는 filter로 사용하기 위해서는 FileFilter 인터페이스나 FilenameFilter 인터페이스를 구현하고 accept 메소드를 구현해주면 된다. (accept 메소드에서 true를 리턴하는 파일만 목록에 포함된다.)
class TXTFileFilter implements FileFilter {
@Override
public boolean accept(File dir) {
if(dir.isFile()) {
String Name = dir.getName();
if (name.endsWith(".txt")) return true;
}
return false;
}
}
class TXTFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".txt")) return true;
return false;
}
}
//////////////////////////////////////////
public void checkList() {
File file;
try {
file = new File("C:\\Nexton");
File [] fileList = file.listFiles(new TXTFileFilter());
// File객체 경로에서 .txt로 끝나는 파일만 추출하여 배열에 담음
for (File list : fileList) {
System.out.println("File name is " + list.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
- FileFilter은 파일 검사식이 들어가, 파일인지 디렉터리인지 확인할 수 있지만 FilenameFilter은 디렉터리와 파일을 구분할 수 없다.
- 하지만, java 7 이상이라면 Files 클래스를 사용하자.
ㆍStream
- 어떤 대상의 byte 데이터를 읽을 때는 InputStream, 쓸때는 OutputStream의 자식 클래스를 이용하며, Stream은 보통 네트워크를 처리할 때 많이 사용한다.
- InputStream과 OutputStream은 추상 클래스며 이들을 상속 받는 자식 클래스를 사용한다.
- 이 객체들은 사용한 후 close() 메소드로 항상 닫아주어야 한다.
InputStream
- InputStream의 메소드에는 read()가 있다. read() 메소드에 byte 배열을 넘겨주게되면, 해당 byte 배열에 데이터를 담는다.
- InputStream을 확장한 주요 클래스들은 FileInputStream, FilterInputStream, ObjectInputStream 등이 있다.
OutputStream
- OutputStream에는 InputStream과는 다르게 Flushable 인터페이스를 구현하고 있다. Flushable의 인터페이스에는 flush()라는 메소드가 선언되어 있는데, 이 메소드는 버퍼에 쓰려고 대기중인 데이터들을 강제로 저장하는 메소드이다.
- write()라는 메소드의 매개변수로 byte 배열을 넘겨주거나, int 값을 넘겨주면 바이트 값이 스트림에 저장된다.
- FileOutputStream, FilterOutputStream, ObjectOutputStream 등의 InputStream의 자식클래스와 동일한 기능의 클래스가 존재한다.
ㆍReader, Writer
- char 기반의 문자열을 처리하기 위한 클래스로, 보통 텍스트 에디터로 쉽게 볼 수 있는 파일들을 처리한다.
Reader
- read() 메소드로 데이터를 읽을 수 있으며, char 배열이나 CharBuffer 객체를 매개변수로 넘겨주면 해당 배열에 데이터를 저장한다.
- Reader을 확장한 주요 클래스들에는 BufferedReader, InputStreamReader 등이 있다.
Writer
- Writer 클래스에서는 write() 메소드를 사용하여 데이터를 저장할 수 있을뿐만아니라, Appendable 인터페이스를 구현하여 append() 메소드를 통해서도 데이터를 추가할 수 있다.
- append 메소드에서 CharSequence 객체를 매개변수로 받는다는 것을 볼 수 있다. 따라서, String, StringBuilder, StringBuffer등의 문자열 관련 대부분의 객체들을 처리할 수 있다.
- FileWriter 객체는 생성자로 File 객체나 파일 경로를 매개변수로 받아 생성된다.
- 기존 Writer 클래스는 write(), append() 등의 데이터 추가 메소드를 사용하면 메소드를 호출할 때마다 파일에 쓰기때문에 비효율적이다. BufferedWriter은 버퍼에 저장할 데이터를 보관해두었다가 버퍼가 차면 데이터를 저장하기때문에 효율적이다.
- BufferedWriter 객체를 생성할 때는 매개변수로 Writer 객체를 필요로한다.
++)
- java.util에 Scanner라는 클래스는 텍스트 기반의 기본 자료형이나 문자열을 처리하기위한 클래스이다.
- 파일 객체를 매개변수로 하여 Scanner 객체를 생성하면 보다 편하게 파일 데이터를 처리할 수 있다.