


: 데이터 크기가 바이트 단위 / 1바이트씩 읽어오는 스트림
abstract int read()int read(byte[] b)int read(byte[] b, int off, int len)abstract int read(), int read(byte[] b), int read(byte[] b) : 스트림의 끝에 도달하면 -1을 반환

자바문서_InputStream
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/InputStream.html
int read()int read(byte[] b)int available()
참고)자바문서_FileInputStream
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/FileInputStream.html
참고)
Unsigned : 양의 정수
Unsigned Byte : 0 ~ 255
입력 스크림의 끝에 도달한 경우 반환값이 -1 / 바이트 범위에서 부족 -> 더 큰 자료형
int read()
예시) FileInputStream_read()
package exam02;
import java.io.FileInputStream;
import java.io.IOException;
public class Ex01 {
public static void main(String[] args) {
try(FileInputStream fis = new FileInputStream("test1.txt")){
int ch = fis.read(); // 1바이트 -> A 아스키코드 : 65
System.out.println((char)ch);
ch = fis.read(); // 1바이트
System.out.println((char)ch);
ch = fis.read(); // 1바이트
System.out.println((char)ch);
ch = fis.read(); // 1바이트
System.out.println((char)ch);
ch = fis.read(); // 1바이트
System.out.println((char)ch);
ch = fis.read(); // -1 : 파일을 전부 다 읽음
System.out.println(ch);
System.out.println((char)ch);
}catch(IOException e){
e.printStackTrace();
};
}
}

ㄴ 파일 포인터 : 현재 파일 위치 -> read()할때 마다 1바이트씩 움직임
ㄴ 알파벳 한개 = 1바이트
ㄴ read() : 1바이트 씩 읽는 메서드
예시2-1) FileInputStream_int read()

예시2-2) FileInputStream_int read(byte[] b)


예시2-2-1) FileInputStream_int read(byte[] b)

ㄴ data : 실제 데이터가 저장된 곳
ㄴ num : 실제로 읽은 바이트 수 ex) 1024, 1024, 1024 ...
예시) FileInputStream_available()

예시) 버퍼
한글자씩 읽어오는거 비효율적이지 않닝
한꺼번에 가져오자


ㄴ 효율성을 위해 기존꺼를 지우지 않아 반복됨
ㄴ 예시2-2) FileInputStream_int read(byte[] b) 참조하기
↓

ㄴ 근데 이렇게 많이 안쓴다
-> BufferedInputStream 요거를 많이 씀
참고)
InputStream System.in : 표준 입력(1바이트 단위)
class BufferedInputStream extends InputStream {
private InputStream in;
public BufferedInputStream(InputStream in) {
this.in = in;
}
// read 메서드의 기능은 추가적인 기능과 함께 다른 스트림의 기능을 대신 수행
public int read() {
// 버퍼 기능에 대한 코드 ... // 추가 기능
int byte = in.read(); // 다른 스트림의 읽기 기능을 대신 수행
// 버퍼 기능에 대한 코드 ... // 추가 기능
return byte;
}
}
OutputStream : 추상 클래스 , 가장 상위 클래스
-> 추상메서드 : void write(int...)

write() : 버퍼에 바이트를 저장 = 파일에 데이터를 작성 ≠ 파일에 저장❌
void write(int b) : 1바이트를 출력
-> int = 4byte 에서 끝에 1byte만 출력한다
int = 4byte
byte : -128 ~ 127

ex) void write(int b) : 1바이트를 출력
OuteputStream os = new FileOutputStream("파일경로")
byte a = 200;
os.write(a);
// 200은 1byte의 범위를 넘어가기 때문에 온전한 200이 출력되지 않는다
// int =

flush() : 버퍼를 비우면서 데이터를 파일에 찐 저장⭕
close() : file을 열었으면 무조건 닫아야함
참고) 자바문서_OutputStream
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/OutputStream.html
Class FileOutputStream
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/FileOutputStream.html
예시1) FileOutputStream_ write(int b)_autoClosable❌

ㄴ C드라이브에 Temp라는 파일안에 있는 test1.db파일에 데이터를 저장하겠다
ㄴ test1.db파일이 없으면 생성 / 단, 최소한 C드라이브에 Temp라는 파일은 있어야 함

