- [Java 기본] JAVA File I/O

Posted by 겨울에
2011. 5. 14. 16:31 scrap/ Java/JSP
출처 : http://cafe.naver.com/litave/403


//===========================================================================//
  본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
    기본으로 하여 정리하였습니다.
  - 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
  작성자 : litwave
//---------------------------------------------------------------------------//

<목차>
1. Java I/O
2. I/O 관련 클래스
3. 자료형
4. I/O 관련 클래스 상세정보
5. Serializable
7. FileDialog

//---------------------------------------------------------------------------//

 

1. Java I/O
  - 컴퓨터는 복잡하고 많은 데이타의 저장 및 읽기가 쉽게 사용할 수 있도록 하기 위해서 나오게 되었다.
  - Java I/O  -> Byte형식 -> Stream
    o Java는 모든 형식을 바이트 단위로 처리하게 되어 있고, 이런 형식을 Stream이라고 이야기 한다.

  - Stream은 두가지 형식의 작용을한다.
    1) 사이펀 작용 : 파일 읽기, 네트웍에서 데이타를 가져오기, 키보드 로 입력 받기(무한)
       - 물을 계속 적으로 끓어오는 작업
    2) 호스 작용 :  파일에 데이타를 쓰기, 네트웍으로 데이타 전송하기, Console로 출력하기

2. I/O 관련 클래스
  1File
  2OutputStream
  3InputStream
  4Writer
  5Reader
  6ObjectOutputStream
  7ObjectInputStream
  8RandomAccessFile

3. 자료형
  3.1 정수형
    1byte : 기본적인 입.출력을 담당하는 자료형(-128~127 : 전송되는 타입은 0~255 의 범위로 입력을 받을 수 있다.)
    2short : 다른 언어와 호환하기 위해서 나온 자료형이다.(C언어에서는 기본 데이터 처리 단위가 2바이트 이기 때문)
        - 거의 사용 안함
    3int : Java의 기본적인 타입의 자료형이다.
    4long

  3.2 문자형
    1char :(0~65535)
        - char 형은 (byte * 256 + byte) 로 자동 형변환이 이루어진다.

    2) 문자형
      a) ASSCII - 7bit(0~127)
        - 0~3132127 : white Character (화면에 표시되지 않는 제어 문자들) 라고 한다.

      b) ISO Latin-I : 8bit (0~255를 가지는 문자) 
        - 컴퓨터에서 사용하는 대부분의 타입
          0~127 : ASCII와 동일하다.
          128~255 : 대부분의 서구 유럽어들을 표시할수 있다.

      c) Unicode - 16bit(0~65535)
          0~255 : ISO Latin-I 과 동일
          256~65535 : (한국어, 일본어, 그리스어 등을 표시하기 위해 만듬)
        - 숫자 및 문자로 표시할 수 있다.
        - 매칭되는 데이타 타입을 표시할 수 없을 경우에는 '\u????' 로 표시 가능하다.
    
      d) UTF-8 : 24bit(3byte)           //우리가 자주사용해야 하는 타입
        - 유니코드타입에서의 메모리 낭비 단점을 보안하기 위해서 나옴
          0~255 : ISO Latin-I(1byte)
          256~2175 : Unicode(2Byte) 타입
          2176~? : 3byte
        - 자바 파일을 컴파일 하면 .class 파일은 자동으로 UTF-8 타입으로 바뀌게 된다.     


4. I/O 관련 클래스 상세
  4.1 File
    1Constructor Summary
      new File(FileString)    // File:경로, String:파일명(경로와 동시에 파일명을 적어도 됨)
      new File(String)          //경로와 파일명을 동시에 적고, 경로를 적지 않으면 현재 디렉토리를 의미 한다.
      new File(StringString)
      new File(URL)             // 웹상에 특정 문서를 연결 시켜 줄 수 있는 생성자

    2Method Summary
      - Ex0202_01.java 파일 참조

      - canRead()  : 파일의 읽기를 할수 있는지 확인 하는 것.
      - canWrite() : 파일을 쓸수 있는지 확인 하는 것..
  
      File file = new File("MyFile.txt")
      - file.createNewFile()    : 특정 파일을 생성
      - file.delete()           : 특정 파일을 삭제

      - file.getName()          : 해당 파일의 이름을 가져옴
      - file 만 쓰면 뒤에 toString() 가 생략된 형태

      - file.list()             : 특정 디렉토리에 있는 모든 파일을 리턴
                                : 디렉토리에 있는 파일들을 String객체로 얻어 온다.
      - mkdir()                 : 디렉토리 형태로 파일 만들기.(마지막 하나의 디렉토리만 생성, 앞의 경로가 정확히 일치해야 한다.)
      - mkdirs()                : 경로명과 디렉토리를 모두 만들고 싶을때 사용

  4.2 OutputStream  :  대상체에 출력을 한다.
    - 파일을 출력하는 최상위 클래스 이다.
    - OutputStream : 추상 클래스로 바로 객체 생성이 불가능 하다.
    1Method Summary
      - write(int i)         //버퍼로 추력하는 것
      - write(byte[])
      - write(byte[], int start , int end)
      - flush()              // 버퍼가 차지 않아도 버퍼의 내용을 모두 보낸다. => Ex0202_02.java
      - close()

    2OutputStream 의 상속관계
       OutputStream - FileOutputStream(파일과 연계해서 사용할 때 사용 가능)
                    - ByteArrayOutputStream(데이타를 바이트 단위로 쪼개어서 보낼때 사용.(데이타 전송시 사용))
                    - PipedOutputStream(쓰레드간의 통신을 위해서 나온 클래스)
                    - FilterOutputStream(필터기능 포함)  - BufferedOutputStream(버퍼를 사용하도록 해둠)
                                                         - PrintStream(System.out과 연계해서만 사용됨)
                                                         - DataOutputStream(데이타에 우선을 두어 전송을 하도록 사용)
       - 과제 ) OutputStreamInputStreamWriterReader // 의 상속관계 위와 같이 그려 오기(과제1)

    3) 임의의 OutputStream 을 생성해여 redirection 시키는 방법  => Ex0202_03 : 화면 상에 아무것도 출력되지 않게 됨.
        - System.out.println => 화면 이외의 곳으로 출력하는 방법
          System.setOut(ps); 
          System.setErr(ps);    // 임의의 곳으로 접근 권한을 옮김.
                                // println은 무조건 write를 이용하도록 되어 있다.

    4FileOutputStream
      - 매개변수로 파일 객체를 받을 수 있다.
      - 해당 파일의 접근 권한을 갖게 된다.
        사용예-> Ex0202_04
      - 파일을 열면 닫아야 한다.

    5BufferedOutputStream 
      - 버퍼에 한꺼번에 담았다가 스트림 단위로 내보낸다.
      - 파일을 버퍼에 한꺼번에 담았다가 출력하는 것이 빠르기 때문이다..

    6DataOutputStream
      - 특정 데이터를 포맷된 데이터로 전송할 수 있다

    7) 파일에서 -1은 파일의 끝을 의미 한다.

  4.3 InputStream
    1InputStream 의 상속관계
        InputStream - FileInputStream    : 파일과 연계하여 파일을 읽어 온다.
                    - ByteArrayInputStream
                    - PipedInputStream
                    - FilterInputStream  - BufferedInputStream
                                         - DataInputStream
                    - SequenceInputStream : 파일을 연결 시켜서 여러개 연결 시킬때 사용한다.

       - System.in은 BufferedInputStream 과 연결 되어 있다.
       - 리다이렉션 시켜서 다른 파일에서 입력을 받을 수 있다.

    2Method Summary
      - int <- read()   : int로 리턴 된다. 사용범위는 0~255이다. ctrl+z는 -1(End Of File:ctrl+z/ctrl+d, \n)이 리턴된다.  리턴된다.
      - read(byte[])    : byte단위로 입력됨.
      - read(byte[], int(시작위치), int(개수));
      - close();
      - mark(?)    //특정한 파일에서 몇번 연속해서 읽기 위해서 mark(n) : n번째위치에 마킹표시
      - reset();   //특정위치에서 mark된 위치로 돌아감.


  4.4 Writer
      - Writer 와 Reader 는 2바이트 단위의 흐름을 가진다.
    1Writer 관련 클래스
      Writer - FileWriter
             - OutputStreamWriter
             - BufferedWriter
             - PrintWriter
  
    2) 클래스 사용
      2.1FileWriter fw = FileWriter(---);  //파일의 접근 권한을 연다.  
                                             //파일에 대한 정상적 접근을 위해서 만듬
      2.2OutputStreamWriter osw = OutputStreamWriter(System.out 혹은 네트웍 Output);
          // console과 network에 대한 정상적 접근을 위해서 만들어 놓았다.
      2.3BufferedWriter bw = new BufferedWriter(osw);
          // osw나 fw를 담아서 이용하면 버퍼를 이용하겠다는 것을 의미 한다.
      2.4PrintWriter pw = new PrintWriter(bw);
          // pw.println("하하하"); 처럼 처리할 수 있다.
          -> 파일, 네트웍, 화면으로의 출력을 섞어 가며 출력하고 싶다면.. -> Ex0204_01.java
          - 하나의 코딩으로 매개 변수만 바꿔 가며, 여러개의 형식에 맞추어 출력 할수 있다.


  4.5 Reader
    1Reader 상속 관계
      Reader - FileReader
             - InputStreamReader
             - BufferedReader

    2) 사용예
      FileReader fr = new FileReader(---);       //파일로 부터 2바이트 단위로 데이타를 읽어 온다.
      InputStreamReader isr = new InputStreamReader(System.in 혹은 네트웍 입력);    //키보드로 부터의 입력 또는 네트웍 입력
      BufferedReader br = new BufferedReader(fr 혹은 isr)


5. Serializable
    - Object I/O 는 Stream 입출력 이다.
    - 객체단위로 입출력이 될 수 있는 단위는 직렬화가 되어 있어야 한다.
    - 데이타를 주고 받는데 아무 문제가 없는 형태를 직렬화라고 한다. (예:Serializable)

  1) 직렬화 되지 않은 클래스
    - 데이타를 한번에 읽을수 없는 형태는 직렬화가 아니다.
    - 그래서.. 이것을 컴퓨터가 입력 받을 수 있는 형태로 만들어 주어야 한다. 그것을 직렬화라고 한다.
    class A {
      int x;
      float y;
      double z;
   }

  2) 직렬화 된 클래스
    class A implements Serializable {
      int x;
      float y;
      double z;
    }

  3Serializable 은 인터페이스이고, 메소드를 하나도 안 가지고 있다.
     그래서 implements Serializable 만하면 직렬화가 된다.

