막연하게만 사용하던 I/O를 조금 더 이해해보고자 작성한 글입니다.
기본적으로 I/O는 O/S 레벨에서 이루어지고 byte를 다룬다는 것을 생각야해합니다.
앞에서 다루었던 System클래스 속의 stream들은 콘솔을 기반으로 I/O를 수행했다면,
이번에 다루는 FileStream들은 파일을 기반으로 I/O를 수행한다.
FileOutputStream 클래스에 전달된 경로에 파일이 없는 경우, 파일이 생성되고, 있는 경우는 해당 경로의 파일을 이용한다.
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt");
String text = "It is the first sentence!!";
fileOutputStream.write(text.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
}
FileOutputStream 클래스의 2번째 인자는 해당 파일을 덮어쓸 것인지, 추가할 것인지 결정하는 인자를 전달하게 되어있다. default로 덮어쓰는 옵션이 설정되어 있다.
'\n'을 추가해서 문자의 줄을 변경할 수 있다.
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt", true);
String text = System.lineSeparator() + "It is the first sentence!!";
fileOutputStream.write(text.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
}
read()로 스트림을 읽은 후에 바로 시스템의 output 스트림에 적는 방법을 사용할 수 있다.
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt");
String text ="It is the first sentence!!";
fileOutputStream.write(text.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
FileInputStream fileInputStream = new FileInputStream("./src/board.txt");
while(fileInputStream.available() > 0) {
int data = fileInputStream.read();
System.out.write(data);
}
System.out.flush();
}
새로운 FileOutputStream을 생성해서, 카피도 가능하다.
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("./src/board.txt");
String text ="It is the first sentence!!";
fileOutputStream.write(text.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
FileInputStream fileInputStream = new FileInputStream("./src/board.txt");
FileOutputStream copyOutputStream = new FileOutputStream("./src/copy.txt");
while(fileInputStream.available() > 0) {
int data = fileInputStream.read();
copyOutputStream.write(data);
}
copyOutputStream.flush();
copyOutputStream.close();
}
FileInputStream의 read함수는 읽어올 데이터가 있는 경우 int로 캐스팅된 1byte를 반환하고, 읽어올 데이터가 없는 경우 int -1을 반환한다.
-1을 8bit 2진수로 표현할 경우, 11111111인데, 실제로 read하는 데이터가 11111111이라면 둘을 구분할 수 있는 방법이 없다.
JVM은 32bit를 기준으로 연산을 할 때 가장빠르게 설계가 되어있기 때문에, int를 사용한다면 기존의 byte를 데이터 손실 없이 사용할 수 있고 연산도 더 빠르게 할 수 있다.