- [Java 기본] JAVA File I/O
//===========================================================================//
본 내용은 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 관련 클래스
1) File
2) OutputStream
3) InputStream
4) Writer
5) Reader
6) ObjectOutputStream
7) ObjectInputStream
8) RandomAccessFile
3. 자료형
3.1 정수형
1) byte : 기본적인 입.출력을 담당하는 자료형(-128~127 : 전송되는 타입은 0~255 의 범위로 입력을 받을 수 있다.)
2) short : 다른 언어와 호환하기 위해서 나온 자료형이다.(C언어에서는 기본 데이터 처리 단위가 2바이트 이기 때문)
- 거의 사용 안함
3) int : Java의 기본적인 타입의 자료형이다.
4) long
3.2 문자형
1) char :(0~65535)
- char 형은 (byte * 256 + byte) 로 자동 형변환이 이루어진다.
2) 문자형
a) ASSCII - 7bit(0~127)
- 0~31, 32, 127 : 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
1) Constructor Summary
new File(File, String) // File:경로, String:파일명(경로와 동시에 파일명을 적어도 됨)
new File(String) //경로와 파일명을 동시에 적고, 경로를 적지 않으면 현재 디렉토리를 의미 한다.
new File(String, String)
new File(URL) // 웹상에 특정 문서를 연결 시켜 줄 수 있는 생성자
2) Method 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 : 추상 클래스로 바로 객체 생성이 불가능 하다.
1) Method Summary
- write(int i) //버퍼로 추력하는 것
- write(byte[])
- write(byte[], int start , int end)
- flush() // 버퍼가 차지 않아도 버퍼의 내용을 모두 보낸다. => Ex0202_02.java
- close()
2) OutputStream 의 상속관계
OutputStream - FileOutputStream(파일과 연계해서 사용할 때 사용 가능)
- ByteArrayOutputStream(데이타를 바이트 단위로 쪼개어서 보낼때 사용.(데이타 전송시 사용))
- PipedOutputStream(쓰레드간의 통신을 위해서 나온 클래스)
- FilterOutputStream(필터기능 포함) - BufferedOutputStream(버퍼를 사용하도록 해둠)
- PrintStream(System.out과 연계해서만 사용됨)
- DataOutputStream(데이타에 우선을 두어 전송을 하도록 사용)
- 과제 ) OutputStream, InputStream, Writer, Reader // 의 상속관계 위와 같이 그려 오기(과제1)
3) 임의의 OutputStream 을 생성해여 redirection 시키는 방법 => Ex0202_03 : 화면 상에 아무것도 출력되지 않게 됨.
- System.out.println => 화면 이외의 곳으로 출력하는 방법
System.setOut(ps);
System.setErr(ps); // 임의의 곳으로 접근 권한을 옮김.
// println은 무조건 write를 이용하도록 되어 있다.
4) FileOutputStream
- 매개변수로 파일 객체를 받을 수 있다.
- 해당 파일의 접근 권한을 갖게 된다.
사용예-> Ex0202_04
- 파일을 열면 닫아야 한다.
5) BufferedOutputStream
- 버퍼에 한꺼번에 담았다가 스트림 단위로 내보낸다.
- 파일을 버퍼에 한꺼번에 담았다가 출력하는 것이 빠르기 때문이다..
6) DataOutputStream
- 특정 데이터를 포맷된 데이터로 전송할 수 있다
7) 파일에서 -1은 파일의 끝을 의미 한다.
4.3 InputStream
1) InputStream 의 상속관계
InputStream - FileInputStream : 파일과 연계하여 파일을 읽어 온다.
- ByteArrayInputStream
- PipedInputStream
- FilterInputStream - BufferedInputStream
- DataInputStream
- SequenceInputStream : 파일을 연결 시켜서 여러개 연결 시킬때 사용한다.
- System.in은 BufferedInputStream 과 연결 되어 있다.
- 리다이렉션 시켜서 다른 파일에서 입력을 받을 수 있다.
2) Method 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바이트 단위의 흐름을 가진다.
1) Writer 관련 클래스
Writer - FileWriter
- OutputStreamWriter
- BufferedWriter
- PrintWriter
2) 클래스 사용
2.1) FileWriter fw = FileWriter(---); //파일의 접근 권한을 연다.
//파일에 대한 정상적 접근을 위해서 만듬
2.2) OutputStreamWriter osw = OutputStreamWriter(System.out 혹은 네트웍 Output);
// console과 network에 대한 정상적 접근을 위해서 만들어 놓았다.
2.3) BufferedWriter bw = new BufferedWriter(osw);
// osw나 fw를 담아서 이용하면 버퍼를 이용하겠다는 것을 의미 한다.
2.4) PrintWriter pw = new PrintWriter(bw);
// pw.println("하하하"); 처럼 처리할 수 있다.
-> 파일, 네트웍, 화면으로의 출력을 섞어 가며 출력하고 싶다면.. -> Ex0204_01.java
- 하나의 코딩으로 매개 변수만 바꿔 가며, 여러개의 형식에 맞추어 출력 할수 있다.
4.5 Reader
1) Reader 상속 관계
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;
}
3) Serializable 은 인터페이스이고, 메소드를 하나도 안 가지고 있다.
그래서 implements Serializable 만하면 직렬화가 된다.
6. Object I/O
1) Object 출력
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();
2) Object 입력
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, 3, 6);
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 x, y, x1, y1, dist;
private Color color = new Color(0, 0, 0);
private boolean fillok = false;
Ex0204_10_Sub1(int x, int y, int 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 MouseListener, MouseMotionListener, ActionListener, ItemListener {
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 x, y, 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(500, 400); //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(3, 1));
p.add(dlglb);
p.add(dlglb1);
p.add(dlglb2);
dlg.add("West", p);
Panel p1 = new Panel(new GridLayout(3, 1));
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(200, 150);
}
//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.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(1);
}
});
hsc.addMouseListener( this );
hsc.addMouseMotionListener( this );
//ActionListener 관련 이벤트 발생시
fnew.addActionListener( this );
fopen.addActionListener( this );
fsave.addActionListener( this );
fexit.addActionListener( this );
osetcolor.addActionListener( this );
dlgbt.addActionListener( this );
dlgbt1.addActionListener( this );
dlgbt2.addActionListener( this );
//ItemListener 관련 이벤트 발생시
ofill.addItemListener( this );
ounfill.addItemListener( this );
}
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(x, y, 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(x, y, 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(x, y, x1, y1); //잔상 남기기..
else if(h1s.getOfill().getState()) {
if (h1s.getCb3().getState()) g.fillRect(x, y, x1-x, y1-y);
else if(h1s.getCb4().getState()) g.fillOval(x, y, x1-x, y1-y);
} else {
if (h1s.getCb3().getState()) g.drawRect(x, y, x1-x, y1-y);
else if (h1s.getCb4().getState()) g.drawOval(x, y, 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(400, 500);
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(200, 300);
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(200, 300);
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 |