☕️Java I/O API

데코레이터 패턴부터 NIO까지

2 minute read

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)));
Serializable 인터페이스를 구현한 후에는 serialVersionUID라는 값을 지정해주는 것이 좋다 지정하지않으면 컴파일때 static final long serialVersionUID = 1L; 같은이름의 클래스라도 직렬화해서 여러곳에서 받을때는 다른 클래스일수있으니 식별자를 두는것 ```java class DTO implements Serializable { private int id; transient private int order; // transient 항목은 직렬화에서 빠짐 } // write FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(dto); // read FileInputStream fis = new FileInputStream(filePath); ObjectInputStream ois = new ObjectInputStream(fis); Object obj = ois.readObject; DTO dto = (DTO)obj; ``` 스트림을 쓰지 않고 채널과 버퍼를 사용한다. 비동기 ```java public void writeFile(String fileName, String data) throws Exception { FileChannel channel = new FileOutputStream(fileName).getChannel(); // 스트림에서 채널 byte[] byteData = data.getBytes(); ByteBuffer buffer = ByteBuffer.wrap(byteData); channel.write(buffer); channel.close(); } public void readFile(String fileName) throws Exception { FileChannel channel = new FileInputStream(fileName).getChannel(); //스트림에서 채널 ByteBuffer buffer = ByteBuffer.allocate(1024); channel.read(buffer); buffer.flip(); // 데이터의 가장 앞으로 이동 while (buffer.hasRemaining()) { System.out.print((char)buffer.get()); // get() 한바이트씩 읽음 } channel.close(); } ``` Buffer 클래스류는 java.nio.Buffer클래스를 확장 - CharBuffer, DoubleBuffer, FloatBuffer, … int capacity() -> 버퍼에 담을 수 있는 크기 int limit() -> 버퍼에서 읽거나 쓸 수 없는 첫 위치 int position() -> 현재 버퍼의 위치 0 <= position <= limit <= capacity 소켓통신 ![](https://develup4.github.io/bear_to_github_blog_template/assets/images/257aa9a547de6e8d4a89007995884e69/IMG_1340%202.HEIC) ![](https://develup4.github.io/bear_to_github_blog_template/assets/images/257aa9a547de6e8d4a89007995884e69/IMG_1341.HEIC) ![](https://develup4.github.io/bear_to_github_blog_template/assets/images/257aa9a547de6e8d4a89007995884e69/IMG_1342.HEIC) ![](https://develup4.github.io/bear_to_github_blog_template/assets/images/257aa9a547de6e8d4a89007995884e69/IMG_1343.HEIC)

Categories:

Updated: