본문 바로가기
멀티캠퍼스/Spring

20230817 (목)

by 세크레투스 2023. 8. 17.
반응형
SMALL

<<금일 교육 내용>>

- 파일 IO

 

<<복습>>

- Set : 중복X

- Map : Hash -> DB를 사용하면 Map을 사용할 일은 줄어듬.

- Key(set), Value(list)

 

우리 프로그램 - xx.read -> OS에게 read요청 -> 장치, 장치 Controller(실제 I/O 진행) -> Buffer -> 응답

 

모든 I/O는 운영체제를 File에 대한 I/O로 표준화 해놨다.

최상위 추상 클래스에 맞춰서 프로그래밍을 하면 됨.

Binary 데이터인지, 문자 데이터인지를 구분해야 함.

 

- 문자 데이터 : .txt, .csv, .ini, .properties (단, 문자셋이 일치해야 함.)

- Binary 데이터 : .mp3, .class, .jpg, .doc, .hwp

 

- Binary 데이터의 최상위 : InputStream, OutputStream

- 문자 데이터의 최상위 : Reader, Writer

 

기본 데이터 타입은

- Binary : byte

- 문자 : char

 

- 입력 : read() -> -1이 리턴되면 더이상 입력할 것이 없다는 뜻. 실패했다는 뜻은 아니지만, 실패할 수도 있다.

- 출력 : write() -> void가 리턴되면 더이상 출력할 것이 없다는 뜻. 실패했다는 뜻은 아니지만, 실패할 수도 있다.

==> 따라서 예외처리가 필수이다.

 

<파일 클래스 - 중요: 오직 파일에서만 쓰임.. 파일 I/O할 때>

- 파일 시스템의 파일을 표현하는 클래스

- 파일 객체 생성

File = new File("C:\\Temp\\file.txt");

File = new File("C:/Temp/file.txt");

- 파일 또는 디렉토리 존재 유무 확인 메소드

boolean isExist = file.exists();

 

- 새로운 파일 생성 : createNewFile()

- 새로운 디렉토리 생성 : mkdir()

- 경로상에 없는 모든 디렉토리를 생성 : mkdirs()

- 파일 또는 디렉토리 삭제 : delete()

====> 리턴타입은 모두 boolean

 

파일 정보 추출 메서드

- 권한 검사 : canExecute(), canRead(), canWrite() - 리턴타입은 boolean

- 파일의 이름을 리턴 : getName() - 리턴타입 String

- 부모 디렉토리를 리턴 : getParent() - 리턴타입 String

- 부모 디렉토리를 File 객체로 생성 후 리턴 : getParentFile()

- 전체 경로를 리턴 : getPath()

- 디렉토리 여부 : isDirectory()

- 파일 여부 : isFile()

- 마지막 수정 날짜 및 시간을 리턴 : lastModified()

- 파일의 크기 리턴 : length()

 

디렉토리 파일 목록 추출 메서드

- 파일의 이름 리턴 : list() - 리턴타입은 String[]

- 파일의 객체 자체 리턴 : listFiles() - 리턴타입은 File[]

- 원하는 조건의 파일명만 추출(필터링) : FilenameFilter filter -> 이것을 매개변수로 넣어주면 됨.

 

- 파일 대소문자 구분 : OS마다 다름 (윈도우는 구분 안하고, 리눅스와 맥은 구분함)

 

- Java는 그렇다면 어떨까?

URI로 불러오기

--> 윈도우에서는 대소문자 구분 안하는데, 맥에서는 함..

----> 자바에서는 원래 대소문자 구분을 한다고 함.

 

<파일 입출력>

1. FileInputStream

- 파일로부터 바이트 단위로 읽어 들일 때 사용

* 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일을 읽을 수 있음

- 객체 생성 방법

* FileInputStream 객체가 생성될 때 파일과 직접 연결

* 만약 파일이 존재하지 않으면 FileNotFoundException 발생

* try-catch문으로 예외 처리

 

// 첫 번째 방법