6. Object I/O
  1Object 출력
    File f = new File(---);
    FileOutputStream fos = new FileOutputStream(f);
    ObjectOutputStream oos = new ObjectOutputStream(fos);   //버퍼를 이용해도 상관 없다.
      -  oos 를 객체 단위로 담을 수 있다.

    A ap = new A();
    oos.writeObject(ap);   //객체가 하나 전송되어 저장되었다. f라는 파일속에 객체하나를 저장 했다. 
                           //vector 도 vector만 적으면 저장할 수 있다.
    oos.close();
    fos.close();

  2Object 입력
    File f = new File(---);
    FileInputStream fis = new FileInputStream(f);
    ObjectInputStream ois = new ObjectInputStream(fis);     // 오브젝트 타입으로 객체를 입력 받을 수 있다.
                                                            // 클래스 캐스팅 Exception이 발생 할 수도 있다.
                                                            // 해당 클래스가 없을 수 있기 때문에 ClassNotFoundException 처리도 해 주어야 한다.
    A bp = (A)ois.readObject(); // Object 타입으로 불려짐으로 캐스팅 해주어야 한다.
    cis.close();
    fis.close();

7. FileDialog
  - 예 :  -> Ex0204_03
    String dir =  fd.getDirectory();
    String file = fd.getFile();
        을 통해서 파일을 읽어 올 수 있다.
    -> 취소를 누르면.. null이 넘어 온다.
    -> 확인을 하면 디렉토리(fd.getDirectory())와 파일명(fd.getFile())이 넘어 온다.
        - Ex0202_10.java  그림그리기 파일에 열기 저장 기능 추가


8. RandomAccessFile
    - 하나의 클래스로부터 입력과 출력을 동시에 처리 할 수 있는 클래스 이다.

    1) 생성
        RandomAccessFile raf = new RandomAccessFile("파일명""mode:속성");

    2) mode 속성
      r    - 읽기 전용으로 열겠다..
      rw   - 읽기와 쓰기 동시에 가능 하도록 연다.
      rwd  - 데이타가 변형되었을때 자동으로 강제적으로 데이타를 집어 넣는 방식.. // file만 변한 경우
      rws  - 데이타가 변형되었을때 자동으로 강제적으로 데이타를 집어 넣는 방식.. // file + metadata(파일의 주변 데이타) 동시에 변한경우
        - write 및 read 관련 모든 Method를 사용이 가능 하다.
        - 파일의 전체 길이를 구한 후 seek 메소드를 통해서 해당 위치부터 추가 시킬 수 있다.
           -> 예) seek(3) 으로 처리 할 수 있다.

    3) 예 : Ex0204_04.java

//---------------------------------------------------------------------------//
// 수업중 소스
// Ex0202_01.java : File 클래스 테스트
import java.io.*;

public class Ex0202_01 {
    public static void main(String [] ar) {
/*  파일 읽기 쓰기 확인
        File f = new File("test.txt");
        if(f.canRead() && f.canWrite()) {
          System.out.println(f + "는 읽기 + 쓰기");
        }
        else if(!f.canRead() && f.canWrite()) {
          System.out.println(f + "는 쓰기 전용");
        }
        else if(f.canRead() && !f.canWrite()) {
          System.out.println(f + "는 읽기 전용");
        }
*/
/*
        File f =  new File("MyFile.txt");   //새로운 파일 만들기
        try {
            f.createNewFile();
        } catch(IOException ee) { }
*/
/* 파일이 있는 것을 확인 후 특정 파일 삭제 하기
        File f = new File("test2.txt");     
        if(f.exists()) {
            if(f.delete()) {
                System.out.println(f + "를 지웠다.");
            } else {
                System.out.println(f + "를 못 지웠다.");    
            }
        } else {
          System.out.println("해당하는 파일 " + f + " 가 없습니다.");
        }
*/
// 0121 폴더내의 파일 정보 알아 오기
        File f = new File("D:\\G03_academy_data\\FreshCamp\\030202\\강사코딩");
        if(f.exists() && f.isDirectory()) {
            String[] str = f.list();
            for(int i=0; i < str.length; i++) {
                System.out.println(i + "번째 파일 : " + str[i] 
                            + ", 길이 : " +  (new File(f, str[i])).length() + "byte");      //크기 값 알아오기
            }
        } else {
          System.out.println("디렉토리가 아니거나 해당하는 파일이 없습니다.");
        }

/*
    File f = new File("c:\\A\\B\\C\\D\\E");
        f.mkdir(); //에러 발생
        f.mkdirs();   // 실행가능
*/


    }
}

//---------------------------------------------------------------------------//
// Ex0202_02.java : byte 데이터로 출력하기
public class Ex0202_02 {
  public static void main(String [] ar) {
        System.out.write(65);
        System.out.flush();
        byte[] bb = {'A', 'B', 'C'};
        System.out.println();
        try {
            System.out.write(bb);
        } catch(java.io.IOException ee) {}
        System.out.println();
        byte[] bbb = "Hello Java!".getBytes();   //byte 배열로 바꿔줌.
        System.out.write(bbb, 36);
      System.out.println();
    }
}


//---------------------------------------------------------------------------//
// Ex0202_04.java : System.out.println 출력 Stream 파일로 변경 하기
import java.io.*;

