-
- 어플리케이션에서 데이터 입출력을 좀 더 편리하게 하기 위해서 사용
- 어플리케이션에서 처리하는 데이터의 형식과 실제로 입출력하는 데이터의 형식이 다른 경우 - 데이터의 입출력 성능을 향상시키기 위해 사용
- 보조 스트림은 단독으로 사용할 수 없다.
- 주 스트림에 결합하여 사용 - 보조 스트림에도 다른 보조 스트림을 연결할 수 있다.(스트림 체인)
보조스트림 변수 = new 보조스트림(일출력스트림);//파일로부터 직접 InputStream 얻기InputStream is = new FileInputStream("...");//문자 변환 보조 스트림을 InputStrem에 결합InputStreamReader reader = new InputStreamReader(is);//BufferedReader 보조 스트림을 문자 변환 보조스트림에 연결(성능 향상 목적)BufferedReader br = new BufferedReader(reader);자주 사용하는 보조 스트림
보조 스트림 기능 InputStreamReader 바이트 스트림을 문자 스트림으로 변환 BufferedInputStream 입출력 성능 향상 BufferedOutputStream BufferedReader BufferedWriter DataInputStream 기본 타입 데이터 입출력 DataOutputStream PrintStream 줄바꿈 처리 및 형식화된 문자열 출력 PrintWriter ObjectInputStream 객체 입출력 ObjectOutputStream
문자 변환 스트림
- 바이트 데이터를 문자로 변환하는 보조 스트림
InputStream을 Reader로 변환
InputStream is = new FileInputSTream("C:/Temp/test.txt");Reader reader = new InputStreamReader(is);//저장된 문자를 읽는 메소드public static String read() throws IOException {InputStream is = new FileInputStream("C:/Temp/test.txt");Reader reader = new InputStreamReader(is, "UTF-8");char[] data = new char[20];int num = reader.read(data);reader.close();String str = new String(data, 0, num);return str;}//저장된 문자를 읽는 메소드public static String read() throws IOException {InputStream is = new FileInputStream("C:/Temp/test.txt");Reader reader = new InputStreamReader(is, "UTF-8"); //문자 변환 보조 스트림 연결BufferedReader br = new BufferedReader(reader); //문자 읽기 편의성을 위한 보조 스트림 추가 연결String str = br.readLine();return str;}- FileReader
- FileReader는 InputStreamReader를 상속받기 때문에 FileInputStream에 InputStreamReader를 연결하지 않고 FileReader를 직접 생성 가능하다.
- 내부적으로는 FileInputStream에 InputStreamReader를 연결한 것과 동일하게 되어 있다.
- FileWriter도 비슷한 구조로 되어 있다.
OutputStream을 Writer로 변환
OutputStream os = new FileOutputStream("C:/Temp/test.txt");Writer writer = new OutputStreamWriter(os);//UTF-8 문자셋으로 파일에 문자를 저장하는 메소드public static void write(String str) throws IOException {OutputStream os = new FileOutputStream("C:/Temp/test.txt");Writer writer = new OutputStreamWriter(os, "UTF-8"); //문자 변환 보조 스트림 연결writer.write(str);writer.flush();writer.close();}
성능 향상 스트림
- 보통 하드 디스크의 입출력 성능에 따라 전체 프로그램의 입출력 성능이 결정된다.
- 하드웨어 구성 요소 중 하드 디스크의 입출력 성능이 가장 떨어지기 때문 - 네트워크 전송 시에는 네트워크 환경의 데이터 입출력 성능에 따라 어플리케이션의 성능이 결정된다.
- 소프웨어적(로직 측면)으로 해결하는 방법에는 분명 한계가 존재하지만 그럼에도 어느 정도 효과는 기대할 수 있다.
- 안하는 것보다는 훨씬 낫다. - 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업함으로써 실행 성능을 향상시킬 수 있다.
- 버퍼를 활용한 입출력 성능 향상
- 데이터 출력
- 데이터가 가득 찰 때만 모아둔 데이터를 하드 디스크로 전송하여 출력 횟수를 줄일 수 있다. - 데이터 입력
- 하드디스크로부터 데이터를 메모리 버퍼에 미리 채워두었다가 필요할 때 데이터를 읽으면 일기 성능을 향상시킬 수 있다.
- 데이터 출력
- 바이트 입출력 성능 향상 보조 스트림
BufferedInputStream bis = new BufferedInputStream(바이트 입력 스트림);BufferedOutputStream bos = new BufferedOutputStream(바이트 출력 스트림);- 문자 입출력 성능 향상 보조 스트림
BufferedReader br = new BufferedReader(문자 입력 스트림);BufferedWriter bw = new BufferedWriter(문자 출력 스트림);- 문자 입력 스트림 Reader에 BufferReader를 연결하면 행 단위 문자열을 읽는 readLine() 메소드를 사용할 수 있다.
//문자 파일을 행 단위로 읽는 코드BufferedReader br = new BufferedReader(new FileReader("..."));while(true) {String strd = br.readLine(); //파일에서 한 행씩 읽음if(str == null) break; //더 이상 읽을 행이 없을 경우(파일 끝) while 문}
기본 타입 스트림
- DataInputStream : 바이트 단위를 기본 타입으로 복원시켜주는 기능 제공
DataInputStream dis = new DataInputStream(바이트 입력 스트림);DataInputStream의 주요 메소드
리턴 타입 메소드 설명 boolean readBoolean() 바이트 단위를 boolean 타입으로 읽음 byte readByte() 바이트 단위를 byte 타입으로 읽음 char readChar() 바이트 단위를 char 타입으로 읽음 double readDouble() 바이트 단위를 double 타입으로 읽음 float readFloat() 바이트 단위를 float 타입으로 읽음 int readInt() 바이트 단위를 int 타입으로 읽음 long readLong() 바이트 단위를 long 타입으로 읽음 short readShort() 바이트 단위를 short 타입으로 읽음 String readUTF() 바이트 단위를 String 타입으로 읽음 - DataOutputStrema :기본 타입 데이터를 바이트 단위로 변환해주는 기능 제공
DataOutputStream dos = new DataOutputStream(바이트 출력 스트림);DataOutputStream의 주요 메소드
리턴 타입 메소드 설명 void writeBoolean(boolean v) boolean 타입을 바이트 단위로 출력 void writeByte(int v) byte 타입을 바이트 단위로 출력 void writeChar(int v) char 타입을 바이트 단위로 출력 void writeDouble(double v) double 타입을 바이트 단위로 출력 void writeFloat(float v) float 타입을 바이트 단위로 출력 void writeInt(int v) int 타입을 바이트 단위로 출력 void writeLong(long v) long 타입을 바이트 단위로 출력 void writeShort(int v) short 타입을 바이트 단위로 출력 void writeUTF(String str) String 타입을 바이트 단위로 출력 - DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어 올 떄는 출력한 순서와 동일한 순서로 읽어야 한다.
- 출력할 때의 순서 : int → Boolean → double
- 입력할 때의 순서 : int → Boolean → double
프린트 스트림
- 프린터처럼 출력해주는 보조 스트림
- 콘솔에 데이터를 출력할 때 사용한 System.out.println()에서 out이 PrintStream 타입이다.
- PrintWriter 바이트 스트림(OutputStream)과 문자 스트림(Writer) 구분하지 않고 모두 연결 가능하다.
- 관례적으로 문자 출력 스트림과 연결해서 사용하는 경우가 많다.
PrintStream ps = new PrintStream(바이트 출력 스트림);PrintWriter pw = new PrintWriter(문자 출력 스트림);PrintStream과 PrintWriter의 주요 메소드
리턴 타입 메소드 설명 void print() 콘솔에 데이터 출력(기본 타입, String, Object) void println() 콘솔에 데이터 출력 후 줄바꿈(기본 타입, String, Object) void printf() 형식화된 문자열(format string) 출력
객체 스트림
- 객체를 입출력 해주는 스트림
- 자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력할 수 있다.
- 직렬화(serialization) : 객체의 필드 값을 나열한 바이트로 변환하는 것
ObjectOutputStream - 역직렬화(deserialization) : 직력화된 바이트를 객체의 필드 값으로 복원하는 것
ObjectInputStream
- 직렬화(serialization) : 객체의 필드 값을 나열한 바이트로 변환하는 것
//바이트 입력 스트림에 역직렬화 보조 스트림 연결ObjectInputStream ois = new ObjectInputStream(바이트 입력 스트림);객체타입 변수 = (객체타입) ois.readObject(); //읽은 바이트 데이터를 역직렬화하여 객체로 생성//바이트 출력 스트림에 직렬화 보조 스트림ObjectOutputStream oos = new ObjectOutputStream(바이트 출력 스트림);oos.writeObject(객체); //객체를 직렬화하는 메소드
Serializable 인터페이스
- Serializable 인터페이스를 구현한 클래스의 객체만 ObjectOutputStream의 writeObject() 메소드로 직렬화가 가능하다.
- String과 Date 등의 클래스는 Serializable 인터페이스를 구현한 클래스이므로 직렬화가 가능하다. - Serializable 인터페이스는 멤버가 없는 빈 인터페이스이며, 직렬화 가능한 객체라는 것을 표시하는 역할만 한다.
- 정적 필드와 transient로 선언된 필드 값은 직렬화 대상이 아니다.
serialVersionUID 필드
- 원칙적으로 직렬화된 클래스와 역직렬화할 클래스의 내용이 동일해야 하지만 직렬화된 필드를 양쪽 클래스 모두 포함하고 있고, serialVersionUID 상수가 같으면 역직렬화가 가능하다.
- serialVersionUID 상수의 값은 클래스마다 고유한 값을 가지는 게 좋다.
- 이클립스에서는 Serializable을 구현한 클래스에 대해 serialVersionUID 상수 값을 고유 식별 값으로 자동 생성해주는 기능이 있다.
File과 Files 클래스
- File 클래스(java.io)와 Files 클래스 (java.nio.file) 공통적으로 파일과 디렉토리에 대한 정보 생성 및 삭제 기능을 제공한다.
File 클래스
//File 객체 생성File file = new File("경로");File file = new File("C:/Temp/file.txt");File file = new File("C:\\Temp\\file.txt");리턴 타입 메소드 설명 exists()의 값 boolean exists() 파일 또는 폴더가 존재하면 true를 리턴
존재하지 않으면 false를 리턴boolean createNewFile() 새로운 파일을 생성 false boolean mkdir() 새로운 디렉토리를 생성 false boolean mkdirs() 경로상에 없는 모든 디렉토리를 생성 false boolean delete() 파일 또는 디렉토리 삭제 true boolean canExecute() 실행할 수 있는 파일인지 여부 true boolean canRead() 읽을 수 있는 파일인지 여부 true boolean canWrite() 수정 및 저장할 수 있는 파일인지 여부 true String getName() 파일의 이름을 리턴 true String getParent() 부모 디렉토리를 리턴 true File getParentFile() 부모 디렉토리를 File 객체로 생성 후 리턴 true String getPath() 전체 경로를 리턴 true boolean isDirectory() 디렉토리인지 여부 true boolean isFile() 파일인지 여부 true boolean isHidden() 숨김 파일인지 여부 true long lastModified() 마지막 수정 날짜 및 시간을 리턴 true long length() 파일의 크기 리턴 true String[] list() 디렉토리에 포함된파일 및 서브 디렉토리 목록 전부를 String 배열로 리턴 true String[] list(FilenameFilter filter) 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 String 배열로 리턴 true File[] listFiles() 디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부를 FIle 배열로 리턴 true File[] listFiles(FilenameFilter filter) 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 FIle 배열로 리턴 true
Flies 클래스
- 운영체제의 파일 시스템에게 파일 작업을 수행하도록 지시하는 정적 메소드로 구성되어 있다.
- 정적 메소드로 구성되어 있으므로 객체를 생헝할 필요가 없다.
메소드 기능 copy 복사 createDirectories 생성 createDirectory createFile createLink createSymbolicLink createTempDirectory createTempFile move 이동 exists 존재 notExists find 검색 mismatch 비교 getLastModifiedTime 속성 getOwner getPosixFilePermissions isDirectory isExecutable isHidden isReadable isSymbolicLink isWritable size setAttribute setLastModifiedTime setOwner setPosixFilePermissions probeContentType list 디렉토리 탐색 newDirectory walk newInputStream 데이터 입출력 newOutputStream newBufferedReader newBufferedWriter readAllBytes lines readAllLines readString readSymbolicLink write writeString - 어플리케이션에서 데이터 입출력을 좀 더 편리하게 하기 위해서 사용