FileInputStream fis = new FileInputStream("C:/Temp/image.gif"); <- 파일 경로 제시

생성자 호출 시 예외 가능

 

// 두 번째 방법

File file = new File("C:/Temp/image.gif");

FileInputStream fis = new FileInputStream(file);

 

- InputStream 하위 클래스 : 사용 방법이 InputStream과 동일

노란 항목 : 예외 발생 가능 구간

 

<자동 리소스 닫기>

1. try-with-resources

- 예외 발생 여부와 상관 없음

- 사용했던 리소스 객체의 close() 메소드 호출해 리소스 닫음

- 리소스 객체

* 각종 입출력스트림, 서버소켓, 소켓, 각종 채널

* java.lang.AutoCloseable인터페이스 구현하고 있어야 함

* try() 안에 객체 선언문/할당문 만 올 수 있고, 나머지는 올 수 없다.

 

2. FileInputStream

 

3. FileOutputStream

- 파일에 바이트 단위로 데이터를 저장할 때 사용

* 그림, 오디오, 비디오, 텍스트 등 모든 종류의 데이터를 파일로 저장

- 객체 생성 방법

* 파일이 이미 존재할 경우, 데이터를 출력하게 되면 파일을 덮어쓰는 단점

//첫번째 방법

FileOutputStream fis = new FileOutputStream("C:/Temp/image.gif"); //파일이 없는 경우 : 새로 생성, 있는 경우 : 기존 데이터 버려짐

//두번째 방법

File file = new File("C:/Temp/image.gif");

FileOutputStream fis = new FileOutputStream(file);

 

- 기존 파일 내용 끝에 데이터를 추가할 경우(append 모드)

FileOutputStream fis = new FileOutputStream("C:/Temp/data.txt", true);

FileOutputStream fis = new FileOutputStream(file, true); // true : 파일의 맨 끝을 가리키게 됨. append 모드

//false : 기존의 데이터가 버려짐

 

fos.flush(); // 생략 불가능

fos.close(); // 생략 가능

fis.close(); // 생략 가능

 

4. FileReader(문자단위)

- 텍스트 파일로부터 데이터를 읽어 들일 때 사용

* 문자 단위로 읽음

* 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽을 수 없음

- Reader 하위 클래스 - 

- 바이너리로 접근하는 모든 파일은 변경 가능하다.

- 하지만 Reader나 Writer로는 바이너리 파일을 변경 불가능하다.

 

<보조스트림>

1. 보조스트림 (디폴트 생성자 없음, 기존 스트림을 전달 받아서 생성한다.)

- 다른 스트림과 연결되어 여러가지 편리한 기능을 제공해주는 스트림

* 문자 변환, 입출력 성능 향상, 기본 데이터 타입 입출력, 객체 입출력 등의 기능을 제공

- 보조 스트림 생성

보조스트림 변수 = new 보조스트림(연결스트림) //연결스트림 = 기존스트림

- 보조 스트림 체인 - 다른 보조 스트림과 연결되어 역할 수행

InputStream is = System.in;

InputStreamReader reader = new InputStreamReader(is); // <= InputStream : Byte단위, Reader : 문자 단위

InputStream is = System.in;

InputStreamReader reader = new InputStreamReader(is);

BufferedStreamReader br = new BufferedStreamReader(reader);

 

InputStream <-> Reader

OutputStream <-> Writer

 

2. 문자 변환 보조 스트림

- 문자도 변환 가능

- InputStreamReader

* 바이트 단위를 문자단위로 변경

Reader reader = new InputStreamReader(바이트입력스트림);

InputStream is = System.in;

Reader reader = new InputStreamReader(is);

FileInputStream fis = new FileInputStream("C:/temp/file.txt");

Reader reader = new InputStreamReader(fis);

 

3. 문자 변환 보조 스트림

- OutputStreamWriter

☆ Stream -> Reader/Writer : 네트워크 프로그래밍 할 때 자주 나옴.

 

4. 성능 향상 보조 스트림

- 입출력 성능에 영향을 미치는 입출력 소스

* 하드디스크

