본문 바로가기

JAVA

[JAVA] 파일 입출력 (FileInputStream , FileOutputStream)

728x90
반응형

FileInputStream 

  • InputStream 클래스를 상속받은 자식 클래스, 하드 디스크 상에 있는 파일로부터 바이트 단위의 입력을 받는 클래스다. 출발 지점과 도착 지점을 연결하는 통로(스트림)을 생성한다.
  • 생성자의 인자로 File 객체를 주거나 파일명을 직접 String 형태로 줄 수 있다. 일반적으로 파일명을 String 꼴로 주는 경우가 많은데 파일이 존재하지 않을 가능성도 있어 Exception 처리가 필요.
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
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
 
public class Test02 {
    public static void main(String[] args) {
        File file = new File("C:\\0607KIM\\resource\\test3.txt");
        // 해당 경로에 위치하는 파일이 존재하지않으면 새로 만들어줌! 
        // -> FNE을 줄이는데 도움이 된다. 
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            System.out.println("로그 : 파일객체생성완료");
        }
 
        try {//FileInputStream : 파일을 불러오기 위해서 생성 
            FileInputStream fis = new FileInputStream(file);
            // 둘중에 하나 사용하면됨 / 경로를 쓸경우에는 사전에 파일을 만들 필요가 없다. 
  //FileInputStream fis = new FileInputStream("C:\\0607KIM\\resource\\test2.txt");
            // 해당 파일이 경로에 존재하지 않으면 예외발생 
            int data; // fis는 숫자로 구성된 데이터이므로 int타입
//무한루프 방지를위해 -1이 아닐때까지만 읽으라고 명령
            while ((data=fis.read()) != -1) {
                // 그냥출력하면 아스키 코드로 받아와지기 때문에 char로 형변환 
                System.out.print((char)data); 
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}
 
cs

FileOutputStream

  • OutputStream 클래스를 상속받은 자식 클래스, 파일로 바이트 단위의 출력을 내보내는 클래스.
  • Sink 스트림의 일종으로 3개의 생성자가 중복 정의되어 있다.
  • FileInputStream의 생성자와 거의 같은 형태인데 하나 더 있는 생성자의 형식은 append 처리를 위한 논리 변수를 인자로 갖고 있다.이 값이 true로 설정되면 기존에 존재하던 파일의 가장 뒷부분에 꼬리물기 식으로 연결해 출력된다.
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
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
 
public class Test03 {
    public static void main(String[] args) {
// 가독성및 유지보수 위해서 상수화
        final String path1="C:\\0607KIM\\resource\\";  
        final String path2=".txt";
 
        try {
            FileOutputStream fos = new FileOutputStream(path1+"test2"+path2,true);
            // 해당 경로에 파일이없다면, 새로 생성함! 
            // 해당 경로에 파일이있다면, 덮어쓰기가됨! 
            // -> 오버로딩된 생성자를 활용하면 이어쓰기가 가능하다. 
 
            fos.write(65); // 아스키코드 
            fos.flush(); // 버퍼비우기
            fos.close(); // 버퍼닫기 
        } catch (Exception e) { // 파일의 경로를 못찾는 에러 
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            System.out.println("fos를 통해서 파일객체 작성완료");
        }
    }
}
 
cs

< 예제 >

문제 : 1234 라고 적혀있는 test1 파일을 읽어서 각자리를 모두 더해서 test2파일에 10을 출력이되도록 만들기

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
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
 
public class Test04 {
    public static void main(String[] args) {
 
        final String path1="C:\\0607KIM\\resource\\";
        final String path2=".txt";
 
        int sum=0;
        try {//test1에 파일 입력 
            FileInputStream fis=new FileInputStream(path1+"test1"+path2); 
 
            int data;
//무한루프 방지를위해 -1이 아닐때까지만 읽으라고 명령
            while((data=fis.read())!=-1) {
                System.out.println(data);
                // 아스키코드로 출력되니 형변환하여 출력되도록한다.
                char ch=(char)data;
                String str="";
                str+=ch;
                System.out.println(ch);
                int num=Integer.parseInt(str);
                sum+= num;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("sum= "+sum);
 
        try {//test2파일에 10작성하기 
            FileOutputStream fos=new FileOutputStream(path1+"test2"+path2);
            //10이라는 문자열을 넣어야하는데 
            //write()는 두개 이상은 입력이 안되니 1,0 각각 입력해야함 
            fos.write((char)49); // 문자열1 -> 아스키코드49
            fos.write((char)48); // 문자열0 -> 아스키코드48 
            fos.flush(); // 버퍼비우기
            fos.close(); // 버퍼닫기 
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
cs

이미지(jpg) 복사본 생성하기 

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
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
 
public class Test05 {
    public static void main(String[] args) {
 
        final String path="C:\\0607KIM\\resource\\"// 원본파일 접근 
        try {
            //원본파일 불러오기 
            FileInputStream fis=new FileInputStream(path+"photo.jpg");
            //복사본 생성 
            FileOutputStream fos=new FileOutputStream(path+"photo- 복사본.jpg");
            
            //배열의 길이는 넉넉하게 입력 
            byte[] buff=new byte[1000];
            // byte[] 를 인자로 받는 read메서드를 오버로드
            int len;
            while((len=fis.read(buff)) != -1) { 
                //buff공간에서 0데이터를 len만큼 write할게
                fos.write(buff,0,len);
            }
            fos.flush(); // 버퍼비우기
            fos.close(); // 버퍼닫기 
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            System.out.println("이미지 파일 복사-붙여넣기 완료");
        }
    }
}
cs

 

 

 

 

 

728x90
반응형