Java

[Java] I/O Stream (DataInputStream / ObjectInputStream) + 메모장, 파일 복사기 기능 구현

소댓 2023. 3. 29. 17:57

[ 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(100100800600);
        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(1008015080);
        jbtnDest.setBounds(10028015050);
        jbtnOpen.setBounds(5008015050);
        jbtnSave.setBounds(50028015050);
        jbtnCopy.setBounds(20048030050);
        jtfSource.setBounds(3008015050);
        jtfDest.setBounds(30028015050);
        
        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(100100800600);
        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