본문 바로가기
BackEnd/Java

IO_FileOutPutStream & FileInputStream

by pplucy 2020. 10. 31.

* 기반스트림

FileOutPutStream & FileInputStream

: 다양한 파일에 바이트 타입의 데이터를 저장하거나(쓰거나) 다양한 파일로부터 바이트 타입의 데이터를 읽는 바이트스트림

 

 

1. FileOutputStream

 

그림, 오디오, 비디오, 텍스트 파일 등  모든 종류의 데이터를 파일로 저장

 

(1) FileOutputStream의 생성자

* FileOutputStream(String name)

  : 지정된 파일이름(String name)을 가진 실제 파일과 연결된 FileOutputStream을 실행한다.

 

* FileOutputStream(String name , boolean append)

  : 저장된 파일이름(String name)을 가진 실제 파일과 연결된 FileOutputStream을 생성한다.

    두번째 인자인 append를 true로 하게되면 출력시 기존에 있던 파일 내용의 마지막에 덧붙이고,

    false면 기존파일 내용에 덮어쓰게된다.

 

* FileOutputStream(File file)

  : 파일의 이름을 String이 아닌 File 인스턴스로 지정해줘야한다.

    지정된 File인스턴스를 가진 실제파일과 연결된 FileOutputStream을 실행한다

 

 

 

(2) FileOutputStream :

    - 파일의 내용을 1바이트 단위로 쓰는 스트림

    - 해당경로의 파일과 프로그램간 OutputStream을 생성하고 경로를 생략할 경우 프로그램의 위치에 파일을 생성한다.

    - 해당경로에 파일이 존재하지 않으면 내부적으로 File클래스를 생성해 파일을 만든 다음 새롭게 생성된 파일과 연결되는

       OutputStream을 만들어준다. 

    - 시스템적으로 파일을 만들 수 없는 상황이면, FileNotFoundEsception을 throw한다.   

 

(3) 주의사항

       - FileOutputStream은 바이트스트림이기 때문에 문자열을 받았을 경우 문자를 String클래스의 getByte 메소드를 사용해서 변환해줘야한다.

      

 

      

1. FileInputStream

 

그림, 오디오, 비디오, 텍스트 파일 등  모든 종류의 파일을 읽을 수 있음

 

(1) FileInputStream: 

      - 파일의 내용을 1바이트 단위로 읽는 스트림

      - 경로에는 존재하는 파일과 프로그램(메모리)간 InputStream을 열어준다.

      - 경로를 생략하면 경로는 프로그램의 위치이다. 만약 파일이 없다면 FileNotFoundException을 발생시킨다. 

 

(2) 주의사항

  - 데이터를 꺼내올 때 byte의 경우 0-255사이의 값만 처리할 수 있기 때문에 이 이상의 값은 처리가 불가하다.

    그렇기 때문에 int로 형변환을 시켜 더 많은 값을 처리할 수 있게끔 해야한다.

  - FileInputStream의 read()메소드는 읽어낼 파일의 끝에 다다르면 -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
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
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;
 
 
public class B_FileIO {
 
    
    Scanner sc  = new Scanner(System.in);
    
    //FileOutputStream, FileInputStream 모두 OutputStream과 InputStream을 상속받고 있는 클래스
    
 
    //OutputStream : 프로그램 -> 데이터 목적지
    //               JVM에 있는 데이터를 파일 또는 기타 데이터 목적지로 전송
    
    public void fileOut() {
        
        System.out.println("파일명을 입력하세요 : ");
        String fileName = sc.nextLine();
        System.out.println("문구를 입력하세요 : ");
        String contents = sc.nextLine();
        
        
        FileOutputStream fos = null;
        
        try {
            
            /* 1. FileOutputStream.(경로+파일명)
            
            
            fos = new FileOutputStream(fileName, true); //true값을 주면 파일의 데이터 끝에 덧붙여서 쓴다.
            
            fos.write(contents.getBytes()); // 문자열 -> 바이트로 변환 : getByte
            
            //byte[] bArr = {99,100,101}; -> 배열로도 입력할 수 있지만 숫자의 경우 char로 변환되어 유니코드 문자로 저장됨! (c,d,e)
            //fos.write(bArr);   
            
            System.out.println("파일생성이 완료되었습니다. 프로젝트를 새로고침하세요.");
            
            
            
            
            
        } catch (FileNotFoundException e) { //fos = new FileOutputStream 에 대한 예외처리
        
            e.printStackTrace();
            
            
        } catch (IOException e) { //fos.write에 대한 예외처리
            
            e.printStackTrace();
        } finally {
            
            try {
                fos.close(); //꼭 닫아줘야한다 !
                
            } catch (IOException e) {
                
                e.printStackTrace();
            }
            
        }
                
    
    }
    
    
    //InputStream : 입력스트림, 데이터의 근원지 ->  프로그램(메모리)
    public void fileIn() {
        
        System.out.println("읽어올 파일명을 작성하세요: ");
        String fileName = sc.nextLine();
        
        
        
        FileInputStream fis = null;
        
        try {
            
            /* 1. FileInputStream(경로 + 파일명)             
 
            fis = new FileInputStream(fileName);
            
            int check = 0//byte가 0~255사이의 값만 표기해줄 수 있기 때문에 256이상의 값은 받아들일 수 없다. 그래서 int로 변환하는 것 !
            String res = "";
            while((check = fis.read()) != -1) { //read()메소드는 읽어올 파일의 끝을 만나면 -1값을 리턴하기 때문에 -1이 아닐 때까지 반복
                
                res += (char)check; //byte값을 모아모아
                
            }
            
            //인코딩 타입 읽어주기 -> 그냥 출력하면 글자가 깨짐
            //checkEncoding(res);
            
    
            res = new String(res.getBytes("iso-8859-1"), "utf-8");
            System.out.println(res);
            
            
        } catch (FileNotFoundException e) {
            
            e.printStackTrace();
            
        } catch (IOException e) {
        
            e.printStackTrace();
        }
        
        
        
        
    }
    
cs

'BackEnd > Java' 카테고리의 다른 글

IO_ ObjectInputStream & ObjectOutputStream  (0) 2020.11.01
IO_BufferedInputStream & BufferedOutputStream  (0) 2020.10.31
IO _ File 클래스  (0) 2020.10.31
IO (입출력)  (0) 2020.10.31
Date와 Calendar  (0) 2020.10.29

댓글