[ I/O Stream ]
byte Stream | char Stream > 2byte씩 읽고 쓰기 | |||
InputStream | BufferedInputStream(InputStream in) FileInputStream DataInputStream ObjectInputStream |
Reader | BufferedReader FileReader InputStreamReader(형변환 연결) |
|
OutputStream | BufferedOutputStream(OutputStream in) FileOutputStream DataOutputStream ObjectOutputStream |
Writer | BufferedWriter FileWriter OutputStremReader(형변환 연결) |
* System.in ==> InputStream
System.out ==> PrintStream
- System.in.read > 사용자의 입력값 받아서 아스키 코드 값으로 변환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package day20;
import java.io.IOException;
public class IOEx8 {
public static void main(String[] args) throws IOException {
// 사용자의 입력값을 받는 방법
// 1. System.in.read() >의 in이 inputstream
// 2. Scanner
System.out.println("입력 (종료: ctrl+z) : ");
// 알파벳 받아서 아스키 코드 값 변환
int value = 0;
while( (value = System.in.read()) != -1) { // 예외 던지기
System.out.print((char)value);
}
}
}
|
cs |
- System.in.read() / readLine() / write() /
BufferedReader / InputStreamReader / BufferedWriter / FileWriter / flush()
: 키보드에 한글을 받아 화면에 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package day20;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class IOEx9 {
public static void main(String[] args) throws IOException {
// System.in : InputStream (byte Stream)
// byte ==> char 변환
// byte Stream과 char Stream의 중간 다리 역할을 하는 클래스가 필요
// : InputStreamReader
// : OutputStreamWriter
// 키보드에 한글을 입력 받아 화면에 출력하기.
System.out.println("입력 (종료 : ctrl + z) : ");
// InputStreamReader isr = new InputStreamReader(System.in);
// 이제 isr은 char Stream으로 변환됨
// 빠르게 읽으려면?
// BufferedReader br = new BufferedReader(isr);
// 위를 하나로,
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 파일 저장
// FileWriter fw = new FileWriter("c:\\dev\\ddd.txt");
// 빠르게 파일 저장
// BufferedWriter bw = new BufferedWriter(fw);
// 얘도 하나로,
BufferedWriter bw = new BufferedWriter(new FileWriter("c:\\dev\\ddd.txt"));
// 화면에 출력 > 반복해서 출력하려면? while 사용
String msg = null;
while( (msg = br.readLine()) != null) { // 한줄씩 읽어
bw.write(msg+"\n"); // 파일 쓰고
System.out.println(msg); // 화면에 출력 (반복)
}
bw.flush();
}
}
|
cs |
- 메모장에 파일 저장, 열기 기능 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
package day17;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Memojjang extends JFrame implements ActionListener{
JTextArea jta; // TextArea : 여러 줄의 텍스트 가능
JScrollPane jsp; // 스크롤 기능이 있는 패널
JMenuBar jmb;
JMenu jmFile, jmHelp;
JMenuItem jmiNew, jmiOpen, jmiSave, jmiExit, jmiHelp;
Memojjang() {
jmb = new JMenuBar();
jmFile = new JMenu("FILE");
jmHelp = new JMenu("HELP");
jmiNew = new JMenuItem("NEW");
jmiOpen = new JMenuItem("OPEN");
jmiSave = new JMenuItem("SAVE");
jmiExit = new JMenuItem("EXIT");
jmiHelp = new JMenuItem("HELP");
// 아이템들을 FILE에 추가
jmFile.add(jmiNew);
jmFile.add(jmiOpen);
jmFile.add(jmiSave);
jmFile.add(jmiExit);
// 아이템들을 HELP에 추가
jmHelp.add(jmiHelp);
// 메뉴바에 File, Help 추가
jmb.add(jmFile);
jmb.add(jmHelp);
// 이벤트 처리
jmiExit.addActionListener(this);
jmiNew.addActionListener(this);
jmiOpen.addActionListener(this);
jmiSave.addActionListener(this);
jmiHelp.addActionListener(this);
// 프레임에 메뉴바를 부착
setJMenuBar(jmb);
jta = new JTextArea();
Font f = new Font("굴림체", Font.BOLD, 30);
jta.setFont(f);
// jsp = new JScrollPane(jta, 수직바정책, 수평바정책);
jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(jsp);
sendData();
setBounds(100, 100, 800, 600);
setVisible(true);
}
private void sendData() {
setDefaultCloseOperation(EXIT_ON_CLOSE); // 창 종료
}
public static void main(String[] args) {
Memojjang mj = new Memojjang();
}
@Override
public void actionPerformed(ActionEvent e) {
// 사용자의 UI는 쓰는 사람들의 언어 -> ActionCommand 말고! object, source
Object obj = e.getSource(); // -> 참조값을 사용할 수 있음
if(obj == jmiNew) {
// 1.화면에 글이 있는지 판정
String data = jta.getText(); // getText : 글자를 가져옴
int length = data.length(); // 글자 수
// 2. 글이 있다면 창을 띄워서 저장할 것인지 질문
if(length != 0) { // 글자 수가 0이 아니면 글자가 있다는 뜻
int result =
JOptionPane.showConfirmDialog(this, "저장할래?", "메모장", JOptionPane.YES_NO_CANCEL_OPTION);
// JOptionPane : 창 띄우는 클래스
// ConfirmDialog : 물어보는 창
// 왼쪽부터 버튼 누르면 0/1/2/3 숫자를 매겨놓음
// System.out.println("result : "+result);
// 3. 저장하겠다면 저장 메뉴를 띄워줌
if(result == JOptionPane.YES_OPTION) { // '예'를 눌렀다면,
// 저장... i/o 배우고..하는 걸로
}
}
// 4. 화면의 글을 지우기
jta.setText("");
} else if(obj == jmiExit) {
// 창 종료
System.out.println("종료합니다");
System.exit(0);
} else if (obj == jmiOpen) {
// 파일 열기 (열기:0 / 취소:1)
JFileChooser jfc = new JFileChooser();
int result = jfc.showOpenDialog(this);
// 파일 열기 버튼을 눌렀다면
// JFileChooser.APPROVE_OPTION -> 상수로 만들기
if (result == JFileChooser.APPROVE_OPTION) {
// get파일 추적
File f = jfc.getSelectedFile();
jta.setText("");
try {
FileReader fr = new FileReader(f); // try/catch
BufferedReader br = new BufferedReader(fr);
String str = null;
while( (str = br.readLine()) != null) {
jta.append(str+"\n");
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} // 취소를 누르면 아무것도 안하기
} else if (obj == jmiSave) { // 저장 누르면,
JFileChooser jfc = new JFileChooser();
int result = jfc.showSaveDialog(this); // 저장하기 대화창
// System.out.println("result : "+result);
if (result == JFileChooser.APPROVE_OPTION) { // 저장하기를 선택하면,
System.out.println("파일 저장... 향후에 계속");
File f = jfc.getSelectedFile();
try {
// 선택한 파일로 write
FileWriter fw = new FileWriter(f); // 예외 처리
String data = jta.getText(); // 프로그램에 적는 txt 가져와서 data로
fw.write(data); // 파일에 data 입력하기
fw.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String data = jta.getText();
}
} else if (obj == jmiHelp) {
// Help 누르면 새로운 창 뜨기
new SwingEx1(); // 참조변수 없어도 괜찮다.
setVisible(false);
}
} // actionPerformed()end
} // classs end
|
cs |
- 다양한 primitive type 데이터(UTF, Int, Float)을 읽고 쓰는 클래스
: FileOutputStream / DataOutputStream / FileInputStream / DataInputStream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package day20;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOEx10 {
public static void main(String[] args) throws IOException {
// 다양한 primitive type 데이터를 읽고 쓰는 클래스
FileOutputStream fos = new FileOutputStream("c:\\dev\\dos.txt");
DataOutputStream dos = new DataOutputStream(fos);
dos.writeUTF("홍길동");
dos.writeInt(20);
dos.writeFloat(180.0f);
dos.writeFloat(60.0f);
// 성별 : 남, 여 (false, true)
dos.writeBoolean(true);
// 읽어오기
FileInputStream fis = new FileInputStream("c:\\dev\\dos.txt");
DataInputStream dis = new DataInputStream(fis);
// 읽어올 때는 순서가 중요
String name = dis.readUTF();
int age = dis.readInt();
float height = dis.readFloat();
float weight = dis.readFloat();
boolean gender = dis.readBoolean();
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("키 : " + height);
System.out.println("몸무게 : " + weight);
System.out.println("성별 : " + ((gender)? "남":"여"));
}
}
|
cs |
- 파일 생성하고 "Hello java IO world 만세!!!" 입력해서 저장하기
: FileWriter / BufferedWriter / write(), flush() / FileReader / BufferedReader / readLine()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package day20;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IOEx11 {
public static void main(String[] args) throws IOException {
// c:\\dev\\text.txt : Hello java IO world 만세!!!
// 1. File 객체 생성
File f1 = new File("c:\\dev\\text.txt");
// 2. File + char Stream 계열의 쓰기 클래스
FileWriter fw = new FileWriter(f1);
// 3. 버퍼 + char Stream 계열의 쓰기 클래스
BufferedWriter bw = new BufferedWriter(fw);
// 4. 문자를 저장
bw.write("Hello java IO world 만세!!!");
bw.flush();
// 5. File 객체 생성
File f2 = new File("c:\\dev\\text.txt");
// 6. File + char 계열의 읽기 클래스
FileReader fr = new FileReader(f2);
// 7. 버퍼 + char 계열의 읽기 클래스
BufferedReader br = new BufferedReader(fr);
// 8. 읽어서 화면에 출력
String data = null;
while((data = br.readLine()) != null) {
System.out.println(data);
}
}
}
|
cs |
- Serizable : 변수를 직렬화..
- transient : Serizable 하는 과정에 제외하고 싶은 값이 있다면 선언하는 키워드
: getter, setter, 다양한 매개변수 있는 생성자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
package day20;
import java.io.Serializable;
public class Member implements Serializable { // 직렬화하게 함
private String id, pw, name, addrs, email;
// Serializable 하는 과정에 제외하고 싶은 값이 있다면 선언하는 키워드 : transient
private transient int age; // > 나이는 저장 안됨
public Member() {
}
public Member(String id, String pw, String name) {
super();
this.id = id;
this.pw = pw;
this.name = name;
}
public Member(String id, String pw, String name, String addrs, String email, int age) {
super();
this.id = id;
this.pw = pw;
this.name = name;
this.addrs = addrs;
this.email = email;
this.age = age;
}
// setter, getter, 다양한 매개변수 있는 생성자
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddrs() {
return addrs;
}
public void setAddrs(String addrs) {
this.addrs = addrs;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
|
cs |
- FileOutputStream / ObjectOutputStream
: serizable 한 객체만 object로 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package day20;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class IOEx12 {
public static void main(String[] args) throws IOException {
Member m = new Member("aaa", "bbb", "hong", "율도국", "hong@gmail.com", 20);
// c:\\dev\\member.txt 파일로 저장
// File f = new File("c:\\dev\\member.txt");
FileOutputStream fos = new FileOutputStream("c:\\dev\\member.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
// serizable 한 객체만 object로 저장 가능(member 클래스 참고)
oos.writeObject(m);
}
}
|
cs |
- FileInputStream / ObjectInputStream / readObject
: 파일에 접근해서 object 읽어오고, object 메서드 활용해서 값을 꺼내오기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package day20;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class IOEx13 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 파일에 접근에서 object 읽어오고, object 메서드 활용해서 값을 꺼내오기
// 파일 + 읽기 : byteStream 계열 클래스
FileInputStream fis = new FileInputStream("c:\\dev\\member.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
// ois.readObject(); // 오브젝트 읽어들임
Object obj = ois.readObject();
System.out.println("obj : "+obj);
// 11개 메서드 > 꺼내서 멤버 클래스에 할당 : 이제 자신의 메서드를 가져올 수 있음
Member m = (Member)obj;
System.out.println("m : "+m);
System.out.println("이름 : "+m.getName());
System.out.println("ID : "+m.getId());
System.out.println("PW : "+m.getPw());
System.out.println("주소 : "+m.getAddrs());
System.out.println("이메일 : "+m.getEmail());
System.out.println("나이 : "+m.getAge());
}
}
|
cs |
- 파일복사기
: 파일 선택해서 내용 가져오고, 그 내용을 다른 파일에 복사해서 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
package day19quiz;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Day19Q07 extends JFrame implements ActionListener{
JButton jbtnSource, jbtnDest, jbtnOpen, jbtnSave, jbtnCopy;
JTextField jtfSource, jtfDest;
Day19Q07() {
setLayout(null);
jbtnSource = new JButton("SOURCE");
jbtnDest = new JButton("DESTINATION");
jbtnOpen = new JButton("선택");
jbtnSave = new JButton("선택");
jbtnCopy = new JButton("COPY");
jtfSource = new JTextField();
jtfDest = new JTextField();
jbtnSource.setBounds(100, 80, 150, 80);
jbtnDest.setBounds(100, 280, 150, 50);
jbtnOpen.setBounds(500, 80, 150, 50);
jbtnSave.setBounds(500, 280, 150, 50);
jbtnCopy.setBounds(200, 480, 300, 50);
jtfSource.setBounds(300, 80, 150, 50);
jtfDest.setBounds(300, 280, 150, 50);
add(jbtnSource);
add(jbtnDest);
add(jbtnOpen);
add(jbtnSave);
add(jbtnCopy);
add(jbtnSource);
add(jbtnDest);
add(jtfSource);
add(jtfDest);
jbtnOpen.addActionListener(this);
jbtnSource.addActionListener(this);
jbtnSave.addActionListener(this);
jbtnDest.addActionListener(this);
jbtnCopy.addActionListener(this);
setTitle("파일복사기");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(100, 100, 800, 600);
setVisible(true);
}
public static void main(String[] args) {
Day19Q07 d = new Day19Q07();
}
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("버튼 눌림");
// obj가 뭐냐에 따라 처리가 달라지게
Object obj = e.getSource(); // 버튼 source
if(obj == jbtnSource || obj == jbtnOpen) {
JFileChooser jfc = new JFileChooser();
int result = jfc.showOpenDialog(this);
if(result == JFileChooser.APPROVE_OPTION) {
// 열기 버튼을 눌렀다면
File f = jfc.getSelectedFile(); // 파일 선택기
String path = f.getAbsolutePath(); // 파일 경로를 path에
jtfSource.setText(path); // 텍스트필드에 파일 경로 가져오기
}
}else if (obj == jbtnDest || obj == jbtnSave) {
JFileChooser jfc = new JFileChooser();
int result = jfc.showSaveDialog(this); // 저장 창 띄우기
if( result == JFileChooser.APPROVE_OPTION) {
File f = jfc.getSelectedFile(); // 파일 선택
String path = f.getAbsolutePath(); // 파일 경로
jtfDest.setText(path); // 파일 경로를 텍스트 필드에
}
} else if (obj == jbtnCopy) { // copy 버튼 눌렀따면
// 1. source 경로 가져오기
String source = jtfSource.getText();
// 2. dest 경로 가져오기
String dest = jtfDest.getText();
// 3. byte Stream + file : FileInputStream
// 5. byte Stream + file : FileOutputStream
try {
FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(dest);
// 4. Buffered + FileInputStream
// 6. Buffered + FileOutputStream
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int v = 0;
while( (v=bis.read()) != -1) {
bos.write(v);
System.out.print(v); // ascii코드 값 출력
}
bos.flush();
}catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 7. 반복해서 저장
//
}
}
}
|
cs |
'Java' 카테고리의 다른 글
[Java] JDBC - 데이터 베이스 (SELECT, INSERT, UPDATE, DELETE) / 시퀀스(SEQUENCE) 활용 / (+MYSql) (0) | 2023.03.31 |
---|---|
[Java] JDBC (Java Database Connectivity) (0) | 2023.03.30 |
[Java] I/O Stream (InputStream / OutPutStream) (0) | 2023.03.28 |
[Java] 로또 번호 추첨기 - 볼 이미지 부착 (ActionListener, ImageIcon, Random, Multi Thread 등 활용) (0) | 2023.03.28 |
[Java] Thread 스레드 / Multi Thread (0) | 2023.03.27 |