mjeongriver
article thumbnail
Published 2022. 10. 27. 18:09
day23-java TIL/Java

- 입출력 할 때에는 예외처리 알아둘 것(batch)

- window r-cmd - 메모 파일 드래그 해서 넣으면 경로 나옴

** Java Input/Output
- java.io 패키지에서 담당


1. 기반 지식
1)디렉토리 구분 기호
- Windows: \
- Windows 이외: /
- 직접 지정하면 운영체제 별로 따로 설정 – File.seperator를 이용하면 현재 운영체제의 구분 기호를 사용할 수 있음

2)경로
1>절대 경로: 루트로부터의 위치
Windows → 루트드라이브:\디렉토리경로\파일이름
Web → 프로토콜://자원경로
그 이외의 경우 → /루트디렉토리/디렉토리경로/파일이름
Windows 경우는 디렉토리 기호가 \ 그 이외의 경우는 /

2>상대 경로: 현재 위치로부터의 경로
./: 현재 디렉토리
../: 상위 디렉토리

3)File 처리는 대부분의 경우 예외 처리를 강제 합니다.

 

2. File 클래스
- 파일에 대한 정보를 제공하는 클래스
1) 생성자
File(String 파일 경로)
File(String 부모경로, String 자식경로)
File(File 부모경로, String 자식경로)

2) 주요 메서드
delete
exists
lastModified
length
renameTo

3) 클라이언트 서버 시스템에서의 파일 다운로드
- 파일의 존재 여부를 확인해서 다운로드
- 파일의 변경 여부(마지막 수정 날짜 나 크기)를 확인해서 다운로드

4)실습

 

3. Stream

1) 개요

- 입출력 할 때의 스트림이 있고 람다와 스트림에서 처럼 여러 개의 데이터를 순차적으로 처리하기 위한 스트림이 있습니다.

- 입출력에서의 스트림은 데이터를 운반하는데 사용하는 연결 통로

 

2) 분류

- 입력 스트림과 출력 스트림으로 구분

- 바이트 스트림과 문자 스트림으로 구분

- 일반적인 파일 처리는 바이트 스트림을 사용하고 문자를 읽고 쓰는 경우에만 문자 스트림을 사용합니다.

- 문자 스트림을 사용할 때는 인코딩에 주의해야 합니다.

 

* 인코딩, 디코딩

4. ByteStream

1) InputStream 과 OutputStream

- 바이트 스트림의 최상위 클래스로 추상 클래스(인스턴스 생성 못함)

- 다른 바이트 스트림들이 가져야 하는 메서드의 원형을 소유

- InputStream

int availavle(): 읽을 수 있는 바이트 수를 리턴

void close(): 닫기

int read(): 한 바이트를 읽어서 정수로 리턴하고 읽지 못하면 음수(-1)를 리턴(양수를 리턴하면 읽어낸 것)

int read(byte [] b): b 배열 만큼 읽어서 b에 저장하고 읽은 개수를 리턴 -0이나 음수가 리턴되면 읽기 실패

int read(byte [] b, int offset, int length): offset부터 length만큼 읽어서 b에 저장하고 읽은 개수를 리턴

long skip(long n): n만큼 넘어가기

 

- OutputStream

void close(): 닫기

void write(int n): n을 기록

void write(byte [] b): b 배열을 기록

void write(byte [] b, int offset, int length): b 배열에서 offset에서 length만큼 기록

void flush(): 버퍼의 내용을 출력

 

- 스트림은 열면 반드시 닫아야 합니다.

 

2) 바이트 단위 파일 입출력

- FileInputStream(읽고) 과 FileOutputStream(기록)

- 바이트 단위로 파일에 기록

바이트 단위로 파일에 기록을 하는 클래스: FileOutputStream

3)버퍼를 이용한 입출력
- Java 코드로 입출력하는 작업을 작성하면 실제로는 JVM 이 운영체제의 Native Method를 호출해서 처리합니다.
자주 입출력을 하는 경우 작업을 할 때 마다 Native Method를 호출하면 시스템의 성능이 나빠질 수 있습니다.
이런 경우에는 버퍼를 이용해서 입출력 횟수를 줄이는 것이 좋습니다.
- 버퍼를 이용하는 바이트 단위 입출력은 BufferedInputStream(읽기) 과 PrintStream(쓰기)을 이용합니다.
버퍼에 기록을 할 때는 write 메서드 대신에 print 메서드를 사용할 수 있으면 flush 메서드를 이용해서 버퍼의 내용을 전부 출력할 수 있습니다.
- 표준 출력 스트림이 System.out 인데 이 스트림의 자료형이 PrintStream

 

 

5. Character Stream(문자 스트림)

- Byte Stream을 이용하면 모든 종류의 IO 장치와 데이터를 읽고 쓰기 작업이 가능 - 컴퓨터는 기본적으로 바이트 단위로 작업을 수행하기 때문입니다.

- 문자 단위로 데이터를 입출력하는 경우 Byte Stream을 사용하게 되면 변환 작업이 필요

- data.go.kr-공유 자전거 어플

1) Reader & Writer

- 문자 단위로 읽고 쓰기 위한 메서드를 제공하는 추상 클래스 - 문자 스트림의 최상위 클래스

- Reader 의 메서드

void close()

int read(): 하나의 문자를 읽어오는 메서드로 문자의 코드를 리턴하는데, 읽는데 실패할 경우 음수를 리턴

