자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공한다. 스트림은 단방향으로만 데이터를 전송할 수 있기에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요하다.
가장 빈번하게 사용되는 FileInputStream과 FileOutputStream을 알아보자.
ublic class FileInputStreamExample {
public static void main(String args[])
{
try {
FileInputStream fileInput = new FileInputStream("codestates.txt");
BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
int i = 0;
while ((i = bufferedInput.read()) != -1) {
System.out.print((char)i);
}
fileInput.close();
}
catch (Exception e) {
System.out.println(e);
}
}
}
BufferedInputStream이라는 보조 스트림을 사용하면 성능이 향상되기 때문에, 대부분의 경우 이를 사용한다. 버퍼란 바이트 배열로서, 여러 바이트를 저장하여 한 번에 많은 양의 데이터를 입출력할 수 있도록 도와주는 임시 저장 공간이라고 이해하면 된다.
import java.io.FileOutputStream;
public class FileOutputStreamExample {
public static void main(String args[]) {
try {
FileOutputStream fileOutput = new FileOutputStream("codestates.txt");
String word = "code";
byte b[] = word.getBytes();
fileOutput.write(b);
fileOutput.close();
}
catch (Exception e) {
System.out.println(e);
}
}
}
🔻FileReader
자바에서는 문자 기반 스트림을 제공한다. 문자 기반 스트림에는 FileReader와 FileWriter가 있다. 문자 기반 스트림은 문자 데이터를 다룰 때 사용한다.
FileReader는 인코딩을 유니코드로 변환하고, FileWriter는 유니코드를 인코딩으로 변환한다.
public class FileReaderEx {
public static void main(String[] args) {
try{
String fileName = "codestates.txt";
FileReader file = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(file);
int data = 0;
while ((data=bufferedReader.read()) !=-1){
System.out.println((char)data);
}
file.close();
}
catch (IOException e){
e.printStackTrace();
}
}
}
🔻FileWriter
public class FileWriterExample {
public static void main(String[] args) {
try{
String fileName = "codestates.txt";
FileWriter writer = new FileWriter(fileName);
String str = "written!";
writer.write(str);
writer.close();;
}
catch (Exception e){
System.out.println(e);
}
}
}
자바에서는 File 클래스로 파일과 디렉토리에 접근할 수 있다.
public class FileEx {
public static void main(String[] args) {
File file = new File("../codestates.txt");
System.out.println(file.getPath()); // 경로명을 문자열로 변환
System.out.println(file.getParent()); // 부모의 경로명 문자열을 반환
System.out.println(file.getCanonicalPath()); // 표준 경로명 문자열을 반환
System.out.println(file.canWrite()); // 추상 경로 이름으로 표시된 파일을 수정할 수 있는지 여부 확인 boolean
}
}
파일 인스턴스를 생성하는게 파일을 생성하는 것은 아니다.
1) 첫번 째 인자에 경로를 써준다. './'
2) 파일명을 작성한다. 'newCodestates.txt'
3) 'createNewFile' 메서드를 호출한다.
File file = new File("./", "newCodestates.txt");
file.createNewFile();