반응형

[Java 실습 #18] InputStream 재사용 (1) - mark, reset 활용

 

1. java.io.InputStream의 mark, reset 설정으로 InputStream 재사용

2. 개발환경

    2.1. 개발환경

    2.2. 라이브러리

3. 구현

    3.1. 프로젝트 구조

    3.2. 파일 - 텍스트 파일

    3.3. 구현 - 소스코드

4. 결과

 

 

1. java.io.InputStream의 mark, reset 설정으로 InputStream 재사용

InputStream의 read() 관련 호출은 InputStream을 한번만 읽을 수 있다.

InputStream의 mark, reset의 pointer 설정을 통해 InputStream 재사용 가능

 

2. 개발환경

 

2.1. 개발환경

MacOS M1 - macOS Monterey 12.0.1

IntelliJ IDEA 2021.2 (Community Edition)

 

2.2. 라이브러리

JDK 1.8

 

 

3. 구현

3.1. 프로젝트 구조

 

3.2. 파일 - 텍스트

[ sample-data.txt ]

1
2
3
4
5
6
7
package io.home.test;
 
public class InputStreamToByteArray {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

 

3.3. 구현 - 소스코드

[ MarkAndResetInputStream.java ]

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
package io.home.test;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
 
public class MarkAndResetInputStream {
    private static final String USER_DATA_PATH = "resource";
    private static final String USER_DATA_FILE_NAME = "sample-data.txt";
 
    private void readUserData() {
        String filePath = "/" + USER_DATA_PATH + "/" + USER_DATA_FILE_NAME;
        InputStream is = MarkAndResetInputStream.class.getResourceAsStream(filePath);
        if (is == nullthrow new RuntimeException("No data in " + filePath);
 
        is.mark(0);
        readInputStreamLine(is);
        System.out.println("\n\n");
 
        try {
            is.reset();
        } catch (IOException ioe) {
        }
 
        readInputStreamLine(is);
        System.out.println("\n\n");
 
        try {
            is.reset();
        } catch (IOException ioe) {
        }
 
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String result = br.lines().collect(Collectors.joining("\n"));
        System.out.println(result);
        System.out.println("\n\n");
 
        readInputStreamLine(is);
        System.out.println("\n\n");
 
        try {
            is.close();
        } catch (IOException ioe) {
            System.out.println("close InputStream failed...");
        }
    }
 
    private String readAllLines(InputStream is) {
        String result;
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        result = br.lines().collect(Collectors.joining("\n"));
        return result;
    }
 
    private void readInputStreamLine(InputStream is) {
        int increment = 0;
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = br.readLine()) != null) {
                increment++;
//                System.out.println(line);
            }
        } catch (IOException ioe) {
        }
        System.out.println("Read " + increment + " lines...");
    }
 
    public static void main(String[] args) {
        MarkAndResetInputStream markAndResetInputStream = new MarkAndResetInputStream();
        markAndResetInputStream.readUserData();
    }
}
 

 

 

4. 결과

reset() 하지 않은 경우 InputStream을 읽을 수 없다.

 

반응형