ㄴ FileNotFiundException 예외처리하라고 오류 뜸
-> try catch로 예외처리 할거임

ㄴ os.write(a); : test1.db 파일에 바이트 타입 a 데이터를 저장하겠다
-> IOException 예외 발생
-> 예외처리 try-catch로 해줄 거임
예외처리방법 1) ⭕
예외처리방법 2) ❌
-> 에러 뜸
ㄴ FileNotFiundException이 IOException을 상속받고 있기 때문에 에러 뜸
예외처리방법3) ⭕

ㄴ flush() : 버퍼를 비우면서 데이터를 찐 저장
-> write()만 하면 파일에 데이터가 찐 저장 되지 않음
ㄴ close() : file을 열었으면 무조건 닫아야함
-> close() 하지 않으면 불완전한 파일임
-> close() 메서드가 실행되면 close()가 버퍼에있는 데이터를 다 flush()하고 file을 닫음
ㄴ close()에 finally로 감싼이유
-> file은 열었으면 부조건 close()해줘야 하는데 만약 예외가 발생하면 강제로 catch()구문으로 가버리니까 close()가 실행되지 않을 수 도 있음
-> 그래서 무조건 실행될 수 있도록 finally로 감쌈
ㄴ 근데 위 예시를 보면 os.close()에서 에러 발생함
-> 자바는 블록단위 변수
-> 현재 코드에서 os변수는 try{}안에서만 유효
-> 그럼 어떻게?
-> 밖으로 빼주자 = 블록 범위를 넓혀주자

ㄴ os변수를 밖으로 빼 줌
ㄴ os.close() 에서 예외처리하라고 에러 뜸

ㄴ os.close() 에서 예외처리함

ㄴ 10이라는 1byte가 저장되어 있는 모습
예시1-1) FileOutputStream_ write(int b)_autoClosable⭕

ㄴ try-with-resources 블록에 FileOutputStream을 넣어 자동으로 닫히도록 함
ㄴ 이렇게 하면 자동으로 autoClosable이 구현되어서 안보이지만 close()가 자동으로 실행
ㄴ 예외가 발생하든 안하든 autoClosable이 close() 실행함
예시2) FileOutputStream_void write(byte[] b)

예시3) FileOutputStream_void write(byte[] b, int off, int len)

예시4) FileOutputStream


참고) 자바문서_Reader
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/Reader.html
입력스트림 + 추가 기능
생성자 매개변수 : Reader
-> 기반스트림인지 보조스트림인지 구분하는 법
FilterReader
InputStreamReader : 바이트 단위 스트림 -> 문자 단위 스트림으로 변환 기능
: Reader로 사용이 불가한 InputStream인 경우 변환
: 생성자 매개변수 String charSetName, Charset cs : 변환하려고 하는 문자표(유니코드...)
2바이트 유니코드 : ISO8859_1 / EUC-KR, CPC949
3바이트 유니코드 : UTF-8
참고)
PrintWriter : 문자 단위 출력 스트림 + 버퍼(8kb)
print(..), printf(..), println(..)
예시)

ㄴ 글자색이 빨간색으로 출력
예시) setErr(PrintStream err)


D:\경로명\파일명.확장자 -> \/ 로 파일구분문자 써도 ㅇㅋ/home/project/파일명 -> /;(세미콜론):(콜론)참고) 자바문서_java.io.File
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/File.html
예시)

예시) 빈 파일 만들기

예시) 디렉토리 생성


예시) 디렉토리가 없는 경우 디렉토리 생성

예시) 하위폴더들 생성

예시) 판별

ㄴ 디렉토리인지안닌지
ㄴ 파일인지아닌지
참고) is : ~인지아닌지
예시) 임시파일 생성

예시) 임시파일 삭제

ㄴ 5초 뒤 삭제
예시) 파일경로

ㄴ String getAbsolutePath(); : 파일 전체 경로
ㄴ String getCanonicalPath(); : 정규화된 파일 경로(상대경로 -> 전체경로변경)
예시) getName(), getPath()