public class Ex0202_04 {
  public static void main(String [] ar) {
        File f = new File("./abc.txt");
        if(!f.exists()) {
            try {
                f.createNewFile();
            } catch (Exception ee) { }
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(f);
        } catch (Exception ee) { }
        if(f.canRead() && !f.canWrite()) {
            System.out.println("해당 파일은 읽기전용입니다.");
            return;
        }
        PrintStream ps = new PrintStream(fos);
        System.setOut(ps);
        System.setErr(ps);
        System.out.println(65);
        System.out.println("Hello Java !");
        System.out.close();
    }
}


//---------------------------------------------------------------------------//
// Ex0203_05.java : 키보드 입력 파일로 출력하기
import java.io.*;
public class Ex0203_05 {
    public static void main(String[] ar) {
        if(ar.length == 0){
            System.out.println("Usage : java Ex0203_05 파일명.확장자");
            return;
        }
        File f = new File(ar[0]);
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            fos = new FileOutputStream(f);
            bos = new BufferedOutputStream(fos);
            System.out.print("데이터를 입력하세요 : ");
            while(true) {
                int xx = System.in.read();
                if(xx == 10) {
                    break;
                }
                bos.write(xx);
            }
            bos.close();
            fos.close();
        } catch(IOException ee) { }
        
    }
}

//---------------------------------------------------------------------------//
// Ex0203_06.java : DataOutputStream 을 이용한 파일 저장
// Ex0203_07.java : DataInputStream 을 이용한 파일 읽기
import java.io.*;
public class Ex0203_06 {
    public static void main(String[] ar) throws IOException {
        File f = new File("myfile.imsi");
        if(!f.exists()) {
            f.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(f);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        DataOutputStream dos = new DataOutputStream(bos);
        int x = 10;
        float ff = 20.3f;
        double d = 40.5;
        char c = 'A';
        dos.writeInt(x);
        dos.writeFloat(ff);
        dos.writeDouble(d);
        dos.writeChar(c);
        dos.close();
        bos.close();
        fos.close();
    }
}

import java.io.*;
public class Ex0203_07 {
    public static void main(String[] ar) throws IOException{
        File f = new File("myfile.imsi");
        FileInputStream fis = new FileInputStream(f);
        BufferedInputStream bis = new BufferedInputStream(fis);
        DataInputStream dis = new DataInputStream(bis);
        System.out.println("int = " + dis.readInt());
        System.out.println("float = " + dis.readFloat());
        System.out.println("double = " + dis.readDouble());
        System.out.println("char = " + dis.readChar());
        dis.close();
        bis.close();
        fis.close();
    }
}


//---------------------------------------------------------------------------//
// Ex0204_01.java : PrintWriter을 이용하여 Console로 데이터 보내기
import java.io.*;
public class Ex0204_01 {
    public static void main(String [] ar) {
        OutputStreamWriter osw = new OutputStreamWriter(System.out);
        BufferedWriter bw = new BufferedWriter(osw);
        PrintWriter pw = new PrintWriter(bw);
        pw.println("안녕하세요!");
        pw.println("홍혁기 입니다.");
        pw.println("반갑습니다.");
        pw.flush();
    }
}


//---------------------------------------------------------------------------//
// Ex0204_02.java : 파일을 읽어서 화면에 출력하기
import java.io.*;

public class Ex0204_02 {
    public static void main(String [] ar) throws IOException {
        if(ar.length == 0) {
            System.out.println("Usage : java Ex0204_02 파일명");
            System.exit(0);
        }
        
        File f = new File(ar[0]);
        FileReader fr = new FileReader(f);         //2byte 로 접근 권한을 열어 놓음
        BufferedReader br = new BufferedReader(fr);
        while(true) {
            String imsi = br.readLine();
            if(imsi == null) {
                break;
            }
            System.out.println(imsi);
        }
        br.close();
        fr.close();
    }
}


//---------------------------------------------------------------------------//
// Ex0204_10.java : 그림판에 그린 그림 Object 형태로 파일로 저장/읽기 기능 구현
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

class Ex0204_10_Sub1 implements Serializable {
    private int xy, x1, y1, dist;
    private Color color = new Color(000);
    private boolean fillok = false;
    Ex0204_10_Sub1(int xint yint x1, int y1, int dist, Color color, boolean fillok) {
        this.x = x;  this.x1 = x1;
        this.y = y;  this.y1 = y1;
        this.dist = dist;   this.color = color;
        this.fillok = fillok;
    }
    public int getX() {
      return x;
    }
    public int getY() {
      return y;
    }
    public int getX1() {
      return x1;
    }
    public int getY1() {
      return y1;
    }
    public int getDist() {
      return dist;
    }
    public Color getColor() {
      return color;
    }
    public boolean getFillOk() {
      return fillok;
    }
}

class Ex0204_10_Sub extends Frame implements MouseListenerMouseMotionListenerActionListenerItemListener {
    private Vector vc = new Vector();
    
    //Fram initialization용 Field
    private CheckboxGroup cgb1 = new CheckboxGroup();
    private Checkbox cb1 = new Checkbox("연필"true, cgb1);
    private Checkbox cb2 = new Checkbox("직선"false, cgb1);
    private Checkbox cb3 = new Checkbox("사각형"false, cgb1);
    private Checkbox cb4 = new Checkbox("원"false, cgb1); 
    