int read(char [] buf): 문자를 buf의 크기만큼 읽어서 buf에 저장하고 읽은 개수를 리턴 - 리턴 값이 0보다 작거나 같으면 읽기 실패 

int read(char [] buf, int offset, int length): 문자를 offset부터 length만큼 읽어서 buf에 저장하고 읽은 개수를 리턴 - 리턴 값이 0 보다 작거나 같으면 읽기 실패

int read(CharBuffer target)

boolean ready()

long skip(long n)

 

- Writer의 메서드

void close()

void flush()

void write(String str)

void write(String str, int offset, int length)

 

2) InputStreamReader & OutputStreamReader

- byteStream 을 CharacterStream 으로 변환 시켜주는 클래스

- 네트워크 프로그래밍에서 소켓은 ByteStream을 리턴하는데 주고 받는 데이터가 문자열이라면 ByteStream 을 InputStreamReader 인스턴스로 변환해서 사용해야 합니다.

 

new InputStreamReader(ByteStream 인스턴스)

 

3)FileReader/FileWriter

- 파일에 문자 단위로 읽고 쓰기 위한 클래스 

 

4) BufferedReader/PrintWriter

- BufferedReader 는 버퍼를 이용해서 문자 단위로 읽어주는 클래스

이 클래스에는 String readLine() 이라는 메서드가 제공되서 줄 단위로 읽어낼 수 있습니다.

읽어낸 내용이 없으면 null을 리턴합니다.

- PrintWriter는 버퍼를 이용해서 문자 단위로 기록하는 클래스

 

5) 파일에 문자 단위로 기록하고 읽어오기

- 문자열을 분할하는 방법

1 > 특수한 문자를 기준으로 분할

String[] split(String 기준 문자열): 기준 문자열을 기준으로 문자열을 분할해서 문자열 배열로 리턴

String msg = "Hello,java,World";

String [] split = msg.split(",");

system.out.println(splits[0]); //Hello

system.out.println(splits[1]); //java

system.out.println(splits[2]); //World

마지막 데이터 출력은 system.out.println(splits[splits.length -1]); //World (확장자를 보고 등록된 프로그램의 아이콘을 보여주는 것)

 

2 > 위치를 기준으로 분할(substring)

ex) 주민등록번호로 나이 계산 하는 것

String msg = "Hello,Java,World";

String result = msg.subSTring(6); //Java,World

String result1 = msg.subSTring(6, 10); //Java

 

6) 웹의 문자열을 읽어오기

 

 

6. Serializable(직렬화) - 암기

- 인스턴스를 다른 곳에 전송할 수 있도록 해주는 것

- 전송한다는 의미는 파일 단위로 읽고 쓰는 것도 전송으로 간주하고 컴퓨터와 컴퓨터 또는 component와 component 사이를 왔다 갔다 하는 것도 전송한다고 합니다. 이럴 때 사용하는 값의 집합을 나타내기 위한 인스턴스를 DTO(Data Transfer Object)라고 합니다.

- java에서는 인스턴스 단위로 데이터를 전송하고자 하면 serializable 인터페이스를 implements 하면 됩니다. 별도의 메서드 구현이 필요 없습니다.

- 응용 프로그램을 만들 때 자신의 저장 형식을 갖고자 하는 경우 사용하고 안드로이드에서 Activity 사이에 데이터 전송을 하고자 하면 사용합니다.

- DataInputStream 과 DataOutputStream 을 이용해서 사용합니다.

- 데이터를 전송하고 전송 받을 때 데이터는 항상 하나로 만들어두는 것이 좋습니다.

 

- 데이터의 분류

- 하나의 데이터(scala data): Byte, Short, Character, Integer, Long, Float, Double, Boolean, String

- 여러 개의 데이터(vertor data):

배열과 List(Collection) - 동일한 종류의 비교 가능한 데이터(인덱스를 이용해서 데이터를 구분)

VO 클래스나 Map - 여러개의 데이터를 하나로 묶을 때 사용(이름을 이용해서 데이터를 구분)

 

1) 직렬화를 위한 DTO 클래스 생성

- 정수로 된 번호, 문자열로 된 이름, Date 로 만들어진 생일을 저장

 

2) Main 클래스를 만들어서 직렬화한 1개의 인스턴스를 파일에 기록하고 읽어오기

 

 

3) Main 클래스를 만들어서 직렬화한 여러 개의 인스턴스를 파일에 기록하고 읽어오기

7. try - resources

- jdk 1.7에서부터 지원되는 문법

- Stream은 만들면 반드시 close를 해주어야 합니다.

- 하지 않으면 메모리 누수가 발생 합니다.

 

try(여기서 만든 객체가 AutoCloseable 인터페이스를 implements 하고 있다면 close 하지 않아도 try ~ catch 구문을 벗어나면 자동적으로 close를 호출합니다.) {

 

} catch(Exception e) {

 

}

 

- 이전 작성 내용을 수정: try 하고 괄호 열고 넣으면 close 삭제 가능(실행해도 같은 동작) - 괄호 안에 있는 클래스가 Autocloseable 을 implements 하고 있으면 영역이 끝날 때 자동으로 close()를 호출

 

 

* 입사 문제 알려주신 문제 하루에 한시간이라도 시간 내서 풀어볼 것

'TIL > Java' 카테고리의 다른 글

day25-java  (0) 2022.10.31
day24-java  (0) 2022.10.28
day22-java  (0) 2022.10.26
day21-java  (2) 2022.10.25
day20-java  (0) 2022.10.24
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그