입출력 클래스

C/Java : 2007. 11. 7. 11:48

바이트 지향 스트림 클래스


- java.io.InputStream / 스트림들을 관리하기 위한 정보 제공

                              스트림으로 부터 데이터 읽기, 스트림을 새로운 위치로 내보내기, 스트림 닫기

- java.io.OutputStream /스트림에 데이터 기록, 대상에게 스트림으로 데이터 내보내기, 스트림 닫기

 java.io.InputStream에서 제공하는 메소드
 int available() : 입력 스트림으로부터 읽은 수 있는 바이트 수를 반환한다.
 void close() : 입력 스트림을 받고 스트림과 연관된 시스템 자원을 해제한다.
 void mark(int readlimit) : 입력 스트림에 현재 위치를 표시한다.
 boolean markSupported() : 입력 스트림이 mark와 reset 메소드를 제공하는지 테스트한다.
 abstract int read() : 입력 스트림으로부터 다음 바이트를 읽는다.
 int read(byte[] b) : 입력 스트림으로부터 약간의 바이트 수를 읽고 그것을 버퍼 배열인 b에 저장

 int read(byte[] b, int off, int len) : 입력 스트림으로부터 len으로 지정된 바이트를 읽어서

                                               배열 b에 저장

 void reset() : mark 메소드로 입력 스트림을 마지막으로 호출한 시간에 이 스트림을 재설정한다.
 long skip(long n) : 입력 스트림으로부터 n개의 바이트 데이터를 건너뛰고 버린다.


 java.io.OutputStream에서 제공하는 메소드
 void close() : 출력 스트림을 닫고 스트림과 연관된 어떠한 시스템 자원을 해제
 void flush() : 출력 스트림을 내보내고 버퍼에 저장된 출력 바이트들을 출력
 void write(byte[] b) : 지정된 바이트 배열에서 출력 스트림으로 배열 b의 길이만큼 출력

 void write(byte[] b, int off, int len) : 지정된 바이트의 offset위치에서부터 출력 스트림으로

                                                  len바이트를 출력

 abstract void write(int b) : 출력 스트림으로 지정된 바이트를 출력한다.


*자료를 읽고, 쓰는 대상과 자료형을 살펴야 한다.


*계층도

Object ┌ InputStream    ┌ ByteArrayInputStream

          │                     ├ FileInputStream

          │                     ├ FilterInputStream -----------┬ BufferedInputStream

          │                     ├ ObjectInputStream              └ DataInputStream

          │                     ├ PipedInputStream                

          │                     ├ SequentialInputStream

          │                     └ StringBufferInputStream

          │

          └ OutputStream  ┌ ByteArrayOutputStream

                                  ├ FileOutputStream                ┌ BufferedOutputStream

                                  ├ FilterOutputStream ---------┼ DataOutputStream

                                  ├ PipedInputStream                └ PrintStream

                                  └ ObjectOutputStream            



* FilterStream

- 필터스트림의 생성자에 출력 스트림을 전달한다.-> 출력 스트림 대신에 필터 스트림을 사용할 수 있다.

        - 원본 스트림의 메소드 대신에 필터 스트림의 메소드를 사용 가능하게 한다.

 BufferedInputStream : 많은 데이터를 버퍼로 읽을 수 있는 입력 연산 제공, 작은 단위도 가능
 BufferedOutputStream : 버퍼에 작은양을 저장할수 있는 버퍼 출력연산 제공, 준비되면 비운다.

 DataInputStream : 2진 데이터를 읽을수 있게 허용.

                          double형이면 8바이트로 읽고 스스로 생성해야 한다.

 DataOutputStream : 2진 데이터를 기록할 수 있도록 허용한다.

 PushbackInputStream : 빈 입력 스트림에서 다음 바이트를 볼수 있는 1바이트의 pushback버퍼를

                                유지한다. 데이터의 다음 섹션을 다루는 또 다른 처리에 스트림을 넘긴다.

 PrintStream : 데이터 출력을 위한 메소드 제공, (print()/println())


*파일 입출력

+ 주요 클래스

-+ FileInputStream : 순차적으로 파일로부터 데이터를 읽기 위해 InputStream인터페이스를 제공

-+ FileOutputStream : 순차적으로 파일에 데이터를 기록하기 위한 OutputStream인터페이스 제공

-+ RandomAccessFile : java.io.RandomAccessFile클래스는 임의의 위치에서 읽을 수 있다.

----+ 파일의 특정한 위치로 자유롭게 옮겨다니면서 읽을수 있다.

----+ 한개의 클래스 내에 입출력을 모두 제공한다.

----+ 메소드

-------+ long getFilePointer() : 파일포인터의 현재 위치를 반환

-------+ long length() : 파일의 크기를 반환

-------+ seek(long pos) : 지정된 위치로 파일 포인터를 이동(파일의 시작위치를 기준)

----+ 생성자

-------+ RandomAccessFile(File file, String mode)

-------+ RandomAccessFile(String name, String mode)

-+ File 클래스 : java.io.File클래스는 파일에 대한 정보를 제공한다.

----+ 파일삭제 / 파일이름 변경 / 디렉토리 생성

----+ 파일 분리 문자 ; 윈도우 : 역슬래시(\) / Unix : 슬래시(/)

----+ 메소드

-------+ listFiles() : java.io.File 객체의 배열을 반환한다.

-------+ list() : 디렉토리에 있는 파일들의 파일 이름을 포함한 String 객체의 배열을 반환한다.

