일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- chrome mobile debug
- oracle
- Tomcat
- spring
- 코딩테스트연습
- 프로그래머스
- sqlplus
- 유효성 그룹
- 톰캣
- CSS
- js
- MySQL
- CLASS
- 프로젝트
- 그룹별 유효성 검사
- C언어
- 타임리프 리로드
- db
- java
- Valid groups
- 크롬 디버깅
- JavaScript
- C
- HTML
- GUI
- Thymeleaf
- devtools
- Swing
- vue-cookies
- node.js
개발 기록
파일의 입출력[java / io] 본문
자바에서 제공하는 io에는 입출력을 가능하게 하는 클래스들이 있다.
이중에서도 파일을 담당하는 클래스를 이용해서 이미지파일을 읽어오고, 내보내는 간단한 테스트를 해보잣.
우선 파일을 읽어 오려면 FileInputStream 클래스가 필요하다! 클래스명에서 알 수 있듯이 input을 담당한다.
FileInputStream fis = new FileInputStream("파일 경로"); //읽어올 파일의 풀 경로를 입력하면 fis의 데이터를
읽어올 수 있는 통로가 이어진다. 이제 이미지 파일을 읽을 수 있는 통로가 마련 됐으니 내보낼 통로도 만든다.
FileOutputStream fos = new FileOutputStream("저장할 파일 경로+저장할 파일명"); //내가 데이터를 어디로 내보낼 지,
어떤 파일명으로 저장할 지를 입력해주면 데이터를 내보낼 수 있는 통로도 생성이 된 것이다.
//파일을 읽어오는 과정에서 파일 경로나 파일 상태 등에 의해 FileNotFoundException가 발생할 수 있기에
예외처리를 해줘야 한다.
이제 fis를 이용해서 이미지 파일을 읽어오면 되는데 이때 사용하는 메서드가 read( )이다.
//입출력 시에 IOException가 발생할 수 있으므로 예외처리 해줘야함
read는 1Byte씩 데이터를 읽어오고, 1Byte가 넘어가는 한글 등은 읽어 올 수 없다.(이때는 Reader 클래스를 사용하면 됨)
read( )메서드는 데이터를 읽어오고 반환 해주는데 만약 더 이상 읽을 데이터가 없다면, -1을 반환한다. 이를 이용해서
반복문을 돌려준다.
int data = -1; //fis를 통해 읽어온 데이터를 저장할 변수이며, fos를 통해 변수에 담겨진 값을 내보내야 한다.
while(true){ //읽고자 하는 파일의 크기를 알 수 없으니 무한 루프를 생성한다.
data = fis.read( ); //아까 연결한 이미지파일을 1byte씩 읽어와서 data변수에 저장한다.
if(data == -1) break; //만약 data변수에 -1이 담겨있다면 더 이상 읽을 데이터가 없다는 뜻이므로 반복문 종료
fos.write( data ); //데이터를 읽는 메서드가 read( )였다면 반대로 데이터를 내보내는 메서드는 write이다.
//즉, 우리가 지정한 저장경로에 데이터를 1byte씩 쓰는 것이다.
}
System.out.println("이미지 복사 완료");
정상적인 파일 경로를 넣었다면 이미지파일이 정상적으로 복사되는 것을 알 수 있다.
FileInputStream 객체와, FileOutputStream 객체를 생성하여 파일을 읽고 내보낼 통로를 만들었다면
프로그램이 종료되기 전 이 통로는 반드시 끊어줘야한다. finally영역은 무조건 실행되는 영역이므로 close메서드를
이용해서 연결을 끊어주자.
package io.bytestream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JOptionPane;
public class CopyImage {
FileInputStream fis;
FileOutputStream fos;
public CopyImage() {
try {
fis = new FileInputStream("D:\\images\\food\\갈비찜.jpg"); //읽어올 파일의 경로
fos = new FileOutputStream("D:\\images\\food2\\갈비찜.jpg"); //저장할 경로와 파일명
int data = -1; //읽어온 데이터가 저장될 변수
while(true) {
data = fis.read(); //1Byte씩 데이터 읽어오기
if(data == -1) break; //더 이상 읽을 데이터가 없다면 반복문 탈출
fos.write(data); //1Byte씩 데이터 쓰기
}
System.out.println("복사 완료");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally { //이 영역은 무조건 실행 되므로 아까 연결했던 통로를 끊어주자.
if(fis != null) { //fis객체가 생성 됐는지 확인 후 연결 끊기
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new CopyImage();
}
}
'Java > javaSE' 카테고리의 다른 글
java 메일 보내기[Gmail] (0) | 2021.06.04 |
---|---|
Calendar 클래스[달력 만들기] (0) | 2021.06.02 |
Thread-쓰레드[java] (0) | 2021.05.27 |
자바 GUI 띄우기[JFrame] (0) | 2021.05.12 |
overriding[java] (0) | 2021.05.03 |