랩터
[Java] 파일 입출력 본문
파일 입출력을 정리해보겠습니다.
학습 목표
- 바이트 기반 스트림의 간단한 입출력 코드를 이해하고 활용합니다.
- 문자 기반 스트림의 간단한 입출력 코드를 이해하고 활용합니다.
- 파일 클래스를 이해하고 활용합니다.
InputStream, OutputStream
자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공합니다.
가장 많이사용되는 FileInputStream과 FileOutputStream을 살펴보겠습니다.
FileInputStream
터미널에 echo code >> java.txt를 입력하면, code라는 문자열이 입력된 java.txt라는 파일을 생성합니다.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class FileInputStreamExample {
public static void main(String[] args) {
try{
FileInputStream fileInput = new FileInputStream("java.txt");
BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
int i = 0;
while((i = fileInput.read()) != -1){//fileInput.read()의 리턴값을 i에 저장한후,값이 -1인지 확인
System.out.print((char) i);
}
fileInput.close();
}
catch (Exception e){
System.out.println(e);
}
}
}
이 디렉토리에다가 위에 cmd명령어를 입력하면 출력값이 code가 나오게 됩니다.
BufferedInputStream이라는 보조 스트림을 사용하면 성능이 향상되기 때문에, 대부분은 이를 사용합니다.
버퍼란 바이트 배열로서, 여러 바이트를 저장하여 한 번에 많은 양의 데이터를 입출력할 수 있도록 도와주는 임시 저장 공간이라고 이해하면 됩니다.
FileOutputStream
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileInputStreamExample {
public static void main(String[] args) {
try{
FileOutputStream fileOutput = new FileOutputStream("java.txt");
String word = "ja";
byte b[] = word.getBytes();
fileOutput.write(b);
fileOutput.close();
}
catch (Exception e){
System.out.println(e);
}
}
}
위 코드를 실행하면, 같은 디렉토리 내에 ja라는 문자열이 입력된 java.txt 파일이 생성됨을 확인할 수 있습니다.
FileReader / FileWriter
앞서 살펴본 File 입출력 스트림은, 바이트 기반 스트림입니다. 바이트 기반은 입출력 단위가 1byte라는 뜻입니다. 하지만 Java에서 char 타입은 2byte(자바 기본 유닛 참고)입니다. 이를 해소하기 위해 자바에서는 문자 기반 스트림을 제공합니다. 문자 기반 스트림에는 FileReader와 FileWriter가 있습니다.
문자 기반 스트림에서는 일반적으로, 바이트 기반 스트림의 InputStream이 Reader로, OutputStream이 Writer로 대응됩니다. FileInputStream이 문자 기반에서는 FileReader에, FileOutputStream은 FileWriter에 해당하는 식입니다.
FileReader
import java.io.*;
public class FileInputStreamExample {
public static void main(String[] args) {
try{
String fileName = "java.txt";
FileReader file = new FileReader(fileName);
BufferedReader buffered = new BufferedReader(file);
int data = 0;
while((data=file.read()) != -1){
System.out.println((char) data);
}
file.close();
}
catch (IOException e){
e.printStackTrace();
}
}
}
FileWriter
java.txt 파일에 "written!"이라는 문자열을 입력하는 예제입니다.
import java.io.*;
public class FileInputStreamExample {
public static void main(String[] args) {
try{
String fileName = "java.txt";
FileWriter writer = new FileWriter(fileName);
BufferedWriter bufferedWriter = new BufferedWriter(writer);
String str = "written!";
writer.write(str);
writer.close();
}
catch (IOException e){
e.printStackTrace();
}
}
}
File
앞서 파일을 읽고 쓰는 방법을 간단하게 살펴보았습니다. 이번에는 File 클래스를 알아보겠습니다.
자바에서는 File 클래스로 파일과 디렉토리에 접근할 수 있습니다.
import java.io.File;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) throws IOException {
File file = new File("../spring.txt");
System.out.println(file.getPath());
System.out.println(file.getParent());
System.out.println(file.getCanonicalPath());
System.out.println(file.canWrite());
}
}
앞서 만들어놓은 spring.txt 파일이 존재하지 않더라도, 컴파일 에러가 발생하지는 않습니다.
파일 인스턴스를 생성하는 것이 곧 파일을 생성하는 것은 아닙니다. 파일을 생성하기 위해서는 파일 인스턴스를 생성할 때 다음과 같이 첫 번째 인자에 경로를, 두 번째 인자에 파일명을 작성하고, createNewFile() 메서드를 호출해주어야 합니다.
File file = new File("./", "newSpring.txt");
file.createNewFile();
import java.io.File;
public class FileClassExample {
public static void main(String[] args) {
File parentDir = new File("./");
File[] list = parentDir.listFiles();
String prefix = "code";
for (int i =0; i<list.length; i++){
String fileName = list[i].getName();
if (fileName.endsWith("txt") && !fileName.startsWith("code")){
list[i].renameTo(new File(parentDir, prefix + fileName));
}
}
}
}
'공부 > JAVA' 카테고리의 다른 글
[Java] 자바 가상 머신(Java Virtual Machine) (0) | 2024.07.10 |
---|---|
[Java] 스레드 (0) | 2024.07.10 |
[Java] 스트림 - Optional Class (0) | 2024.07.09 |
[Java] 스트림 - 스트림의 최종 연산 (0) | 2024.07.08 |
[Java] 스트림 - 스트림의 중간 연산 (0) | 2024.07.08 |