    //Menu용 Field
    private MenuBar mb = new MenuBar();
    private Menu file = new Menu("파일");
    private   MenuItem fnew = new MenuItem("New");
    private   MenuItem fopen = new MenuItem("Open");
    private   MenuItem fsave = new MenuItem("Save");
    private   MenuItem fexit = new MenuItem("Exit");
    private Menu tool = new Menu("도구");
    private Menu option = new Menu("옵션");
    private   MenuItem osetcolor = new MenuItem("색상");  
    private   CheckboxMenuItem ofill = new CheckboxMenuItem("채우기"false);
    private   CheckboxMenuItem ounfill = new CheckboxMenuItem("비우기"true);
    
    //색상 설정 다이얼 로그 박스 만들기
    private Dialog dlg = new Dialog(this"Color"true);
    private Label dlglb = new Label("red = "Label.RIGHT);
    private Label dlglb1 = new Label("green = "Label.RIGHT);
    private Label dlglb2 = new Label("blue = "Label.RIGHT);
    private TextField dlgtf = new TextField("0");
    private TextField dlgtf1 = new TextField("0");
    private TextField dlgtf2 = new TextField("0");
    private Button dlgbt = new Button("preview");
    private Button dlgbt1 = new Button("set");
    private Button dlgbt2 = new Button("cancel");
    
    //화면 크기 생성용
    private Toolkit tk = Toolkit.getDefaultToolkit();
    private Dimension di = tk.getScreenSize();
    
    private int xy, x1, y1;
    private Color color = new Color(0,0,0);
    //x = y = x1 = y1 = 0;

    private Ex0204_10_Sub_Can hsc = new Ex0204_10_Sub_Can(this);

    Ex0204_10_Sub(String str) {
        super(str);
        this.setLayout(new BorderLayout());
        setSize(500400);      //Frame 크기 설정
        //Frame를 화면 정 중앙에 배치
        Dimension di1 = this.getSize();   
        setLocation((int)(di.getWidth()/2-di1.getWidth()/2),
                    (int)(di.getHeight()/2-di1.getHeight()/2));   
        init();
        start();
        
        setVisible(true);
    }
    //Frame의 초기화
    public void init() {
        this.setLayout(new BorderLayout(5,5));
        initMenu();        //메뉴 초기화
        initDlg();
        this.add("Center", hsc);
        Panel p1 = new Panel(new GridLayout(1,5));
        p1.setBackground(Color.green);
        p1.add(new Label());
        p1.add(cb1);
        p1.add(cb2);
        p1.add(cb3);
        p1.add(cb4);
        this.add("South", p1);
    }
    private void initDlg(){
        dlg.setLayout(new BorderLayout());
        dlg.setLocation(400,300);
        Panel p = new Panel(new GridLayout(31));
        p.add(dlglb);
        p.add(dlglb1);
        p.add(dlglb2);
        dlg.add("West", p);
        Panel p1 = new Panel(new GridLayout(31));
        p1.add(dlgtf);
        p1.add(dlgtf1);
        p1.add(dlgtf2);
        dlg.add("Center", p1);
        dlg.add("East", dlgbt);
        Panel p2 = new Panel(new FlowLayout(FlowLayout.RIGHT));
        p2.add(dlgbt1);
        p2.add(dlgbt2);
        dlg.add("South", p2);
        dlg.setSize(200150);
    }
    //Menu의 초기화 Method
    public void initMenu () {
        this.setMenuBar(mb);
        mb.add(file);
            file.add(fnew);
            file.addSeparator();
            file.add(fopen);
            file.add(fsave);
            file.addSeparator();
            file.add(fexit);
        mb.add(option);
            option.add(osetcolor);  
            option.addSeparator();
            option.add(ofill);
            option.add(ounfill);
    }
    
    public void start() {
    //창 닫기 버튼 누르면 실행
        this.addWindowListenernew WindowAdapter() {
            public void windowClosing(WindowEvent e) {
              System.exit(1);
            }
        });
        
