개발 기록

파일의 입출력[java / io] 본문

Java/javaSE

파일의 입출력[java / io]

청군로 2021. 6. 2. 12:18

자바에서 제공하는 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
Comments