ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java.io.FileInputStream 메소드
    카테고리 없음 2020. 10. 27. 15:17

     

    [ FileInputstream ]

    • java.io의 가장 기본 파일 입출력 클래스
    • 입력 스트림(통로)을 생성해줌
    • 사용법은 간단하지만, 버퍼를 사용하지 않기 때문에 느림
    • 속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 쓰는 경우가 많음

    [ 생성자 ]

    • new FileInputStream(File file)
    • new FileInputStream(FileDescriptor jdObj)
    • new FileInputStream(String name)

    생성자는 여러 타입의 매개변수를 받지만 공통적으로 파일의 주소와 이름의 정보를 가진 객체를 받아 해당 파일과의 입력 스트림을 생성합니다.

     

    [ int read() ]

    • 모두 현재 파일 포인터 위치를 기준으로 함 (파일 포인터 앞의 내용은 없는 것처럼 작동)
    • int read() : 1byte씩 내용을 읽어 정수로 반환
    • int read(byte[] b) : 파일 내용을 한번에 모두 읽어서 배열에 저장
    • int read(byte[] b. int off, int len) : 'len'길이만큼만 읽어서 배열의 'off'번째 위치부터 저장

    1byte 크기의 정수로 반환해주기 때문에 문자로 출력하기 위해서는 (char)타입으로 형변환 해줘야 합니다. read()로 읽은 뒤에는 파일 포인터가 마지막에 읽은 위치에 가 있는 점을 유의해야 합니다. 기본 스트림은 특성이 일종의 흐름이므로, 이 파일 스트림의 위치를 정교하게 컨트롤할 수 없다는 단점이 있습니다. 그냥 읽는대로 흘러간다라고 생각하면 됩니다. 이러한 단점을 극복할 수 있는 기능은 'RandomAccessFile' 클래스에 구현되어 있습니다.

     

    public class Main {
    	public static void main(String[] args) {
    
    		byte[] arr1 = new byte[20];
    		byte[] arr2 = new byte[20];
    		
    		// 파일 열기 (해제 자동)
    		try (FileInputStream fi = new FileInputStream("input.txt")) {
    			
    			// 1byte만 읽음
    			System.out.println((char)fi.read());
    			
    			// 4글자만 읽어서 배열의 0번 인덱스부터 저장
    			fi.read(arr2, 0, 4);
    			for(byte a : arr2)
    				System.out.print((char)a);
    			// 남은 모든 내용 배열에 저장
    			fi.read(arr1);
    			System.out.println();
    			for(byte a : arr1)
    				System.out.print((char)a);
    			
    		// 예외처리
    		} catch (Exception e) {
    
    			System.out.println("실패.");
    		}	
    	}
    }

    [ byte[] readAllBytes() ]

    • 현재 파일 포인터에서 EOF(End Of File)까지의 모든 내용을 byte 타입의 배열(주소)을 반환
    • byte[] 배열의 참조변수 주소로 바로 넣어줄 수도 있고, 아래 코드와 같이 바로 출력도 가능
    public class Main {
    	public static void main(String[] args) {
    		
    		// 파일 열기 (해제 자동, try-with-resources)
    		// input.txt : "Hello World..!!"
    		try (FileInputStream fi = new FileInputStream("input.txt");
    				FileOutputStream fo = new FileOutputStream("output.txt")) {
    			
    			for(byte b : fi.readAllBytes())
    					System.out.print((char)b); // "Hello World..!!"
    
    		// 예외처리
    		} catch (Exception e) {
    
    			System.out.println("실패.");
    		}	
    	}
    }

    [ byte[] readNBytes(int len) ]

    • 현재 파일 포인터에서 N byte만큼을 담은 byte 타입 배열 반환
    public class Main {
    	public static void main(String[] args) {
    		
    		// 파일 열기 (해제 자동, try-with-resources)
    		// input.txt : "Hello World..!!"
    		try (FileInputStream fi = new FileInputStream("input.txt");
    				FileOutputStream fo = new FileOutputStream("output.txt")) {
    			
    			for(byte b : fi.readNBytes(5))
    				System.out.print((char)b);  // "Hello"
    			
    		// 예외처리
    		} catch (Exception e) {
    
    			System.out.println("실패.");
    		}	
    	}
    }

    [ int available() ]

    • 현재 파일 포인터 위치에서 읽을 수 있는 바이트 수 반환
    public class Main {
    	public static void main(String[] args) {
    		
    		// 파일 열기 (해제 자동)
    		try (FileInputStream fi = new FileInputStream("input.txt")) {
    			
    			// 현재 읽을 수 있는 바이트 수
    			System.out.println(fi.available()); // 15 
    			
    			// 1byte씩 2번 읽음
    			System.out.println((char)fi.read());
    			System.out.println((char)fi.read());
    			
    			System.out.println(fi.available()); // 13
    			
    			
    		// 예외처리
    		} catch (Exception e) {
    
    			System.out.println("실패.");
    		}	
    	}
    }

    [ long skip(long numbytes) ]

    • 매개변수로 받은 바이트 수만큼 파일 포인터를 이동시킴
    • 기본 스트림에서는 파일 포인터가 반대로 돌아오지는 못함
    public class Main {
    	public static void main(String[] args) {
    				
    		FileInputStream fi = null;
    		
    		// 파일 열기 (try-catch-fianlly)
    		// 원문 : Hello World..!!
    		try {
    			
    			fi = new FileInputStream("input.txt");
    			fi.skip(6); // 6byte 파일 포인터 이동
    			System.out.println((char)fi.read()); // 'W'
    		
    		// 예외처리
    		} catch (Exception e) {
    
    			System.out.println("실패.");
    		
    		// 파일 닫기 처리 (try-catch-finally문 사용 시)
    		} finally {
    			
    			try {			
    				fi.close();
    				
    			} catch (Exception ex) {				
    				System.out.println("파일을 닫을 수 없습니다.");
    				
    			}
    		}
    	}

    댓글

Designed by Tistory.