        hsc.addMouseListenerthis );
        hsc.addMouseMotionListenerthis );
        
        //ActionListener 관련 이벤트 발생시
        fnew.addActionListenerthis );
        fopen.addActionListenerthis );
        fsave.addActionListenerthis );
        fexit.addActionListenerthis );
        osetcolor.addActionListenerthis );
        dlgbt.addActionListenerthis );
        dlgbt1.addActionListenerthis );
        dlgbt2.addActionListenerthis );
        
        //ItemListener 관련 이벤트 발생시
        ofill.addItemListenerthis );
        ounfill.addItemListenerthis );
    }
    
    public void mouseClicked(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) {  }
    public void mouseExited(MouseEvent e) {  }
    public void mousePressed(MouseEvent e) {
    this.x = e.getX();
        this.y = e.getY();
    }
    public void mouseReleased(MouseEvent e) {
        this.x1 = e.getX();
        this.y1 = e.getY();
        int dist = 0;
        if(cb2.getState()) dist = 1;
        else if(cb3.getState()) dist = 2;
        else if(cb4.getState()) dist = 3;
        Ex0204_10_Sub1 hss = new Ex0204_10_Sub1(xy, x1, y1, dist, color, ofill.getState());
        vc.add(hss);
        hsc.repaint();
    }
    public void mouseMoved(MouseEvent e) {  }
    public void mouseDragged(MouseEvent e) {
        if(cb1.getState()) {
            x1 = e.getX();
            y1 = e.getY();
            Ex0204_10_Sub1 hss = new Ex0204_10_Sub1(xy, x1, y1, 1, color, false);
            vc.add(hss);
            hsc.repaint();
            x = x1;
            y = y1;
        } else {
            x1 = e.getX();
            y1 = e.getY();
            hsc.repaint();
        }
  }
    
    public void actionPerformed(ActionEvent e) {
      if(e.getSource() == fnew) {
            vc.clear();
            x = y = x1 = y1 = 0;
            hsc.repaint();

        } else if(e.getSource() == fopen) {
            FileDialog fd = new FileDialog(this"열기"FileDialog.LOAD);
            fd.setVisible(true);
            String dir = fd.getDirectory();
            String file = fd.getFile();
            if(dir == null || file == null) {
                return;
            }
            File f = new File(dir, file);
            FileInputStream fis = null;
            ObjectInputStream ois = null;
            try {
                fis = new FileInputStream(f);
            } catch(FileNotFoundException ee) { }
            
            try {
                ois = new ObjectInputStream(fis);
                vc = (Vector)ois.readObject();      
                ois.close();
                fis.close();
            } catch (Exception ee) { }
            hsc.repaint();

        } else if(e.getSource() == fsave) {
            FileDialog fd = new FileDialog(this"저장"FileDialog.SAVE);
            fd.setVisible(true);    
            String dir = fd.getDirectory();
            String file = fd.getFile();
            if(dir == null || file == null) {
                return;
            }
            File f = new File(dir, file);
            FileOutputStream fos = null;
            ObjectOutputStream oos = null;
            try {
                fos = new FileOutputStream(f);
            } catch(FileNotFoundException ee) { }
            try {
                oos = new ObjectOutputStream(fos);
                oos.writeObject(vc);
                oos.close();
                fos.close();
            } catch (Exception ee) { }

        } else if(e.getSource() == fexit) {
          System.exit(1);

        } else if(e.getSource() == osetcolor) {
          dlg.setVisible(true);

        } else if(e.getSource() == dlgbt) {
            int r = Integer.parseInt(dlgtf.getText().trim());
            int g = Integer.parseInt(dlgtf1.getText().trim());
            int b = Integer.parseInt(dlgtf2.getText().trim());
            Color cc = new Color(r, g, b);
            dlgbt.setBackground(cc);

        } else if(e.getSource() == dlgbt1) {
            int r = Integer.parseInt(dlgtf.getText().trim());
            int g = Integer.parseInt(dlgtf1.getText().trim());
            int b = Integer.parseInt(dlgtf2.getText().trim());
            Color cc = new Color(r, g, b);
            color = cc;
            dlg.setVisible(false);

        } else if(e.getSource() == dlgbt2) {
            dlg.setVisible(false);
        }
    }
    
    //채우기나 비우기 둘 중 하나가 선택 되면 다른 하나의 채크된 것을 채크되지 않은 상태로
    public void itemStateChanged(ItemEvent e) {
        if(e.getSource() == ofill) {
            ofill.setState(true);
            ounfill.setState(false);
        } else if(e.getSource() == ounfill) {
            ofill.setState(false);
            ounfill.setState(true);
        }
    }
    public Color getColor() {
        return color;
    }
    public Vector getVc() {
        return vc;
    }
    public Checkbox getCb2() {
        return cb2;
    }
    public Checkbox getCb3() {
        return cb3;
    }
    public Checkbox getCb4() {
        return cb4;
    }
    public CheckboxMenuItem getOfill() {
        return ofill;
    }
    public int getX() {
        return x;
    }
    public int getX1() {
        return x1;
    }
    public int getY() {
        return y;
    }
    public int getY1() {
        return y1;
    }
}

class Ex0204_10_Sub_Can extends Canvas {
    Ex0204_10_Sub h1s = null;
    private int x, x1, y, y1;
    Ex0204_10_Sub_Can(Ex0204_10_Sub h1s) {
        this.h1s = h1s;
    }
    public void paint(Graphics g) {
        g.setColor(h1s.getColor());
        x = h1s.getX();  x1 = h1s.getX1();  y = h1s.getY();  y1 = h1s.getY1();
        if(h1s.getCb2().getState()) g.drawLine(xy, x1, y1);     //잔상 남기기..
        
        else if(h1s.getOfill().getState()) {
            if (h1s.getCb3().getState()) g.fillRect(xy, x1-x, y1-y);
            else if(h1s.getCb4().getState()) g.fillOval(xy, x1-x, y1-y);    
        
        } else {
            if (h1s.getCb3().getState()) g.drawRect(xy, x1-x, y1-y);
            else if (h1s.getCb4().getState()) g.drawOval(xy, x1-x, y1-y);
        }

        for(int i=0; i < h1s.getVc().size(); i++) {
            Ex0204_10_Sub1 imsi = (Ex0204_10_Sub1)h1s.getVc().elementAt(i);
            g.setColor(imsi.getColor());
            switch(imsi.getDist()) {
                case 1:
                  g.drawLine(imsi.getX(), imsi.getY(), imsi.getX1(), imsi.getY1());
                  break;
                case 2:
                  if(imsi.getFillOk())  g.fillRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    else  g.drawRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    break;
                case 3:
                if(imsi.getFillOk())  g.fillOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                else g.drawOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    break;
            }
        }
    }
}

