☕️Java I/O API
데코레이터 패턴부터 NIO까지
java.io
바이트기반 읽는작업 InputStream 쓰는 작업 OutputStream 클래스
char기반의 문자열로만 되어있는 파일 Reader, Writer 클래스
NIO는 스트림이 아닌 버퍼와 채널 기반으로 데이터 처리
- InputStream
public abstract class InputStream extends Object implements Closeable
- 어떤 리소스를 열었던간에 close() 메소드르 통해 닫아라
- 리소스라함은 파일도 될수있고 네트워크도 될 수 있다.
-
읽을때는 read()로 읽는다.
- InputStream을 확장한 주요 클래스(텍스트보다는 ㅇ바이트코드로 된 데이터)
- AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream
- FilteredInputStream을 확장한 클래스
- BufferedInputStream, CheckedInputStream, CipherInputStream, DataInputStream, DeflaterInputStream, DigestInputStream, InflaterInputStream, LineNumberInputStream, ProgressMonitorInputStream, PushbackInputStream
- OutputStream
public abstract class OutputStream extends Object implements Closeable, Flushable
- Flushable
- flush() : 버퍼에 모아둔것을 한번에 처리
- Reader(char기반의 문자열)
- BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
public abstract class Reader extends Object implements Readable, Closeable
- Writer
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
public void writeFile(String fileName, int numberCount) {
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
fileWriter = new FileWriter(fileName);
bufferedWriter = new BufferedWriter(fileWriter); // decorator 패턴
for (int loop = 0; loop <= numberCount; loop++) {
bufferedWriter.write(Integer.toString(loop));
bufferedWriter.newLine();
}
} catch(IOException ioe) {
ioe.printStackTrace();
} finally {
bufferedWriter.close();
fileWriter.close(); // 중첩 try 생략했지만 Effective JAVA ITEM9 try-with-resource 사용
}
}
- Scanner
- java.util
- 텍스트 기반으 ㅣ기본 자료형이나 문자열 데이터를 처리하기 위한 클래스이다.
- 더 가독성 높고 쉽다.
File file = new File(fileName);
Scanner scanner = new Scanner(file); // 사실 여기서부터 try로 감싸줘야한다.
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
scanner.close()
- Files 클래스로 읽기
- java 7부터
String data = new String(Files.readAllBytes(Paths.get(fileName)));
- java 7부터