자바
[JAVA] 파일 입출력(I/O)
ChaeHing
2023. 3. 9. 15:37
InputStream, OutputStream
- 자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공한다.
- 스트림은 단방향으로만 데이터를 전송할 수 있기에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요합니다.
FileInputStream
- 파일을 바이트 스트림으로 읽는다.
// test.txt -> hi my name is ChaeHing
import java.io.FileInputStream;
public class FileIo {
public static void main(String[] args) {
try{
//FileInputStream fileInput = new FileInputStream("test.txt"); // 파일스트림 생성, 상대경로.. 왜인지 안된다.
FileInputStream fileInput = new FileInputStream("src/FileIo/test.txt");
// 파일스트림 생성, 읽어올 파일 절대경로 입력
int i = 0;
while((i = fileInput.read()) != -1){ // fileInput.read()의 리턴값을 i에 저장, 값이 -1 인지 확인
// 파일끝에 도달하면 -1을 리턴함
System.out.print((char)i); // 파일 내용 출력
}
fileInput.close(); // 파일 스트림 닫기
}
catch (Exception e){
System.out.println(e);
//파일이 없다면, java.io.FileNotFoundException: test.txt (지정된 파일을 찾을 수 없습니다)
}
}
}
/*
hi my name is ChaeHing
*/
BufferedInputStream
- 보조 스트림으로 바이트가 아닌 버퍼로 읽기때문에 성능이 더 향상된다.
- 버퍼란, 바이트 배열로 여러 바이트를 저장하여 한 번에 많은 양에 데이터를 입출력해주는 임시 저장 공간
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class FileIo {
public static void main(String[] args) {
try{
//FileInputStream fileInput = new FileInputStream("test.txt"); // 파일스트림 생성, 상대경로.. 왜인지 안된다.
FileInputStream fileInput = new FileInputStream("src/FileIo/test.txt");
// 파일스트림 생성, 읽어올 파일 절대경로 입력
BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
// 파일스트림을 버퍼스트림으로
int i = 0;
//while((i = fileInput.read()) != -1){ // fileInput.read()의 리턴값을 i에 저장, 값이 -1 인지 확인
while ((i = bufferedInput.read()) != -1) { // 파일스트림과 똑같이 사용
// 파일끝에 도달하면 -1을 리턴함
System.out.print((char)i); // 파일 내용 출력
}
fileInput.close(); // 파일 스트림 닫기
}
catch (Exception e){
System.out.println(e);
// 파일이 없다면, java.io.FileNotFoundException: test.txt (지정된 파일을 찾을 수 없습니다)
}
}
}
/*
hi my name is ChaeHing
*/
FileOutputStream
import java.io.FileOutputStream;
public class FileOutPut {
public static void main(String[] args) {
try{
FileOutputStream fileOutput = new FileOutputStream("src/FileIo/file.txt");
// 생성할 파일 경로 입력, 기존에 파일이있다면 overwrite
String word = "file Create"; // 파일안에 입력할 내용, 문자열
fileOutput.write(word.getBytes()); // 문자열을 바이트 배열로 반환하여 파일에 입력 및 저장
fileOutput.close(); // 파일 스트림 닫기
}catch (Exception e){
System.out.println(e);
}
}
}
/*
src/FileIo/file.txt 경로내 파일이 생성됨
파일 내용file Create
*/
FileReader / FileWriter
- 문자 기반 스트림 - char 2byte
- InputStream, OutputStream는 바이트 기반으로 입출력 단위가 1byte기 때문에 이를 해소 할수 있다
- JAVA에서 문자는 2byte
- 문자 기반 스트림과 그 하위 클래스는 어려 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동으로 처리한다.
- FileReader는 인코딩을 유니코드로 변환하고, FileWriter는 유니코드를 인코딩으로 변환
FileReader
public class FileReaders {
public static void main(String[] args) {
try {
FileReader file = new FileReader("file.txt"); // 스트림 생성
int data = 0;
while((data=file.read()) != -1) { // fileinputstream과 동일
System.out.print((char)data); // 파일내용 출력
}
file.close(); // 스트림 닫기
}
catch (IOException e) { // 예외처리
e.printStackTrace();
}
}
}
BufferedReader
- FileReader도 buffer를 통해 성능 개선 가능
public class FileReaders {
public static void main(String[] args) {
try {
FileReader file = new FileReader("file.txt"); // 스트림 생성
BufferedReader bufferedReader = new BufferedReader(file); // 버퍼 Reader 생성
int data = 0;
while((data=bufferedReader.read()) != -1){
System.out.print((char)data); // 파일내용 출력
}
file.close(); // 스트림 닫기
}
catch (IOException e) { // 예외처리
e.printStackTrace();
}
}
}
FileWriter
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterEx {
public static void main(String[] args) throws IOException {
try {
String fileName = "test.txt";
FileWriter fileWriter = new FileWriter(fileName); // 스트림 생성
String str = "file creat!! gogo"; // 파일 내용
fileWriter.write(str); // 파일 내용 쓰기
fileWriter.close(); // 스트림 닫기
// 이름이 동일한 파일 존재시 overwrite
}catch (IOException e){ // 예외 처리
e.printStackTrace();
}
}
}
File
- 자바에서는 File 클래스로 파일과 디렉토리에 접근 가능
import java.io.File;
import java.io.IOException;
public class FileClass {
public static void main(String[] args) throws IOException {
File file = new File("../testfile.txt");
System.out.println(file.getPath()); // 상대경로 반환
System.out.println(file.getParent()); // 상위 디렉토리 상대경로 반환
System.out.println(file.getCanonicalPath()); // 절대경로 반환
System.out.println(file.canWrite()); // 파일 쓰기가 가능한지 여부 반환 boolean
}
}
/*
..\testfile.txt
..
C:\project\testfile.txt
false
파일이 없기 때문에 canWrite() 메소드 호출시 false 발생
해당 위치에 파일이 없지만 컴파일 에러 발생하지 않음
인스턴스만 생성하면 파일이 생성되지 않음
*/
package FileIo;
import java.io.File;
import java.io.IOException;
public class FileClass {
public static void main(String[] args) throws IOException {
//File file = new File("../testfile.txt");
File file = new File("src/FileIo", "testfile.txt"); // 인스턴스생성
// 첫번째 인자 경로, 두번쨰 인자 파일이름
file.createNewFile(); // 해당 메소드를 호출해야 파일이 생성됨
System.out.println(file.getPath()); // 상대경로 반환
System.out.println(file.getParent()); // 상위디렉토리 상대경로 반환
System.out.println(file.getCanonicalPath()); // 절대경로 반환
System.out.println(file.canWrite()); // 파일 쓰기가 가능한지 여부 반환 boolean
}
}
*/
src\FileIo\testfile.txt
src\FileIo
C:\project\practice\src\FileIo\testfile.txt
true
*/