'C'에 해당되는 글 116건

  1. 2007.11.07 입출력 클래스 by 청웨일
  2. 2007.11.06 컬렉션 클래스 > Stack클래스 by 청웨일
  3. 2007.11.06 컬렉션 클래스 > LinkedList클래스 by 청웨일
  4. 2007.11.06 컬렉션 클래스 > Vector클래스 by 청웨일
  5. 2007.11.06 컬렉션 클래스 > ArrayList 클래스 by 청웨일

입출력 클래스

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 청웨일

import java.util.Stack;
public class StackEx {
 public static void main(String[] args) {
  Stack stack = new Stack();          //빈 스택 생성
 
  stack.push(new Integer(1));          //10개의 integer를 스택에 push
  stack.push(new Integer(2));
  stack.push(new Integer(3));
  stack.push(new Integer(4));
  stack.push(new Integer(5));
  stack.push(new Integer(6));
  stack.push(new Integer(7));
  stack.push(new Integer(8));
  stack.push(new Integer(9));
  stack.push(new Integer(10));
 
  while(!stack.empty()) {       
   Integer element = (Integer)stack.pop();  
   //스택이 빌때까지 pop()으로 스택에 있는 모든 요소 제거

   System.out.println("Element: " + element);
  }
 }
}



Element: 10
Element: 9
Element: 8
Element: 7
Element: 6
Element: 5
Element: 4
Element: 3
Element: 2
Element: 1
//나중에 입력된 10부터 제거되었다.

Posted by 청웨일

import java.util.LinkedList;
import java.util.Iterator;


public class LinkedListEx {
 public static void main(String[] args) {
  LinkedList list = new LinkedList();         //빈벡터 생성
 
  list.add(new Integer(1));                      //add로 추가
  list.add(new Integer(2));
  list.add(new Integer(3));
  list.add(new Integer(4));
  list.add(new Integer(5));
  list.add(new Integer(6));
  list.add(new Integer(7));
  list.add(new Integer(8));
  list.add(new Integer(9));
  list.add(new Integer(10));
 
  for(Iterator i = list.iterator(); i.hasNext();) {
   Integer integer = (Integer) i.next();
   System.out.println(integer);
  }
 
  list.remove(5);
  list.set(5, new Integer(66));
 

//연결리스트를 큐로 사용하여 리스트 끝에 객체를 추가
  list.addLast(new Integer(11));
  Integer head = (Integer) list.removeFirst();      //리스트 앞에서 항목 제거
  System.out.println("Head: " + head);                //제거된 값 출력?
 
  for(Iterator i=list.iterator(); i.hasNext();) {
   Integer integer = (Integer)i.next();
   System.out.println(integer);
  }
 }
}



1
2
3
4
5
6
7
8
9
10
Head: 1
2
3
4
5
66
8
9
10
11

Posted by 청웨일

import java.util.Vector;
import java.util.Iterator;


public class VectorEx {
 public static void main(String[] args) {
  Vector vector = new Vector();
 
  vector.add(new Integer(1));
  vector.add(new Integer(2));
  vector.add(new Integer(3));
  vector.add(new Integer(4));
  vector.add(new Integer(5));
  vector.add(new Integer(6));
  vector.add(new Integer(7));
  vector.add(new Integer(8));
  vector.add(new Integer(9));
  vector.add(new Integer(10));
 
  for(int i=0; i<vector.size(); i++) {
   Integer integer = (Integer)vector.elementAt(i);
   System.out.println(i + " = " + integer);
  }
 
  vector.remove(5);
  vector.setElementAt(new Integer(66),5);
 
  for(Iterator i = vector.iterator(); i.hasNext();) {
   Integer integer = (Integer) i.next();
   System.out.println(integer);
  }
 }
}



0 = 1
1 = 2
2 = 3
3 = 4
4 = 5
5 = 6
6 = 7
7 = 8
8 = 9
9 = 10
1                       //0
2                       //1
3                       //2
4                       //3
5                       //4     
66                     //5      5번 위치의 6이 재거되면서 6의 위치에 있던 7이 왔다.

8                       //6      본래 6의 위치에 있던 7이 66으로 재설정되었다.
9                       //7        
10                      //8

Posted by 청웨일

* java.util.ArrayList;



import java.util.ArrayList;
import java.util.Iterator;

//http://memolog.blog.naver.com/kkochi82/34


public class ArrayListEx2 {
 public static void main(String[] args) {
  ArrayList al = new ArrayList();
  //ArrayList 인스턴스 생성
 
  //항목 추가
  al.add(new Integer(1));
  al.add(new Integer(2));
  al.add(new Integer(3));
  al.add(new Integer(4));
  al.add(new Integer(5));
  al.add(new Integer(6));
  al.add(new Integer(7));
  al.add(new Integer(8));
  al.add(new Integer(9));
  al.add(new Integer(10));
 
  for(int i=0; i<al.size(); i++) {
   System.out.println(i + "=" + al.get(i));
  }
 
  System.out.println("5번 제거후 66으로 재설정");
 
  al.remove(5);    //5번 인덱스 요소 제거
  al.set(5,new Integer(66));  //5번 인덱스 값 설정
 
  System.out.println("재설정 후 요소들 출력");
 
  //각 요소들 출력
  for(Iterator i = al.iterator(); i.hasNext();) {
   Integer integer = (Integer)i.next();
   System.out.println(integer);
  }
 }
}



출력 :


0=1
1=2
2=3
3=4
4=5
5=6
6=7
7=8
8=9
9=10
5번 제거후 66으로 재설정
재설정 후 요소들 출력
1
2
3
4
5
66
8
9
10

Posted by 청웨일