//Main 객체 정의
public class Ex0204_10 {
    public static void main(String [] ar) {
        Ex0204_10_Sub h1s = new Ex0204_10_Sub("그림판");
    }
}


//---------------------------------------------------------------------------//
// Ho0202_01 : File을 이용한 게시판 만들기
import java.awt.*;
import java.awt.event.*;
import java.io.*;

class FreeBoard implements Serializable {
    private int data;
  private String title;
  private String author;
  private int hit;
  private String story;
  public int getData() {
    return data;
  }
  public String getTitle() {
    return title;
  }
  public String getAuthor() {
    return author;
  }
  public int getHit() {
    return hit;
  }
  public String getStory() {
    return story;
  }
  public void setData(int i) {
    data = i;
  }
  public void setTitle(String str) {
    title = str;
  }
  public void setAuthor(String str) {
    author = str;
  }
  public void setHit(int i) {
    hit = i;
  }
  public void setStory(String str) {
    story = str;
  }
}


class Ho0202_01_Sub extends Frame implements ActionListener {
    //Nor
  private Label lb1 = new Label("게 시 판"Label.CENTER);
  //Cen-Nor
  //Cen-Nor-Grid(1,4)
  private Label lb2 = new Label("Data"Label.CENTER);
  private Label lb3 = new Label("제  목"Label.CENTER);
  private Label lb4 = new Label("작성자"Label.CENTER);
  private Label lb5 = new Label("hit"Label.CENTER);
  //Cen-Cen
  private List lt1 = new List(10);
  //Sou-Flow
  private Button write = new Button("쓰기");
  private Button show = new Button("보기");
  
  //쓰기용 Dialog box
  private Dialog wdlg = new Dialog(this"쓰기"true);
  //Nor
  //Nor-Nor
  private Label wdlglb1 = new Label("글쓰기");
  //Nor-Wst
  //Nor-Wst-Grid(2,1)
  private Label wdlglb2 = new Label("제  목 : ",Label.RIGHT);
  private Label wdlglb3 = new Label("작성자 : ",Label.RIGHT);
  //Nor-Cen-Grid(2,1)
  private TextField wdlgtf1 = new TextField();
  private TextField wdlgtf2 = new TextField();
  //Cen
  private TextArea wdlglt1 = new TextArea();
  //Sou
  //Sou-Flow
  private Button wdlgbt1 = new Button("확인");
  private Button wdlgbt2 = new Button("취소");
  
  //보기용 Dialog box
  private Dialog sdlg = new Dialog(this"보기"true);
  //Nor
  //Nor-Nor
  private Label sdlglb1 = new Label("Title"Label.CENTER);
  //Nor-Cen
  //Nor-Cen-Flow
  private Label sdlglb2 = new Label("작성자 : ");
  private Label sdlglb3 = new Label("name");
  //Cen
  private TextArea sdlglt1 = new TextArea();
  //Sou-Flow
  private Button sdlgbt1 = new Button("확인");
  
  
  public Ho0202_01_Sub(String str) {
      super(str);
    setSize(400500);
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension di = tk.getScreenSize();
    Dimension di1 = this.getSize();
    setLocation((int)(di.getWidth()/2 - di1.getWidth()/2),
                (int)(di.getHeight()/2 - di1.getHeight()/2));
    setLayout(new BorderLayout());
    init();
    start();
    setVisible(true);
  }
  
  public void init() {
      this.add("North", lb1);
    Panel p1 = new Panel(new BorderLayout());
    Panel p2 = new Panel(new GridLayout(1,4));
    p2.add(lb2);
    p2.add(lb3);
    p2.add(lb4);
    p2.add(lb5);
    p1.add("North", p2);
    p1.add("Center", lt1);
    this.add("Center", p1);
    Panel p3 = new Panel(new FlowLayout(FlowLayout.RIGHT));
    p3.add(write);
    p3.add(show);
    this.add("South", p3);
    initDlg();
    initBoard();
  }
  public void initDlg() {
      //쓰기 Dialog 설정
    wdlg.setSize(200300);
    wdlg.setLocation(300,300);
    wdlg.setLayout(new BorderLayout());
    Panel p4 = new Panel(new BorderLayout());
    p4.add("North", wdlglb1);
    Panel p5 = new Panel(new GridLayout(2,1));
    p5.add(wdlglb2);
    p5.add(wdlglb3);
    p4.add("West", p5);
    Panel p6 = new Panel(new GridLayout(2,1));
    p6.add(wdlgtf1);
    p6.add(wdlgtf2);
    p4.add("Center", p6);   
    wdlg.add("North", p4);
    wdlg.add("Center", wdlglt1);
    Panel p7 = new Panel(new FlowLayout(FlowLayout.RIGHT));
    p7.add(wdlgbt1);
    p7.add(wdlgbt2);
    wdlg.add("South", p7);
    
    //보기 Dialog 설정
    sdlg.setSize(200300);
    sdlg.setLocation(300,300);
    sdlg.setLayout(new BorderLayout());
    Panel p8 = new Panel(new BorderLayout());
    p8.add("North", sdlglb1);
    Panel p9 = new Panel(new FlowLayout(FlowLayout.RIGHT));
    p9.add(sdlglb2);
    p9.add(sdlglb3);
    p8.add("Center", p9);
    sdlg.add("North", p8);
    sdlg.add("Center", sdlglt1);
    Panel p10 = new Panel(new FlowLayout(FlowLayout.RIGHT));
    p10.add(sdlgbt1);
    sdlg.add("South", p10);   
  }
    public void initBoard() {
        File f = new File(".\\db");
    int i = f.list().length + 1;
    for(int j=1; j < i; j++) {
        if(j < 10) {
          f = new File(".\\db""fname0" + j + ".dat");
      } else {
          f = new File(".\\db""fname" + j + ".dat");
      }
      FreeBoard fb = new FreeBoard();
      FileInputStream fis = null;
      ObjectInputStream ois = null;       
      try {
          fis = new FileInputStream(f);
      } catch(FileNotFoundException ee) { }
      try {
          ois = new ObjectInputStream(fis);
        fb = (FreeBoard)ois.readObject();
        ois.close();
        fis.close();
      } catch(Exception ee) { }
        lt1.add("               " + String.valueOf(fb.getData()) 
                  + "                 " + fb.getTitle() 
            + "                 " + fb.getAuthor() 
            + "                 " + String.valueOf(fb.getHit()));     
    }
  }
    