*

//파일분리문자를 생성자에 전달하여 새로운 파일을 생성한다.

import java.io.File;

public class FileDirectory {
 public static void main(String[] args) {
  try {
   File f = new File(File.separator);
   if(f.isDirectory()) {   //디렉토리임을 점검 > 참값을 갖게 되면 listFiles()메소드를 호출한다
    File[] files = f.listFiles();         //디렉토리에 모든 파일을 목록에 나열
    for(int i=0; i<files.length; i++) {
     if(files[i].isDirectory()) {
      System.out.println("<dir> " + files[i].getName());
     }
     else {
      System.out.println(files[i].getName());
     }
    }
   }
  }
  catch(Exception e) {
   e.printStackTrace();     //배열리턴
  }
 }
}

*


* 그 외

ByteArrayInputStream : InputStream객체인것처럼 바이트의 배열을 읽는다.

SequenceInputStream : 두개 또는 더 많은 InputStream객체들로부터 데이터를 연결

PipedInputStream : thread 사이의 통신을 위해 사용

ByteArrayOutputStream : 바이트[] 객체로 출력을 내보낸다

PipedOutputStream : thread 통신을 연결하기 위해 PipedInputStream과 통신한다.



문자 지향 스트림 클래스


- java.io.Reader

- java.io.Write


Object ┬ Reader┬ FileReader : 바이트 지향의 FileInputStream과 동일

          │          ├ FileWriter : 바이트 지향의 FileOutputStream과 동일

          │          ├ InputStreamReader : InputStream 객체를 Reader로 변환

          │          ├ OutputReader : OutputStream 객체를 Writer로 변환

          │          ├ BufferedReader : 효율성을 위해 버퍼를 사용하는 Reader

          │          ├ CharArrayReader : Reader 객체로서 문자 배열을 읽는다.

          │          ├ StringReader : Reader 객체로서 String을 읽는다.

          │          └ PipedReader : thread 사이의 통신을 위해 사용

          │

          └ Write  ┬ BufferedWriter : 효율성을 위해 버퍼를 사용하는 Writer

                      ├ CharArrayWriter : 문자배열 char[]에 출력(기록)

                      ├ StringWriter : Writer 객체로서 StringBuffer에 기록

                      │                    String에 Writer를 기록

                      ├ PipedWriter : 스레드 통신의 다른 절반이다.

                      └ PrintWriter : 바이트 지향의 PrintStream과 같다.


 Reader 메소드 : 문자읽기, 건너뛰기, 스트림으로 뛰어 넘을수 있는 마크 설정, Reader 닫기

 abstract void close() : 스트림 닫기
 void mark(intreadAheadLimit) : 스트림에서 현재위치 표시
 boolean markSupported() : 스트림이 mark() 연산을 제공하는지 검사
 int read() : 단일 문자를 읽는다.
 int read(char[] cbuf) : 배열로 문자들을 읽는다.
 abstract int read(char[] cbuf, int off, int len) : 배열의 일부분으로 문자들을 읽는다.
 boolean ready() : 스트림이 읽을 준비가 되었는지 검사
 void reset() : 스트림 재설정
 long skip(long n) : 문자를 건너뛴다.


 Writer 메소드 : 스트림에 데이터 기록, 스트림으로 쓰여진 데이터 비우기, 스트림 닫기
 abstract void close() : 스트림 닫기
 abstract void flush() : 스트림 플러쉬
 void write(char[] cbuf) : 문자 배열을 기록한다.
 abstract void write(char[] cbuf, int off, int len) : 문자 배열의 일부를 기록한다.
 void write(int c) : 단일 문자를 기록
 void write(String str) : 문자열 기록
 void write(String str, int off, int len) : 문자열의 일부를 기록


* Reader/Writer 를 사용하는 파일 입출력

┌ java.io.FileReader

└ java.io.FileWriter   -FileInputStream과 FileOutputStream 클래스에 거의 동등하게 사용


*

//Reader와 Writer를 기반클래스로 해서 FileReader와 FileWriter 인스턴스를 읽고 쓴다.

import java.io.Reader;
import java.io.Writer;
import java.io.FileReader;
import java.io.FileWriter;

public class FileReaderWriterEx {
 public static void main(String[] args) {
  try {
   Reader r = new FileReader("in.txt");
   Writer w = new FileWriter("out.txt");
   int c;
   while((c = r.read()) != -1) {
    System.out.print((char)c);
    w.wait(c);
   }
   r.close();
   w.close();
  }
  catch(Exception e) {
   e.printStackTrace();
  }
 }
}

*


* 바이트와 문자 입출력 클래스

- java는 Reader로 읽는 입력 스트림 클래스와 Writer로 쓰는 출력 스트림 클래스를 위한 도움 클래스를 제공한다.

┌ java.io.InputStreamReader

└ java.io.OutputStreamWriter


* StreamTokenizer - java.io.StreamTokenizer

- 토큰으로 나눔으로써 Reader를 분석하도록 도와주는 유틸리티 클래스

- Reader로부터 반환된 각각의 화이트 문자로 분리된 문자열을 요청할수 있다.

- 단어단위로 반환하는 것으로 생각할 수 있다.

- Reader 에 끝이 있다면 차례로 반환상태를 토큰으로 분석하고

  StreamTokenizer클래스의 public속성으로 유효한 값을 만든다.

Posted by 청웨일