본문 바로가기

Java/information

[자바/JAVA] 보조 스트림

보조 스트림
-스트림 중에 직접 데이터를 읽고 쓰는데 이용하는 스트림이 있고, 다른 스트림에 보조 역할을 하는 스트림이 있다

보조 스트림이란 다른 스트림과 연결이 되어 여러 가지 편리한 기능을 제공해주는 스트림을 말한다.
보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Feader, Writer 등에 연결해서 입출력을 수행한다.
보조 스트림은 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등의 기능을 제공한다.
프로그램은 입력 스트림으로부터 직접 데이터를 읽지 않고, 보조 스트림에서 제공하는 기능을 이용해서 데이터를 읽는다.
반대로 출력 스트림으로 직접 데이터를 보내지 않고 보조 스트림에서 제공하는 기능을 이용해서 데이터를 보낸다.

성능 향상 보조 스트림
프로그램의 실행 성능은 입출력이 가장 늦은 장치를 따라간다.
CPU와 메모리가 아무리 뛰어나도 하드 디스크의 입출력이 늦어지면 프로그램의 실행 성능은 하드 디스크의 처리 속도에 맞춰진다.
네트워크로 데이터를 전송할 때도 마찬가지이다. 느린 네트워크 환경이라면 컴퓨터 사양이 좋아도 메신저와 게임 속도는 느릴 수 밖에 없다.
이 문제에 대한 완전한 해결책은 될 수 엇지만, 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업함으로써 실행 성능을 향상시킬 수 있다.

보조 스트림을 생성할 때에는 자신이 연결될 스트림을 다음과 같이 생성자의 매개값으로 받아야 한다.
보조 스트림 변수명 = new 보조스트림(연결스트림)

BufferedReader 보조스트림은 문자 입력 스트림에 연결되어 버퍼를 제공해주고 한글깨짐방지와 읽기성능향상을 가져온다.

바이트 스트림은 바이트 단위로 입출력을 하기 때문에 자바의 기본 데이터 타입인 boolean, char, short, int, long, float, double 단위로 입출력을 할 수 없다. 그래서 DataInputStream과 DataOutputStream 보조스트림을 연결하여 기본 데이터 타입으로 입출려을 가능하게 한다.
PrintStream과 PrintWriter는 프린터와 유사하게 출력하는 print(), println()메소드를 가지고 있는 보조스트림이다. PrintStream은 바이트 출력 스트림과 연결되고 PrintWriter는 문자 출력 스트림과 연결되는 보조스트림이다.
 우리가 지금까지 계속 사용했던 출력 스트림인 System.in, System.out이 바로 PrintStream 타입이기 때문에 우리는 print(), println()을 계속 사용하고 있었던 것이다.

문자 변환 보조 스트림
소스스트림이 바이트 기반 스트림이면서 입출력 데이터가 문자라면 Reader와 Writer로 변환해서 사용하는 것이 편리하다.
OuputStreamWriter는 바이트 기반 출력 스트림에 연결되어 문자 출력 스트림인 Writer로 변환하는 보조 스트림이다.
InputStreamReader는 바이트 기반 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환하는 보조 스트림이다.

PrintStream과 PrintWriter 보조스트림은 거의 같은 기능과 사용방법으로 활용 가능하다.

File클래스는 파일 크기, 파일 속성, 파일 이름 등의 정보를 얻어내는 기능과 파일 생성 및 삭제 기능을 제공하고 있다. 그리고 디렉토리를 생성하고 디렉토리에 존재하는 파일 리스트를 얻어내는 기능도 있다.

파일 클래스의 여러 메소드들
파일이 있는지 검사하는 file.isFile()메소드
폴더가 있는지 검사하는 file.isDirectory()메소드
숨긴 상태인지 검사하는 file.isHidden()메소드
파일의 존재 유무를 검사하는 file.exists()메소드
파일을 만드는 file.createNewFile()메소드
파일을 삭제하는 file.delete()메소드
마지막 /이후의 단어를 리턴하는 file.getName()메소드
마지막 /직전까지의 문자열을 리턴하는 file.getParent()메소드

열어져있는 파일에는 덮어쓰기가 불가능하다.

다양한 객체를 쓰고 읽기
 객체의 직렬화(serialization):객체를 바이트 배열로 변환해서 데이터 스트림으로 만드는 것을 의미한다. java.io.Serializable이라는 인터페이스로 구현된다.
 역직렬화(deSerialization):파일에 저장되어있거나 네트워크에서 전송된 객체를 입력 스트림으로부터 읽어들여 연속적인 바이트를 객체로 복원하는 것
 자바는 객체를 입출력할 수 있는 두개의 보조 스트림 ObjectInputStream과 ObjectOutputStream을 제공하고 ObjectOutputStream으로 직렬화하기 위해서는 writeObject()메소드를 사용해서 데이터 스트림으로 만들고, ObjectInputStream으로 역직렬화하기 위해서는 readeObject()메소드를 사용해 객체로 다시 만든다.




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

[자바/JAVA] 제네릭 컬렉션 프레임워크  (0) 2023.06.03
[자바/JAVA] generic  (0) 2023.06.01
[자바/JAVA] Stream  (0) 2023.05.25
[자바/JAVA] java.util의 여러 클래스들  (0) 2023.05.23
[자바/JAVA] API와 String 메소드들  (0) 2023.05.19