  public void start() {
      this.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          System.exit(0);
      }
    });
    write.addActionListener(this);
    show.addActionListener(this);
    wdlgbt1.addActionListener(this);
    wdlgbt2.addActionListener(this);
    sdlgbt1.addActionListener(this);
  }
  public void actionPerformed(ActionEvent e) {
      if(e.getSource() == write) {
        wdlg.setVisible(true);
    }
    else if(e.getSource() == show) {
        if(lt1.getSelectedItem() !null) {
          int i = lt1.getSelectedIndex() + 1;
        File f = null;
        if(i < 10) {
            f = new File(".\\db""fname0" + i + ".dat");
        } else {
            f = new File(".\\db""fname" + i + ".dat");
        }
        FreeBoard fb = new FreeBoard();
        FileInputStream fis = null;
        ObjectInputStream ois = null;       
        try {
            fis = new FileInputStream(f);
        } catch(FileNotFoundException ee) { }
        try {
            ois = new ObjectInputStream(fis);
          fb = (FreeBoard)ois.readObject();
          ois.close();
          fis.close();
        } catch(Exception ee) { }
        sdlglb1.setText(fb.getTitle());
        sdlglb3.setText(fb.getAuthor());
        sdlglt1.setText(fb.getStory());
        fb.setHit(fb.getHit()+1);
        
              lt1.replaceItem("               " + String.valueOf(fb.getData()) 
                            + "                 " + fb.getTitle() 
                      + "                 " + fb.getAuthor() 
                      + "                 " + String.valueOf(fb.getHit()), i-1);
        
        FileOutputStream fos = null;
            ObjectOutputStream oos = null;
            try {
                fos = new FileOutputStream(f);
            } catch (FileNotFoundException ee) { }
          try {
              oos = new ObjectOutputStream(fos);
            oos.writeObject(fb);
            oos.close();
            fos.close();      
          } catch (Exception ee) { }

        sdlg.setVisible(true);
      }
    } 
    else if(e.getSource() == wdlgbt1) {
            File f = new File(".\\db");
      int i = f.list().length + 1;
      if(i < 10) {
          f = new File(".\\db""fname0" + i + ".dat");
      } else {
          f = new File(".\\db""fname" + i + ".dat");
      }
      FreeBoard fb = new FreeBoard();
      fb.setData(i);
      fb.setTitle(wdlgtf1.getText().trim());     wdlgtf1.setText("");     
      fb.setAuthor(wdlgtf2.getText().trim());    wdlgtf2.setText("");
      fb.setStory(wdlglt1.getText().trim());     wdlglt1.setText("");
      fb.setHit(0);
      FileOutputStream fos = null;
      ObjectOutputStream oos = null;
      try {
          fos = new FileOutputStream(f);
      } catch (FileNotFoundException ee) { }
      try {
          oos = new ObjectOutputStream(fos);
        oos.writeObject(fb);
        oos.close();
        fos.close();      
      } catch (Exception ee) { }
        wdlg.setVisible(false);
        lt1.add("               " + String.valueOf(fb.getData()) 
                  + "                 " + fb.getTitle() 
            + "                 " + fb.getAuthor() 
            + "                 " + String.valueOf(fb.getHit()));     
    }
    else if(e.getSource() == wdlgbt2) {
        wdlg.setVisible(false);
    }
    else if(e.getSource() == sdlgbt1) {
        sdlg.setVisible(false);
    }
  }
}

public class Ho0202_01 {
  public static void main(String [] ar) {
      Ho0202_01_Sub h1s = new Ho0202_01_Sub("게시판");  
  }
}


//===========================================================================//





>>>>> 답글

File 출력 시 깨지는 문제 아래와 같은 옵션으로 해결할 수도 있네요. ^^
java -Dfile.encoding=KSC5601





 

'scrap >  Java/JSP' 카테고리의 다른 글

- [Java 기본] Java Network  (0) 2011.05.14
- [Java 기본]Swing  (0) 2011.05.14
- [Java 기본]Thread, synchronized, 압축 및 배포  (1) 2011.05.14
- [Java 기본] Applet  (0) 2011.05.14
- [Java 기본] Graphics  (0) 2011.05.14