Java - Serializable,BufferedReader,BufferedWriter,FileOutputStream,FileInputStream,transient

2020. 7. 27. 17:03Java

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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
 
public class Ex {
 
    public static void main(String[] args) {
        /*
         * 출력스트림(OutputStream)
         * 
         */
        
        //모니터로 출력하기 위해 System.out 상수를 활용하여 OutputStream 객체 연결
        
//        try(OutputStream os=System.out){
//            String msg="Hello,자바 World!";
//            //OutputStream 객체의 wirth() 메서드를 호출하여 출력할 데이터를 전달
//            //파라미터 타입 : byte[] 이므로 문자열의 경우
//            //                  getBytes[] 메서드를 사용하여 byte[] 타입으로 변환 필요
//            os.write(msg.getBytes());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        //----------------------------------------------------------------
        //byte 단위-> char 단위 처리로 변경하기 위해 OutputStream->XXXWriter 로 변환
        
        try(OutputStreamWriter write=new OutputStreamWriter(System.out)){
            String msg="Hello,자바 World!";
            //Writer 계열 객체의 write()메서드를 사용하여 char 단위로 출력
            //이때, 파라미터에 문자열데이터 전달도 가능하다.
            write.write(msg);
            write.append(" Programming");
            write.append(" Exam");
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
 
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Ex2 {
 
    public static void main(String[] args) {
        System.out.println("데이터를 입력하세요.");
        // 키보드로 입력받은 데이터 1개 라인을 화면에 출력
        //화면 출력 시 OutputStream 객체 활용(System.out.println() 메서드 XX)
        
        //입력 객체 : BufferedReader
        //출력 객체 : OutputStreamReader
        
        try(BufferedReader buffer=new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(System.out))) {
            String str=buffer.readLine();//BufferedReader 객체를 사용하여 한줄 읽어오기
            
//                System.out.println(str);
                
                //BufferedWriter 객체를 사용하여 1줄 출력하기
                writer.write(str);
            
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
public class Ex3 {
 
    public static void main(String[] args) {
        /*
         * DataInputStream & DataOutputStream
         *  자바의 기본 데이터 타입 입출력을 위한 객체
         *  readXXX(),writeXXX() 메서드를 사용하여 입출력 수행
         *  이때, XXX은 자바의 기본 데이터타입 이름(ex, readInt(),readChar())
         *  단, String 타입은 UTF로 바꿔서 사용(ex, readUTF(),writeUTF())
         *  주의! DataOutputStream으로 출력한 대상은 DataInputStream 으로만 읽을 수 있음
         *  또한, 순서대로 메서드를 호출해야함
         */
        
        //데이터를 출력할 파일을 File 객체로 생성
        //파일 위치 (디렉토리명)와 파일명을 문자열로 지정
        File src=new File("D:\\temp\\dataoutput.dat");
        
        //DataOutputStream 객체를 FileOutputStream객체와 연결하여
        //지정된 File 객체의 위치 및 파일에 데이터를 출력(쓰기=저장)
        try(DataOutputStream dos=new DataOutputStream(new FileOutputStream(src))){
            dos.writeUTF("홍길동");
            dos.writeInt(30);
            dos.writeDouble(3.14);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        //자바 기본데이터를 출력한 파일(dataoutput.dat)을 읽어와서
        //DataInputStream 객체를 사용하여 기본 데이터타입으로 사용
        
        try(DataInputStream dis=new DataInputStream(new FileInputStream(src))){
            //읽어올 기본 데이터를 readXXX() 메서드로 읽어와서 각 데이터 타입 변수에 저장
            String name=dis.readUTF();
            int age=dis.readInt();
            Double height=dis.readDouble();
            System.out.println(name+", "+age+", "+height);
        } catch (FileNotFoundException e) {
            //지정한 파일명(src) 또는 디렉토리가 없을 경우 예외 발생
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
 
}
 
import java.beans.Transient;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
public class Ex4{
    
    public static void main(String[] args) {
        
        //Person 객체를 생성하여 파일 형태로 출력 후
        //출력된 파일을 읽어와서 다시 Person 객체로 변환
        Person p=new Person("홍길동"20"900000-1111111""hong""hong123");
        
        //직렬화 시 객체를 출력할 파일을 File 객체로 생성
        File f=new File("D:\\temp\\person.dat");
        
        //객체 출력을 위한 ObjectOutputStream 과 객체 입력을 위한 ObjectInputStream 객체 생성
        //ObjectOutputStream 파라미터로 FileOutputStream 객체 전달
        //ObjectInputStream 파라미터로 FileInputStream 객체 전달
        try(ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f));
                ObjectInputStream ois=new ObjectInputStream(new FileInputStream(f))){
            //생성된 Person 객체를 ObjectOutputStrea객체를 통해 출력
            //writeObject()메서드 사용
            oos.writeObject(p);
            
            //person.dat 파일로부터 Person 객체를 읽어들여 출력
            //readObject()메서드 사용
            Object o=ois.readObject();//객체 읽어오기
            
            //Object 타입 ->Person 타입으로 변환
            //변환 전 변환 가능한 타입인지 판별 후 변환
            if(o!=null||instanceof Person) {
                Person person=(Person)o;
                System.out.println(person);
                System.out.println(person.getName());
                System.out.println(person.getAge());
                System.out.println(person.getSsn());
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
    }
        
        
}
    
}
    
    
    
    class Person implements Serializable{
        
        private static final long serialVersionUID=1L;
        
        private String name;
        private int age;
        private transient String ssn;
        private LoginInfo lInfo;
        
        
        
        public String getName() {
            return name;
        }
 
 
        public int getAge() {
            return age;
        }
 
 
        public String getSsn() {
            return ssn;
        }
 
 
        public LoginInfo getlInfo() {
            return lInfo;
        }
 
        public Person(String name,int age,String ssn, String userId, String userPass) {
            super();
            this.name=name;
            this.age=age;
            this.ssn=ssn;
            this.lInfo=new LoginInfo(userId,userPass);
        }
        
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ", ssn=" + ssn + ", lInfo=" + lInfo + "]";
        }
    
    }
 
class LoginInfo implements Serializable{
    private String userId;
    private transient String userPass;
    
    public LoginInfo(String userId,String userPass) {
        super();
        this.userId=userId;
        this.userPass=userPass;
    }
 
    @Override
    public String toString() {
        return "LoginInfo [userId=" + userId + ", userPass=" + userPass + "]";
    }
    
}
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
 
public class test4 {
 
    public static void main(String[] args) {
        
        /*
         * 1. 키보드로 입력받은 내용이 " :wq" 일 때 까지, 문자열을 한 줄씩 읽어서 
         * 전체 입력 문자열에 저장하고, 저장된 전체 입력 문자을 지정된 파일(d 드라이브의 temp폴더의 readme.txt)에 출력 후
         * BufferedWriter
         * 2.지정된 파일로부터 텍스트를 읽어와서 한 줄 씩 출력
         * BufferedReader
         */
        File f=new File("D:\\temp\\readme.txt");
        
        System.out.println("데이터를 입력하세요. 중단은 Ctrl+Z");
        try(BufferedReader bufferR=new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)))){
        String str=bufferR.readLine();
        while(!str.equals(":wq")) {//입력된 문자열이 ":wq" 가 아닐 동안 반복
                writer.write(str+"\n");//출력스트림을 사용하여 파일에 텍스트출력
                str=bufferR.readLine();//다음 한 문장 읽어오기
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        try(BufferedReader buffer=new BufferedReader(new InputStreamReader(new FileInputStream(f)))){
            String str=buffer.readLine();
            
            while(str!=null) {
                System.out.println(str);//한 문장 출력
                str=buffer.readLine();// 다음 한 문장 읽어오기
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        
    }
 
}
 
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
 
public class Ex5 {
 
    public static void main(String[] args)throws IOException, URISyntaxException {
        String dirName="D:"+File.separator+"Temp"+File.separator+"mydir";
        File file1=new File(dirName);
//        System.out.println("디렉토리 생성 : "+file1.mkdir()); //해당 디렉토리(폴더) 생성
        //중간 폴도명인 Temp가 존재하지 않으면 mydir 생성불가,false 리턴
        
        System.out.println("디렉토리 생성 : "+file1.mkdirs()); //중간 폴더명인 Temp가 존재하지 않으면
        //해당 폴더까지 모두 생성됨
        
        
        File file2=new File(dirName,"test2.txt");
        
        System.out.println("파일 생성 결과 : "+file2.createNewFile());
        //기존에 존재하는 파일 이거나 생성에 실패 했을 경우 false 리턴됨
        
        
        //기존에 디렉토리명을 관리하는 File 객체를 새로운 File 객체 파라미터로 사용가능
        File file3=new File(file1,"test3.txt");
        System.out.println("파일 생성 결과 : "+file3.createNewFile());
        
        
        File file4=new File("test4.txt");
        System.out.println("파일 생성 결과 : "+file4.createNewFile());
        //디렉토리명 지정 생략 시 , 현재 클래스가 위치하는 프로젝트 폴더에 파일이 생성됨.
        
        File f5=new File(new URI("file:///D:/temp/mydir/test5.txt"));
        System.out.println("파일 생성 결과 : "+f5.createNewFile());
        
        //지정된 파일 삭제 시
//        System.out.println("파일 생성 결과 : "+f5.delete());
        f5.deleteOnExit();//프로그램 종료될 때 파일 삭제됨(주로 임시 파일 삭제 시 활용)
        
        }
 
}
 
import java.io.File;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
 
public class Ex6 {
 
    public static void main(String[] args)throws URISyntaxException {
        Path path1=Paths.get("C:/windows/explorer.exe");
        System.out.println("파일명 : "+ path1.getFileName());
        
        //이름 갯수는 루트를 제외한 폴더명부터 파일명까지의 갯수
        //ex, "C:/windows/explorer.exe" 경로는 windows 와 explorer.exe 가 이름이됨.
        System.out.println("이름의 개수 : "+path1.getNameCount());
        System.out.println("0번째 이름의 개수 : "+path1.getName(0));
        System.out.println("0~2의 패스 : "+path1.subpath(02));
        System.out.println("상위경로 : "+path1.getParent());
        System.out.println("루트경로 : "+path1.getRoot());
        
        //상대경로 활용시 
        Path relative=Paths.get("./src/Ex.java");
        //상대 경로 ./XXX 지정시 현재 위치에서의 XXX 폴더 또는 파일지정
        //이클립스에서 현재 위치= 워크스페이스 프로젝트 폴더 안
        System.out.println("절대 경로로 : "+relative.toAbsolutePath());
        //상대경로에 포함된, 기호가 함께 표시되므로 실제 경로로 사용하기 어려움
        System.out.println("상대 경로 표시 삭제 : "+ relative.normalize().toAbsolutePath());
        //절대 경로로 변환된 문자열 중에서 상대 경로 표시만 삭제.
        
        File file = relative.toFile();
        System.out.println("URI 표현 : "+relative.toUri());
                
        //웹브라우저 주소창에 URI 주소 붙여넣을 경우 파일 접근 가능
    }
 
}
 
 
 
 
 
cs

 

Serializable를 활용하는 직렬화에 대해 배워보았다. 인터페이스 이기 때문에 implements를 사용하고

마커 인터페이스 역할 이기 때문에 안의 기능은 없다. 안의 데이터중에 중요정보가 있다면 transient 변수명 앞에 붙여주면

직렬화에서 배제가 되기 때문에 보안에서 안전해진다. 그리고 Input, Output에 대해서 좀 더 배워 보았는데

프로그램에서 바로 텍스트 파일이나 다른 파일을 만들면서 프로그램안에서 입력받은 문자들을 그 파일들에 출력시키며 파일을 생성시켜 보았는데 생소하다 보니 조금 어렵게 느껴졌다. 일단 헷갈리지 않게 Reader와 Writer의 기능과 역할을 중심으로 복습을 진행해서 확실히 기억해야 하겠다. Reader가 입력창으로 입력받고, Writer가 입력받은 문자들을 출력해주는 역할. 항상 예외처리를 해줘야 하는 걸 잊지 말고 해줘야 하겠다.