-
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("파일을 닫을 수 없습니다."); } } }