2022_10_27 정리
파일이나 네트웨크 입출력에선 예외처리가 필수
웹에서의 현재 디렉토리는 현재 실행중인곳;
절대경로 : 루트로부터의 경로
Windows -> 루트드라이브 :\디렉토리경로\파일이름
Web -> 프로토콜://자원경로
상대경로 : 현재 위치에서의 경로
./ : 현재 디렉토리
../ : 상위 디렉토리
/ : 루트
->Java.Io.File
Windows에서는 디렉토리 구분기호가 \인데
프로그래밍 언어에서는 \ 가 오고 하나의 문자를 입력하면 제어문자로 인식함
\를 입력하고자 할때는 \\처럼 두번씩 사용해야함
->Stream
입출력할때의 스트림이있고 람다와 스트림에서 처럼 여러개의 데이터를 순차적으로 처리하기 위한 스트림이 있고
입출력에서의 스트림은 데이터를 운반하는데 사용하는 연결통로가 있다
-분류
입력 스트림과 출력 스트림으로 구분
바이트 스트림과 문자 스트림으로 구분
일반적인 파일처리는 바이트 스트림을 사용하고 문자를 읽고쓰는 경우에만 문자 스트림을 이용함
문자스트림을 사용할때는 인코딩에 주의해야 한다.
숫자를 데이터로 전송할땐
2진수로 인코딩해서 전송하기 때문에 디코딩하는 과정도 생각해야함
encoding 과 decoding 합치면 codec (코덱)
->ByteStream
-InputStream과 OutputStream
바이트 스트림의 최상위 클래스 (추상클래스) 인스턴스 생성 불가능
다른 바이트 스트림들이 가져야 하는 메서드의 원형을 소유
-InputStream
int available() : 읽을수 있는 바이트 수 리턴
void close() : 닫기
int read() : 한 바이트를 읽어서 정수로 리턴하고 읽지 못하면 -1로 리턴
int read(byte[] 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() : 버퍼의 내용을 출력
--------------스트림은 열면 반드시 닫아야 한다------------
--------------생성자가 안보이면 추상클래스인지 부터 확인
--------------모든 멤버가 Static인지 확인
--------------Spring 프레임워크에선
--------------"제어의 역전"이 중요하다(IOC)
->바이트 단위 파일 입출력
-FileInputStream 과 FileOutputStream
바이트 단위로 파일에 기록
-바이트 단위로 파일에 기록하는 클래스는 FileOutputStream이다
->Buffering : 모아서 처리
Buffered Input Stream
Print Stream
Flush = 버퍼의 내용을 출력
Buffer는 내용이 전부차면 출력
print는 모아서 버퍼에 출력
println은 flush로 버퍼에 있는걸 바로 출력
ln이 붙으면 바로바로 내보내달라는 의미
데코레이터 패턴 = 인스턴스 안에 인스턴스를 넣음
new BufferedInputStream( new FileInputStream());
GoFi의 Design Pattern - 싱글톤 등등 다양한 패턴들이 있음
->버퍼를 이용한 입출력
Java코드로 입출력하는 작업을 작성하면 실제로는 JVM이 운영체제의 Native Method를 호출해서 처리합니다
자주 입출력을 하는 경우 작업을 할 때 마다 Native Method를 호출하면 시스템의 성능이 나빠질 수 있다.
이런경우에는 버퍼를 이용해서 입출력 횟수를 줄이는것이 좋다
버퍼를 이용하는 바이트 단위 입출력은 BufferedInputStream(읽기) 와 PrintStream(쓰기)를 이용한다
버퍼에 기록을 할 대는 write메서드 대신에 Print메서드를 사용할 수 있으면 flush메서드르 이용해서 버퍼의 내용을 전부 출력할 수 있다.
표준 출력 스트림이 System.Out인데 이 스트림의 자료형이 PrintStream이다
->character Stream(문자 스트림)
Byte Stream을 이용하면 모든 종류의 IO장치와 데이터를 읽고 쓰기 작업이 가능
-컴퓨터는 기본적으로 바이트 단위로 작업을 수행하기 때문
문자단위로 데이터를 입출력하는 경우 byte stream을 사용하게 되면 변환작업이 필요
->Reader & Writter
문자 단위로 읽고 쓰기 위한 메서드를 제공하는 추상클래스 -> 문자 스트림의 최상위 클래스
-Reader의 메서드
void close()
int read() : 하나의 문자를 읽어오는 메서드로 문자의 코드를 리턴하는데 읽는데 실패하면 음수를 리턴
int read(char [] buf) : 문자를 buf크기만큼 읽어서 buf에 저장하고 읽은 개수를 리턴 - 리턴값이 -보다 작거나 같으면 읽기 실패
int read(char [] buf, int offset, int length) : 문자를 offset부터 length만큼 buf에 저장하고 읽은 개수를 리턴 - 리턴값이 -보다 작거나 같으면 읽기 실패
int read(charBuffer target)
boolean ready()
long skip(long n)
-Writter의 메서드
void close()
void flush()
void write(String str)
void write(String str, int offset, int length)
->InputStreamReader & OutputStreamReader
ByteStream을 CharacterStream으로 변환시켜주는 클래스
네트워크 프로그래밍에서 소켓은 ByteStream을 리턴하는데 주고받는 데이터가 문자열이라면 ByteStream을 InputStreamReader 인스턴스로 변환해서 사용해야한다.
new InputStreamReader(ByteStream 인스턴스)
->FileReader / FileWritter
파일에 문자단위로 읽고 쓰기 위한 클래스
->BufferedReader / PrintWritter
BufferedReader : 버퍼를 이용해서 문자를 읽어주는 클래스
String readLine()이라는 메서드가 제공되서 줄 단위로 읽어낼 수 있따.
읽어낸 내용이 없다면 null을 리턴한다
PrintWritter : 버퍼를 이용해서 문자단위로 기록하는 클래스
파일에 문자단위로 기록하고 읽어오기
->문자열을 분할하는 방법
-특수한 문자를 기준으로 분할
String[] split(String 기준문자열) 기준문자열을 기준으로 문자열을 분할해서 문자열 배열로 리턴
String msg = "Hello World Java";
String[] splits = msg.split(",");
System.Out.Println(splits[0]) // Hello
System.Out.Println(splits[1]) // World
System.Out.Println(splits[2]) // Java
//마지막 데이터 출력
System.Out.Println(splits[length-1]) // Java
-특수한 문자를 기준으로 분할
String msg = "Hello Java World";
String.result = msg.substring(6) // Java.world
String result1 = msg.substring(6,10) // Java
Serializable(직렬화)
인스턴스를 다른곳에 전송할 수 있도록 해주는 것
전송한다는 의미는 파일 단위로 읽고 쓰는 것도 전송으로 간주하고 컴퓨터와 컴퓨터 또는 Component와 Component 사이를 왔다갔다 하는 것도 전송한다고 한다
이럴때 사용하는 값의 집합을 나타내기 위한 인스턴스를 DTO(Date Transfer Object)라고 한다
Java에서는 인스턴스단위로 데이터를 전송하고자 하면 Serializable 이터페이스를 implements만 하면 된다
별도의 메서드 구현이 필요없음
응용 프로그램을 만들 때 자신의 저장형식을 갖고자 하는 경우 사용하고
안드로이드에서 Activity사이에 데이터 전송을 하고자 하면 사용함
DataInputStream과 DataOutputStream을 이용해서 사용함
데이터를 전송하고 전송받을때 데이터는 항상 하나로 만들어두는것이 좋다.
데이터의 분류
Scala data(하나의 데이터) : Byte, Short, Character, Integer, Long, Float, Double, Boolean, String
Vector Data(여러개의 데이터) :
배열과 List(Collection) -> 동일한 종류의 비교가능한 데이터(인덱스로 구분함)
VO클래스나 Map -> 여러개의 데이터를 하나로 묶을때 사용 (이름을 이용해서 데이터를 구분)
특별한 경우가 아니면 VO클래스나 MAP으로 사용함
->직렬화를 위한 DTO클래스 생성
생성 전 어떤 형식으로 만들지 생각해야한다
정수로 된 번호
문자열로 된 이름
Date로 만들어진 생일
---
StudentDTO
SerialiizableMain
--- Main클래스를 만들어서 직렬화한 인스턴스를 파일에 기록하고 읽어오기
->Try~Resources
jdk 1.7부터 지원되는 문법
Stream은 만들면 반드시 close를 해야한다 close를 하지않으면 메모리 누수가 발생함
try(여기서 만든 객체가 AutoCloseable인터페이스를 implements를 하고 있다면 close를 하지 않아도 try~catch구문을 벗어나면 자동적으로 close를 호출함){
}catch(Exception e){
}
Quiz 1
0
1 2
3 4
5 6
7 8
90123456789
Quiz 2 염기서열 문제
String msg = GCCGABCGCCGCCGBACGCCGCA
GCCG의 위치찾기 0 7 17
겹치는 것은 제외
Quiz 3 (2시간)
맨앞은 IP 맨뒤는 Traffic
Traffic의 합은?
Ip별 접속 횟수 구하기
IP별 Traffic의 합 구하기
Quiz 4 n번째까지의 피보나치 수열의 합
1,1,2,3,5,8,13,21,~~~~