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
반응형
'JAVA' 카테고리의 다른 글
[JAVA] MVC 자판기 프로그램 실습 (CRUD 개념) (0) | 2022.06.29 |
---|---|
[JAVA] 시험 오답풀이 (For-each문) (0) | 2022.06.27 |
[JAVA] 예외 처리 (try, catch, finally) (0) | 2022.06.27 |
[JAVA] 인터페이스 Interface (0) | 2022.06.27 |
[JAVA] 추상메소드, 추상클래스 (abstract) (0) | 2022.06.27 |