-
java :: 자바 입출력 패키지IT/Java & JSP & FW 2012. 3. 22. 21:23Byte Stream - 영어, 음악 기타 등등
Character Stream - 영어권을 제외한 모든 나라의 언어
Object Stream - 네트워크를 통해 객체를 주고 받을 수 있다.
Stream?
- Data를 목적지로 Input(읽는다)/Output(쓴다)하기 위한 방법이다.- Stream에 Data를 쓸 수 있고, Stream에서 Data를 읽을 수 있다.- Stream에 Data를 쓸 경우, 이러한 Stream을 output stream이라고 한다.- Stream에서 Data를 읽을 경우, 이러한 Stream을 input stream이라고 한다.
Stream의 특징
Stream은 FIFO 구조이다.
- FIFO구조란 먼저 들어간 것이 먼저 나오는 형태로서 Data의 순서가 바뀌지 않는다는 특징이 있다.Stream은 단방향이다.
- Java에서 Stream은 읽기, 쓰기가 동시에 되지 않는다. 따라서 읽기, 쓰기가 필요하다면 읽는 Stream과 쓰는 Stream을 하나씩 열어 사용해야 한다.Stream은 지연될 수 있다.- System에 있는 file이나 directory를 추상화한 class이다.
- Stream은 넣어진 Data가 처리되기 전까지는 Stream에 사용되는 Thread는 지연상태에 빠진다. 따라서 Network 내에서는 Data가 모두 전송되기 전까지 Network Thread는 지연상태가 된다.
File class- File class를 이용하면 file의 크기, 생성, 삭제, 변경 및 마직막 수정날짜 등 다양한 정보를 알 수 있는 method를 제공하고 있다.
File class의 주요 method
Byte Stream
- Byte Stream은 1byte를 Input/Output 할 수 있는 Stream이다.- 일반적으로 Byte로 구성된 file, 즉 동영상 file, Image file, 음악 file을 처리하기에 적합한 Stream이다.
Byte Stream의 종류
Byte Input Stream의 구조
FileInputStream, ObjectinputStream , DataInputStream, BufferedInputStream 많이 사용한다.
Byte Output Stream 구조
FileOutputStream, ObjectOutputStream, DataOutputStream, PrintStream 많이 사용한다.
Byte Input Stream(InputStream)
- InputStream은 Byte Input을 수행하는 데 필요한 method를 정의하는 추상 class이다.- Java Program은 Object를 생성하고 생성된 Object와 Byte Stream과 연결함으로써 file을 연다.- Java는 다른 장치들과도 Byte Stream을 연결할 되어 있는고 Program이 시작되면 장치들과 연결된 세 개의 Object(System.in, System.out, System.err)를 생성한다.- System.in Object는 Keyboard로 Byte를 Input할 수 있는 InputStream Object이다.
InputStream 의 주요 method
FileInputStream
- FileInputStream은 System에 있는 모든 file을 읽을 수 있는 기능을 제공한다.- file을 읽을 때는 file의 경로와 file Object를 Constructor의 parameter로 설정할 수 있다.- 만약, file이 존재하지 않으면 FileNotFoundException을 발생하게 된다.
- 주요 생성자
DataInputStream
- DataInput Interface는 Input Stream으로부터 기본형 Data를 읽기 위한 method를 정의한다.- DataInput Interface는 Primitive Data Type을 읽을 수 있는 각종 method와 Character를 읽을 수 있는 method를 정의 하고 있다.- DataInputStream class의 Constructor는 한 개로 구성되어 있으며, 어떠한 예외 처리도 되어 있지 않다.
- 주요 생성자
BufferedInputStream (가장 많이 활용)
- Bufferring은 Input/Output 수행을 향상 시킨 기술이다.- Bufferring이란 논리적 Data 덩어리들이 하나의 큰 물리적 Input 연산으로서 file로부터 읽혀서 Buffer로 Input 하는 것을 말한다.- Bufferring을 이용하면 Data를 읽어서 Buffer를 꽉 채우고, 연속된 read() method 호출의 경우는 단지 memory Buffer로부터 Data를 읽어 내는 것일뿐으므로 훨씬 효율적이다.
- 또한 mark 기능과 reset 기능을 구현 추가로 구현하였다.- 주요 생성자
Byte Output Stream(OutputStream)
- OutputStream은 Byte Output을 수행하는 필요한 method를 정의한 abstract class이다.- Program이 시작 되면 장치와 연결된 두 개의 Output Stream은 System.out, System.err를 생성한다.- System.out Object는 화면에 Data를 Output 한다.- System.err Object는 화면에 error Message를 Output하게 된다.
- 주요 method
FileOutputStream
- FileOutputStream은 System에 있는 모든 file에 쓸 수 있는 기능을 제공한다.- 만약 Object를 생성할 때 , file이 존재하지 않으면 FileNotFoundException을 발생하게 된다.- Object가 생성되면 file이 있는 경우에는 file을 생성하지 않으며 file이 없는 경우에는 file을 생성하게 된다.- FileNotFoundException의 의미는 경로가 일치하지 않을 때 발생하는 예외이다. 즉 경로는 일치하고 file이 없는 경우에는 예외가 발생하지 않고 file 생성하게 된다.
- 주요 생성자
BufferedOutputStream
- 이 class를 사용하면 Buffer가 채워질 때마다 한번에 대량으로 Output장치로의 실제 전송이 수행된다.- OutputStream은 Output 속도의 향상을 위해서 flush() method를 정의하고 있다. 하지만 실제로는 구현되지 않았다.- flush란 Buffer가 다 차지 않더라도 Buffer를 비워주는 기능.- flush 기능을 구현한 class가 바로 BufferedOutput-Stream class가 된다.
- 주요 method
PrintStream
- PrintStream은 모든 Data Type을 Output할 수 있는 print(), println() method가 Overloading 되어 있다.- Program이 시작되면 장치와 연결된 OutputStream인 System.out, System.err Object가 PrintStream Object다.
- Java 5.0에서는 PrintStream의 format() method와 printf() method가 추가되어 있기 때문에 이전의 System.out.printf() 나 System.out.format()을 이용해서 Output문을 작성할 수 있었다.
PrintStream은 두 가지 중요한 특징을 가진다.첫번째, 다른 Stream과는 다르게 flush 기능을 자동으로 처리할 수 있는 Constructor를 가지고 있다.두번째, 모든 method의 예외처리를 하지 않았다는 점이다.
Character Stream의 특징Byte Stream에 추가하여 Reader와 Writer class를 제공하는데, 이것은 2Byte를 Input/Output 할 수 있는 Character 기반 Stream이다.Byte Stream은 1Byte를 Input/Output하기 때문에 일반적으로 영문자로 구성된 file, 동영상 file, 음악 file의 Input/Output 등에 적합한 Stream이다.Character Stream은 2Byte를 Input/Output하기 때문에 세계 모든 언어로 구성된 file을 Input/Output 하기에 적합하다
Character Stream의 구조Character Stream은 Reader와 Writer로 나눈다.Character Input Stream – ReaderCharacter Output Stream - Writer
Character Input Stream의 구조
Character Output Stream의 구조Reader
- Reader class는 Character Input Stream의 최상위 abstract class이다.- InputStream class와 거의 같은 method를 제공하고 있으며, 차이점은 Reader class는 2Byte를 읽을 수 있는 method로 구성되었다는 점이다.- 주요 method
FileReader- FileReaderclass는 System에 있는 file을 읽을 수 있는 기능을 제공한다.- file을 읽을 때는 file의 경로, File Object를 Constructor의 parameter로 지정할 수 있다.- file이 존재 하지 않으면 FileNotFoundException 예외를 발생한다.- FileReader class는 Character Stream으로 한Character를 읽기 때문에 화면에 Output하더라도 한글 깨지는 현상이 일어나지 않는다.
- 주요 생성자
BufferedReader
- Byte Input Stream의 BufferedInputStream과 동일한 기능을 제공하는 BufferedReader class는 Character Output Stream의 효율적인 Bufferring을 가능하게 한다.
- 주요 생성자- BufferedReaderclass에는 readLine() method가 추가 되었는데, 이 method는 한 줄 단위로 읽는 method이다.- 이 때, 한 줄의 끝을 ‘\r’,’\n’ 중의 하나가 올 경우 또는 ‘\r\n’이 오는 경우를 한 줄의 끝으로 간주한다.
Writer
- Writer class는 Character Output Stream의 최상위 abstract class이며, OutputStream과 거의 같은 method를 제공한다- Writer class는 2Byte를 Output할 수 있는 method로 구성되어 있다.- 주요 method
FileWriter- FileWriter class는 Character file에 Output할 때 사용하는 class이다.- FileWriter class의 Constructor는 file의 경로, File Object를 이용하여 Object를 생성할 수 있다.- 만약, 경로가 실제로 존재하지 않으면 IOException를 발생하게 된다.(FileNotFoundException예외가 아님)- 주요 생성자
BufferedWriter
- Byte Output Stream의 BufferedOutputStream과 동일한 기능을 제공하며, Character Output Stream의 효율적인 Bufferring을 가능하게 한다.
- 주요 생성자- Object를 생성할 때는 예외처리를 하지 않아도 된다.- 한 줄 내려쓰기를 할 수 있는 newLine() method가 추가되었다.
PrintWriter- PrintWriter class는 다른 Stream과 다르게 Byte Output Stream과 Character Output Stream을 가지고 Object를 생성할 수 있는 class이다.- 자동 flush 기능을 가지고 있다.- PrintWriter class의 Constructor에는 FileNotFoundException 예외를 발생하기 때문에 반드시 예외처리를 해야 한다.
- 주요 생성자
InputStreamReader와 OutputStreamWriterInputStreamReaderByte Input Stream=>Character Input StreamOutputStreamWriterByte Output Stream = > Character Output Stream
※ InputStreamReader의 주요 생성자※ OutputStreamWriter의 주요 생성자Scanner- JDK 5.0에서는 java.util package에 Scanner class를 제공.- Scanner class는 Input 값(Character열, file, Input Stream)을 정규 표현식으로 구분하여 Character열이나 기본 Data type으로 token 할 수 있는 class이다.- 정규 표현식이란 Language을 표현 할 수 있는 Character식을 말한다.http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html
- 이렇게 구분된 token은 다양한 nextXXX() method를 사용하여 다른 type의 값으로 바뀌게 된다.
Scanner class의 Constructor- Scanner class는 parameter로 네 가지 type을 갖는다.- 네 가지 type – File, InputStream, Readable, String- Scanner class는 네 가지 type을 parameter로 구분자나 구분 패턴을 사용하여 Character열이나 Primitive Data type으로 token 할 수 있는 class다.
- 주요 생성자
- 주요 method
Object의 직렬화- Object의 직렬화란 Object를 Stream으로 file에 저장하는 방법.- Object를 직렬화하기 위한 두 가지 방법으로 Serializable과 Externalizable Interface 구현하면 된다.
Serializable- Serializable Interface를 구현한 class를 작성하면 해당 class의 모든 Member변수가 직렬화 대상이 된다.- Object가 Stream을 통해 직렬화 될 때는 Object에 있는 Member변수가 직렬화 되는 것이다.- Object의 Member변수 중에 직렬화 대상에 제외하고 싶다면 transient Keyword를 사용하면 된다.
Externalizable- Externalizable Interface는 Serializable Interface의 Sub Interface이다.- Externalizable Interface를 구현한 class는 위의 두 가지 method를 이용하여 특정 Member 변수만을 직렬화 할 수 있는 기능을 제공한다.
Object Stream- Object를 직렬화 하고 다시 역직렬화 시킬 수 있는 class가 ObjectInputStream과 ObjectOutputStream 이다.
ObjectOutputStream- ObjectOutput Interface를 구현한 class로 Object를 file에 기록 가능한 class이다.- ObjectOutput Interface는 writeObject(Object obj) method를 포함하는데 이 method가 Object의 Data를 직렬화 시켜주는 method(직렬화 method)이다.- 만약 obj가 Serializable Interface로 구현되어 있지 않다면 NotSerializableException 예외가 발생한다.- 보통 직렬화된 Data를 저장할 file 확장자는 “ser”로 한다.
ObjectInputStream- ObjectInput Interface를 구현한 class로 직렬화 된 Object를 읽어올 수 있는 class이다.- ObjectInput Interface는 readObject() method를 포함하는데 이 method는 Object의 Data를 복원 시켜주는 method(역 직렬화 method)이다.
StreamTokenizer- Character Input Stream을 token 단위로 나눠서 관리할 수 있는 class이다.- Character Input Stream을 읽을 때 token의 유형을 Character와 숫자로 구분할 수 있기 때문에 Character와 숫자로 구성된 file을 읽을 유용하게 쓰일 수 있다.
- 주요 생성자- 주요 멤버변수
RandomAccessFile
- Input Stream과 Output Stream의 두가지 기능을 가지고 있는 Stream이며, 기존의 Input Stream과 달리 한 번 읽었던 Input Stream을 다시 읽을 수 있는 Stream이다.
- 주요 생성자
'IT > Java & JSP & FW' 카테고리의 다른 글
java :: 싱글톤 패턴(Singleton Pattern) (0) 2012.04.17 java :: 소켓 socket (2) 2012.03.23 java :: Thread Life cycle (생명주기) & synchronized (동기화) (0) 2012.03.21 java :: Properties class (0) 2012.03.21 java :: Assertion의 설명과 문법 (0) 2012.03.19