[ FileInputstream ]
- java.io의 가장 기본 파일 입출력 클래스
- 입력 스트림(통로)을 생성해줌
- 사용법은 간단하지만, 버퍼를 사용하지 않기 때문에 느림
- 속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 쓰는 경우가 많음
외부 리소스 입출력에 대한 개념과 설명은 아래 링크글을 참조하시면 됩니다.
2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_io / nio / nio2 [1/3]
2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_java.io [2/3]
2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_java.nio [3/3]
[ 생성자 ]
- 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' 클래스에 구현되어 있습니다.
package study.first;
import java.io.FileInputStream;
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[] 배열의 참조변수 주소로 바로 넣어줄 수도 있고, 아래 코드와 같이 바로 출력도 가능
package study.first;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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 타입 배열 반환
package study.first;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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() ]
- 현재 파일 포인터 위치에서 읽을 수 있는 바이트 수 반환
package study.first;
import java.io.FileInputStream;
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("실패.");
}
}
}
[ void close() ]
- 현재 열려 있는 파일을 닫음
- try-with-resource문 사용 시 자동으로 자원 해제가 되므로 불필요
- try-catch-finally문 사용 시 사용해줘야 메모리 누수를 방지하고 다른 곳에서 리소스 사용이 가능함
- finally문 내에서도 역시 예외처리를 해줘야 함
package study.first;
import java.io.FileInputStream;
public class Main {
public static void main(String[] args) {
FileInputStream fi = null;
// 파일 열기
try {
fi = new FileInputStream("input.txt");
// 예외처리
} catch (Exception e) {
System.out.println("실패.");
// 파일 닫기 처리 (try-catch-finally문 사용 시)
} finally {
try {
fi.close();
} catch (Exception ex) {
System.out.println("파일을 닫을 수 없습니다.");
}
}
}
}
[ long skip(long numbytes) ]
- 매개변수로 받은 바이트 수만큼 파일 포인터를 이동시킴
- 기본 스트림에서는 파일 포인터가 반대로 돌아오지는 못함
package study.first;
import java.io.FileInputStream;
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("파일을 닫을 수 없습니다.");
}
}
}
}
728x90
반응형
'Back-end > JAVA & Spring' 카테고리의 다른 글
[Java] 파일 입출력 FileOutputStream [북붙따라하기] (0) | 2021.05.28 |
---|---|
[Java] 파일 입출력 FileInputStream (0) | 2021.05.28 |
[Java] File.separator로 OS 상관없이 파일 경로 구분하기 (0) | 2021.05.26 |
Quartz Job Scheduler란? (0) | 2021.05.24 |
Spring + Quartz 주기적으로 작업 실행하기 (0) | 2021.05.24 |
댓글