quilt code

[고급자바] IO (3) 본문

daily/고급자바

[고급자바] IO (3)

김뱅쇼 2023. 2. 13. 19:25

1. 입출력 성능향상을 위한 보조스트림 예제 1

 

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
package kr.or.ddit.basic;
 
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
 
public class T11BufferedIOTest {
    public static void main(String[] args) {
        
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        
        try {
            fos = new FileOutputStream("d:/D_Other/bufferTest.txt");
            
            // 버퍼의 크기를 지정하지 않으면 기본적으로 버퍼의 크기가 8192byte(8Kb)로 설정된다.
            
            // 버퍼의 크기가 5인 스트림 객체 생성
            bos = new BufferedOutputStream(fos, 5);
            
            for(char ch='1'; ch <= '9'; ch++) {
                System.out.println("쓰기작업.");
                bos.write(ch);
            }
            
            bos.flush();    // 작업을 종료하기 전에 버퍼에 남아있는 데이터를 모두 출력시킨다.
                                  // close시 자동으로 호출됨.   예전에는 없으면 안됐는데 버전이 업그레이드 되면서 없어도 실행 및 저장이 됨 
            
            System.out.println("작업 끝...");
            
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
 
}
cs

 

2. 성능향상을 위한 보조스트림2 (문자기반의 Buffered 스트림 예제)

 

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 kr.or.ddit.basic;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
 
 
public class T12BufferedIOTest {
    
    public static void main(String[] args) {
    
        FileReader fr = null;
        BufferedReader br = null;   // 한줄씩 읽는 기능 제공
        
        try {
            // 이클립스에서 만든 자바 프로그램이 실행되는 기본 위치는 해당 '프로젝트폴더'가 기본 위치가 된다.
            fr = new FileReader("./src/kr/or/ddit/basic/T11BufferedIOTest.java");  //상대경로
            
            /*int data = 0;
            while((data = fr.read()) != -1){
                System.out.print((char) data);
            }
            */
            
            br = new BufferedReader(fr);
            
            String temp = "";
            int cnt = 1;
            while((temp = br.readLine()) != null) {
                System.out.printf("%4d : %s\n", cnt++, temp);
            }
            
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
    }
 
}
cs

 

3. 기본타입 입출력 기능 보조스트림 예제

 

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
package kr.or.ddit.basic;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class T13DataIOStreamTest {
    public static void main(String[] args) throws IOException {
        
        FileOutputStream fos = new FileOutputStream("d:/D_Other/test.dat");
        
        // DataOutputStream은 출력용 데이터를 자료형에 맞게 출력해 준다.
        DataOutputStream dos = new DataOutputStream(fos);
         
        dos.writeUTF("홍길동");          // 문자열 데이터 출력(UTF-8)
        dos.writeInt(17);              // 정수형으로 데이터 출력
        dos.writeFloat(3.14f);         // 실수형(Float)으로 데이터 출력
        dos.writeDouble(3.14);         // 실수형(Double)으로 데이터 출력
        dos.writeBoolean(true);         // 논리형으로 데이터 출력
        System.out.println("출력 완료...");
        
        dos.close();
        /////////////////////////////////////////////////////////////
        
        // 출력한 자료 읽어오기
        DataInputStream dis = new DataInputStream(
                                    new FileInputStream("d:/D_Other/test.dat"));  // 객체 바로 생성
        
        System.out.println("문자열 자료 : " + dis.readUTF());
        System.out.println("정수형 자료 : " + dis.readInt());
        System.out.println("실수형(Float) 자료 : " + dis.readFloat());
        System.out.println("실수형(Double) 자료 : " + dis.readDouble());   // 읽는 순서를 바꾼다면?(float<->double) 원래 값이 유지가 안됨
        System.out.println("논리형 자료 : " + dis.readBoolean());
        
        dis.close();
        
    }
 
}
cs

 

4. 프린터 기능을 제공하는 보조스트림

 

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
package kr.or.ddit.basic;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
 
 
 
public class T14PrintStreamTest {
    public static void main(String[] args) throws IOException {
        
        FileOutputStream fos = new FileOutputStream("d:/D_Other/print.txt");
        
        // PrintStream은 모든 데이터를 출력할 수 있는 기능을 제공하는 보조스트림이다.
        
        PrintStream out = new PrintStream(fos);
        out.println("안녕하세요. PrintStream입니다.\n");
        out.println("안녕하세요. PrintStream입니다2.");
        out.println("안녕하세요. PrintStream입니다3."); 
        out.println(out);     // 객체 출력
        out.println(3.14);
        
        System.out.println();
        
        ////////////////////////////////////////////
        
        /*
         *   PrintWriter가 PrintStream보다 다양한 인코딩의 문자처리에 적합하지만 예전부터 써 오던 객체라 계속 사용중임.
         */
             PrintWriter pw = new PrintWriter(
                                 new OutputStreamWriter(
                                         new FileOutputStream("d:/D_Other/print2.txt"), "UTF-8"));
             
             pw.print("안녕하세요. PrintWriter 입니다.\n");
             pw.println("안녕하세요. PrintWriter 입니다2.");
             pw.println("안녕하세요. PrintWriter 입니다3.");
             
             pw.close();
        
    }
    
}
cs

 

5. 객체 입출력을 위한 보조스트림 예제

 

1) 

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
package kr.or.ddit.basic;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
public class T15ObjectStreamTest {
    public static void main(String[] args) {
        
        Member mem1 = new Member("정재현"10"대전");
        Member mem2 = new Member("이태민"20"광주");
        Member mem3 = new Member("나재민"30"대구");
        Member mem4 = new Member("김준면"40"서울");
        
        ObjectOutputStream oos = null;
        
        try {
            // 객체를 파일로 저장하기
            
            // 출력용 스트림객체 생성하기
            oos = new ObjectOutputStream(
                    new FileOutputStream("d:/D_Other/memObj.bin"));
            
            // 객체 쓰기 작업
            oos.writeObject(mem1);     //직렬화
            oos.writeObject(mem2);     //직렬화
            oos.writeObject(mem3);     //직렬화
            oos.writeObject(mem4);     //직렬화
            
            System.out.println("쓰기 작업 완료...");
            
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        //////////////////////////////////////////////////////
        
        ObjectInputStream ois = null;
        
        try {
            // 저장한 객체를 읽어와 화면에 출력
            
            ois = new ObjectInputStream(
                    new FileInputStream("d:/D_Other/memObj.bin"));
            
            Object obj = null;
            
            while((obj = ois.readObject()) != null) {
                // 읽어온 데이터를 원래의 객체형으로 변환 후 사용한다.
                Member mem = (Member) obj;
                System.out.println("이름 : " + mem.getName());
                System.out.println("나이 : " + mem.getAge());
                System.out.println("주소 : " + mem.getAddr());
                System.out.println("---------------------------");
            }
                
            
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
        } try {
            ois.close();
        } catch(IOException e) {
            e.printStackTrace();
            
        }
    }
 
}
cs

 

2) 회원정보를 담기 위한 VO 클래스


자바는 Serializable 인터페이스를 구현한 클래스만 직렬화 할 수 있도록 제한하고 있음
구현하지 않으면 직렬화 작업시 예외발생함

 

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
class Member implements Serializable {
    // 자바는 Serializable 인터페이스를 구현한 클래스만 직렬화 할 수 있도록 제한하고 있음
    // 구현하지 않으면 직렬화 작업시 예외발생함.
    
    private String name;
    private int age;
    private String addr;
    
    public Member(String string, int age, String addr) {
        
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    
    @Override
    public String toString() {
        return "Member [name=" + name + ", age=" + age + ", addr=" + addr + "]";
    }
    
    
    
    
}
cs

'daily > 고급자바' 카테고리의 다른 글

[고급자바] 람다  (0) 2023.02.14
[고급자바] IO (4)  (0) 2023.02.14
[고급자바] IO (2)  (0) 2023.02.13
[고급자바] IO (1)  (0) 2023.02.13
[고급자바] Thread(6)  (0) 2023.02.13