- Byte 단위 입출력
package javaIO.exam;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteExam1 {
public static void main(String[] args){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("javaIO/exam/ByteExam1.java");
fos = new FileOutputStream("byte.txt");
int readData = -1;
while((readData = fis.read())!= -1){
fos.write(readData);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
fis = new FileInputStream("javaIO/exam/ByteExam1.java");
-> 파일로부터 읽어오기 위한 객체 생성과 읽어들일 파일의 경로 설정
fos = new FileOutputStream("byte.txt");
-> 파일에 쓸 수 있게 해주는 객체 생성
read 메소드가 byte를 리턴하면 끝을 나타내는 값을 표현할 수가 없어서 반복문을 종료할 수가 없기 때문에 byte가 아닌 int 값을 리턴한다.
FileInputStream과 FileOutputStream을 이용하여, 1바이트씩 읽어들여 1바이트씩 저장한다.
read()메소드가 리턴하는 타입은 정수인데, 정수 4바이트중 마지막 바이트에 읽어들인 1바이트를 저장한다.
읽어들일 것이 있으면 항상 양수를 리턴하고 읽어들일 것이 없으면 –1을 리턴하여 반복문이 종료된다.
- 512 byte씩 읽어들여 파일에 512byte씩 저장하는 방법
package javaIO.exam;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteExam2 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("javaIO/exam/ByteExam1.java");
fos = new FileOutputStream("byte.txt");
int readCount = -1;
byte[] buffer = new byte[512];
while((readCount = fis.read(buffer))!= -1){
fos.write(buffer,0,readCount);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
}
buffer라는 512byte 크기의 배열을 만들어서 read 메소드에 배열을 넣는다.
0부터 readCount 만큼 쓰도록 한다.
- try-with-resources
close 메소드를 사용하지 않아도 Exception이 발생하지 않았다면, 자동으로 close가 되게 할 수 있는 방법이다.
(AutoCloseable 인터페이스를 구현하는 클래스만 사용 가능)
package javaIO.exam;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class ByteExam3 {
public static void main(String[] args) {
try (DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt"))) {
out.writeInt(100);
out.writeBoolean(true);
out.writeDouble(50.5);
} catch (Exception e) {
e.printStackTrace();
}
}
}
try ( IO 객체 선언 ) {
IO객체 사용
} catch(Exception e) {
e.printStackTrace();
}
이와 같은 형식이다.
- 파일에 저장했던 값을 읽어들이는 방법
package javaIO.exam;
import java.io.DataInputStream;
import java.io.FileInputStream;
public class ByteExam4 {
public static void main(String[] args) {
try(DataInputStream in = new DataInputStream(new FileInputStream("data.txt"))){
int i = in.readInt();
boolean b = in.readBoolean();
double d = in.readDouble();
System.out.println(i);
System.out.println(b);
System.out.println(d);
} catch (Exception e){
e.printStackTrace();
}
}
}
readInt, readBoolean, readDouble 메소드를 이용해서 저장했던 값을 불러왔다.
주의할 점은 파일에 저장된 순서대로 다시 읽어들여야 한다는 점이다.
처음에 int, boolean, double 순서로 저장했기 때문에 읽어들일 때도 같은 순서대로 읽어들여야 한다.
- Char 단위 입출력(Console)
package javaIO.exam;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CharIOExam01 {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
line = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(line);
}
}
BufferedReader는 한 줄씩 입력받기 위한 클래스이다.
BufferedReader 클래스는 InputStream을 입력 받는 생성자가 없다.
System.in은 InputStream 타입이므로 BufferedReader의 생성자에 바로 들어갈 수 없기 때문에 Reader 타입으로 바꿔줄 수 있는 InputStreamReader 객체를 생성해서 넣어준다.
키보드로 입력 받은 문자열을 line에 저장하고 출력한다.
- Char 단위 입출력(File)
package javaIO.exam;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class CharIOExam02 {
public static void main(String[] args) {
BufferedReader br = null;
PrintWriter pw = null;
try {
br = new BufferedReader(new FileReader("javaIO/exam/CharIOExam02.java"));
pw = new PrintWriter(new FileWriter("test.txt"));
String line = null;
while((line = br.readLine()) != null) {
pw.println(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pw.close();
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
br = new BufferedReader(new FileReader("javaIO/exam/CharIOExam02.java"));
해당 경로의 파일을 읽기 위해 FileReader 클래스를 이용하고 한 줄 읽어 들이기 위해서 BufferedReader 클래스를 이용한다.
BufferedReader의 readLine 메소드가 한 줄씩 읽어내고 더 이상 읽어들일 내용이 없으면 null을 리턴한다.
파일에 쓰게하기 위해 FileWriter 클래스를 이용하고 출력하기 위해 PrintWriter 클래스를 이용했다. (이제는 FileWriter 클래스를 이용하지 않고 바로 파일명을 적어도 되는 듯)
읽어들인 내용을 line에 넣고 pw로 출력을 하다가 마지막으로 null이 리턴되면 반복문을 종료한다.
마지막엔 close를 꼭 해줘야 하는데 BufferedReader의 객체는 예외처리를 해줘야 하기 때문에 try catch로 예외처리를 해준다.
'Java > Java의 정석' 카테고리의 다른 글
220301 Java - Chapter 2. 변수 (0) | 2022.03.01 |
---|---|
220228 Java - Thread (0) | 2022.02.28 |
220224 Java - Date, Calendar, time패키지 (0) | 2022.02.24 |
220223 Java - Collection Framework (0) | 2022.02.23 |
220222 Java - 참조, 제네릭+Collections framework (0) | 2022.02.23 |