Java File에 대한 이해

박현우·2024년 1월 10일

1. File
1-1. 문자 인코딩(character encoding)이란?

  • 문자나 기호들의 집합을 컴퓨터에서 저장하거나 통신에 사용할 목적으로 부호화하는 방법
  • UTF-8 : 8비트 이진수로 표현하는 방법

1-2. 스트림이란?

  • 입출력에서 stream이란, 디바이스의 입출력 방식이 character 단위이든 block 단위이든 관계없이 '1바이트'씩 '연속'적으로 전달되는 형태로, 추상화된 상태를 의미한다.
  • 입출력 장치는 개별적인 특성이 있으므로 읽고, 쓰는 단위가 각각 다르지만, 스트림은 이러한 일련의 과정을 추상화하여 모든 디바이스를 character 단위로만 사용하도록 한다.
  • 즉, 입출력 디바이스의 특성을 무시하고 하나의 단일한 입출력 인터페이스로 다룰 수 있도록 하는 것이 stream이다.

1-3. 자바의 스트림 관련 클래스

  • 스트림 관련 클래스들은 각각 InputStream(입력/읽기), OutputStream(출력/저장)과 관련된 인터페이스를 상속받기 때문에 모두 동일한 메서드를 가지고 있다.
  • 프로그래머는 상황에 따라 적절한 클래스를 사용하기만 하면 동일한 방법으로 스트림을 사용할 수 있다.

1-4. 파일 저장 관련

  • 저장을 위한 빈 파일을 생성하기
    -> OutputStream의 객체를 생성한다.

  • 파일에 내용 쓰기
    -> 저장할 내용을 byte 배열로 변환
    -> 변환된 배열을 OutputStream의 write()메서드에게 파라미터로 전달한다.

  • 파일 닫기
    -> OutputStream 객체로 close() 메서드를 호출하여 스트림을 닫는다.

1-5. 파일 저장시 유의사항

  • OutputStream은 각각의 단계마다 예외처리를 강제적으로 요구한다.

  • try~catch 블록이 형성되는 과정에서 변수의 유효성 범위에 대한 처리에 유의해야 한다.

    	package file;
    
    	import java.io.FileNotFoundException;
    	import java.io.FileOutputStream;
    	import java.io.IOException;
    	import java.io.OutputStream;
    	import java.io.UnsupportedEncodingException;
    
    	public class Main01 {
    
    	public static void main(String[] args) {
    		// 저장할 파일의 경로
    		final String PATH = "./test.txt";	// ./ 는 현재 위치라는 뜻
    	
    		// 파일에 저장할 내용
    		String write_string = "테스트 문자열 다시 입력";
    	
    		// 특정 인코딩 방식을 적용
    		byte[] buffer = null;
    		try {
    			buffer = write_string.getBytes("utf-8");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    	
    		// 파일 저장 절차 시작
    		// 파일 저장을 위한 FileOutputStream은 
    		// 저장된 파일에 대한 경로를 생성자 파라미터로 설정해야 하고
    		// 부모 형태로 암묵적 형변환 처리한다.
    		OutputStream out = null;
    		try {
    			  out = new FileOutputStream(PATH);
    			// 파일 쓰기
    			out.write(buffer);
    			System.out.println("[INFO] 파일 저장 성공 >> " + PATH);
    		} catch (FileNotFoundException e) {
    			System.out.println("[ERROR] 지정된 경로를 찾을 수 없음 >> " + PATH);
    			e.printStackTrace();
    		} catch (IOException e) {
    			System.out.println("[ERROR]파일 저장 실패 >> " + PATH);
    			e.printStackTrace();
    		} catch(Exception e) {
    			System.out.println("[ERROR] 알 수 없는 에러" + PATH);
    			e.printStackTrace();
    		}	finally {
    				if(out != null) {
    						try {
    							out.close();
    						} catch (IOException e) {
    							e.printStackTrace();
    						}
    				}
    		}
    	
    	
    	
    	}

}

1-6. 파일 읽기 과정

  • 파일을 읽기 위한 InputStream 객체를 생성하기

  • 읽은 내용을 담기 위한 빈 byte 배열 생성하기
    -> 파일의 요양 크기만큼 배열의 사이즈를 지정해야 한다.

  • 파일의 내용 읽기
    -> 읽은 내용을 담기 위한 byte배열을 InputStream 객체의 read() 메서드에게 파라미터로 전달한다.

  • 사용이 완료된 스트림 닫기
    -> InputStream 객체의 close() 메서드를 호출하여 스트림을 닫는다.

  • 읽은 내용을 문자열로 변환하기
    -> byte배열을 String 클래스의 생성자에게 전달하여 문자열로 변환한다.
    -> 이 과정에서 어떤 인코딩을 사용할지를 함께 설정해야 한다.

    	    package file;
    
    	import java.io.FileInputStream;
    	import java.io.FileNotFoundException;
    	import java.io.IOException;
    	import java.io.InputStream;
    	import java.io.UnsupportedEncodingException;
    
    	public class Main02 {
    
    	public static void main(String[] args) {
    		// 읽을 파일 경로
    	//		final String PATH = "./test.txt";
    			final String PATH = "K:/test.txt";
    	
    	
    		// 읽은 내용이 담겨질 스트림
    		byte[] data = null;
    	
    		// 읽은 내용이 변환될 문자열
    		String read_string = null;
    	
    		InputStream in = null;
    	
    		// 파일 읽기
    		try {
    			in = new FileInputStream(PATH);
    		
    			// 읽은 내용을 담기 위한 배열은 파일의 용량만큼
    			// 사이즈를 할당한다.
    			// in.available()-> 열고 있는 파일의 크기
    			data = new byte[in.available()];
    		
    			// 파일 읽기 - 파라미터로 전달된 배열 안에
    			// 파일의 내용을 담아준다.
    			in.read(data);
    		
    			System.out.println("[INFO]파일 읽기 성공 >> " + PATH);
    		} catch (FileNotFoundException e) {
    			System.out.println("[ERROR]지정된 경로를 찾을 수 없음 >> " + PATH);
    			e.printStackTrace();
    		} catch (IOException e) {
    			System.out.println("[ERROR]파일 읽기 실패 >> " + PATH);
    			e.printStackTrace();
    		}catch(Exception e) {
    			  System.out.println("[ERROR]알 수 없는 에러 >> " + PATH);
    			  e.printStackTrace();
    		  }
    		 finally {
    			if(in != null) {
    				try {
    					in.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	
    		// data 배열에 내용이 있다면, 문자열로 변환하여 출력
    		if(data != null) {
    			try {
    				read_string = new String(data, "utf-8");
    				System.out.println(read_string);
    			} catch (UnsupportedEncodingException e) {
    				System.out.println("[ERROR]인코딩 지정 에러");
    				e.printStackTrace();
    			}
    		}
    	
    	}
    
    	}

0개의 댓글