Java/stream

Java Stream - FileReader vs FileInputStream

S.T.Lee 2022. 11. 13. 11:55

java.io.fileReader - Character 파일을 읽을 수 있는 기능으로 인코딩 방식이 지정 가능하다.

java.io.FileInputStream - 파일로부터 바이트를 입력 받아 바이트 단위로 출력할 수 있는 클래스이다. 따라서 다양한 타입의 파일을 읽어올 수 있다.

//FileReader vs InputStream
package lec08.fileio04.second.stream.b;

import java.io.FileInputStream;
import java.io.FileReader;

public class FileInputStreamTest {

	public static void main(String[] args) {
		FileInputStream fileInputStream = null;
		FileReader fileReader = null;
		
		try {
			fileInputStream = new FileInputStream("C:\\Users\\~~~.txt");
			while (true) {
				int read = fileInputStream.read();
				if (read == -1) {
					break;
				}
				char readChar = (char) read;
				System.out.print(readChar);
			}
			fileReader = new FileReader("C:\\Users\\~~~.txt");
			while (true) {
				int read = fileReader.read();
				if (read == -1) {
					break;
				}
				char readChar = (char) read;
				System.out.println(readChar);
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (fileInputStream != null) {
					fileInputStream.close();
				}
				if (fileReader != null) {
					fileReader.close();
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

둘의 차이로는 FileInputStream은 InputStream을 상속 받아 구현되어 바이트 단위로 처리하고, FileReader는 (Reader를 상속 받는) InputStreamReader를 상속 받아 구현되기에 문자 단위로 처리된다.

//FileInputStream에 대한 Java 내부 파일
public class FileInputStream extends InputStream
{
    private static final int DEFAULT_BUFFER_SIZE = 8192;
    private final String path;
    private volatile FileChannel channel;
    private final Object closeLock = new Object();
    private volatile boolean closed;

    public FileInputStream(String name) throws FileNotFoundException {
        this(name != null ? new File(name) : null);
    }
public class FileReader extends InputStreamReader {

    public FileReader(String fileName) throws FileNotFoundException {
        super(new FileInputStream(fileName));
    }
    
 public class InputStreamReader extends Reader {

    private final StreamDecoder sd;

    /**
     * Creates an InputStreamReader that uses the
     * {@link Charset#defaultCharset() default charset}.
     *
     * @param  in   An InputStream
     *
     * @see Charset#defaultCharset()
     */