* 느린 네트워크

- 버퍼를 이용한 해결

* 입출력 소스와 직접 작업하지 않고 버퍼와 작업 - 실행 성능 향상

 

인풋스트림 종류,

아웃풋스트림 종류

두가지 다 외우자.

 

문자 스트림에서

Reader 종류 - 그 중 BufferdReader와 InputStreamReader는 보조

Writer 종류 - FileWriter를 제외한 나머지 3개는 보조

 

보조스트림은 조금 천천히 봐도 되고,

우선 실체(구현) 클래스를 먼저 익히는게 좋을 것 같다.

 

하지만 어쨌거나,실제로 자주 쓰이는 것은 바로

앞에 Buffered 가 붙은 스트림 종류이다.

 

5. 기본 타입 입출력 보조 스트림

- 입출력 순서를 맞추어 사용

DataInputStream dis = new DataInputStream(바이트입력스트림);

DataOutputStream dos = new DataOutputStream(바이트출력스트림);

DataOutputStream dos = new DataOutputStream(fos);

6. 객체 입출력 보조 스트림

- 직렬화가 가능한 클래스(Serializable)

* 자바에서는 Serializable 인터페이스를 구현한 클래스만 직렬화 할 수 있도록 제한, transient 필드는 제외

* 객체 직렬화할때 private 필드 포함한 모든 필드를 바이트로 변환 가능

* implements Serializable 을 붙여줘야 함

 

* serialize 해야 할 것 : 저장해야 할 리스트

* 처음 확인해봐야 할 것 : ArrayList가 직렬화 되어있는가? : JDK에 포함되어 있는 객체들은 직렬화가 다 구현되어 있다.

--> 그러므로 직렬화가 되어있음. (ArrayList는 JDK에서 제공하는 객체임)

 

- JDK 에서 제공하는 클래스들은 다 Serializable 하다.

 

- load : 프로그램 실행 시

- save : 프로그램 종료 시

 

그냥 힘들어..내일 점심에 우체국 다녀오자 꼭!!! 안그러면 강의 놓친다..ㅠㅠ 흑흑....

 

MapDao는 시간날때 꼭 해보자.

 

Serializable은 다른 언어와 호환성이 없다.

모든 언어에는 Serialize 매카니즘이 있으며, 마찬가지로 다른언어와의 호환성 역시 없다.

 

호환성을 가지려면 데이터를 갖는 포맷이 표준화가 되어있어야 한다.

그리고 이 표준화를 각 언어에서 지원하면 호환성을 갖게 됨.

 

그래서 그런 용도로 많이 쓰는 포맷이 바로 JSON이다.

JSON을 사용하면 언어에 상관없이 호환성을 갖게 된다.

현재 대부분의 언어들이 JSON을 지원한다.

 

스레드, 네트워크, 데이터베이스 연동을 안다룬 주제..

이걸 다루려면 그쪽에 대한 지식이 있어야 한다.

 

기분이 오늘 금요일갖다.. 미투..^_^

 

내일부터는 디비 공부 시작~~~ 흐하하하하하

 

나 오늘것도 다 이해 못했는디...

흑...ㅠㅠ

 

내일 쓰게 될 DataBase : Oracle(문법 - 시장에서 No.1, SQL / 맥에서는 지원을 안해서 가상환경 - 도커 에 설치할 것임 ), MySQL(웹서버 - 주력, SQL)

나중에 프로젝트 할 때 클라우드 계정을 줌.

그 클라우드에서는 오라클 설치가 힘들기 때문에.

나중에 MongoDB(NoSQL)를 배울 것임.

 

둘다 같은 류라서 사용법이 거의 비슷함.

하나 알면 다른거 거의 자연스럽게 익힘.

반응형
LIST

'멀티캠퍼스 > Spring' 카테고리의 다른 글

20230829 (화)  (0) 2023.08.29
230828 (월)  (0) 2023.08.29
20230816 (수)  (0) 2023.08.16
20230811 (금)  (0) 2023.08.12
20230810 (목)  (0) 2023.08.10