I&O
**Input & Output(IO)
=>Main Memory 와 주변 장치(파일, 키보드나 모니터와 같은 입출력 장치, 네트워크 등) 들간의 통신
1.java.io.File 클래스
=>파일에 대한 정보를 리턴해주는 클래스
1)경로(위치) 설정
=>절대 경로: 루트로부터의 경로, 불변의 경로
윈도우즈: c:\디렉토리이름..\파일명
그외의 운영체제: /디렉토리이름.../파일명
웹: http://요청경로
윈도우즈만 디렉토리 구분기호가 \ 이고 나머지 경우는 전부 /
윈도우즈의 경로를 표시할 때는 \\ 로 표현해야 합니다.
=>상대 경로: 현재 위치로부터의 경로, 현재 위치에 따라 변함
./ : 현재 디렉토리
../ : 상위 디렉토리
현재 디렉토리는 생략해도 되는 경우가 대부분이고 Mac의 경우는 터미널에서 에러가 납니다.
2)파일 객체 생성
File(String pathname)
File(String parent, String child)
=>파일의 경로를 가지고 생성
3)중요한 메소드
boolean exists() : 파일의 존재 여부를 리턴
boolean delete() : 파일을 삭제하고 삭제 성공 여부를 리턴
long lastModified() : 최후 수정 시간을 정수로 리턴
long length(): 파일의 크기를 리턴
String[] list(): 디렉토리의 경우 내부에 존재하는 파일의 목록을 문자열로 리턴
4)서버로부터 데이터를 다운로드 받는 애플리케이션을 생성
=>서버에 접속할 때 마다 데이터를 다운로드 받는 것은 자원의 낭비
=>처음에 접속할 때 데이터를 다운로드 받아서 파일로 저장해두고 사용
=>다음에 접속했을 때는 데이터의 변경이 발생했으면 다운로드하고 그렇지 않으면 이전에 저장한 데이터를 계속 사용
2.java.nio.file.Path
=>File 클래스에 기능을 추가한 새로 등장한 API
=>File 클래스는 symbolic link(바로가기)를 생성할 수 없음
=>File 클래스는 디렉토리 밑의 파일의 생성/갱신/삭제 를 감시할 수 없음
3.입출력 Stream
=>데이터를 주고받는 연결 통로
=>파일이나 네크워크 등과 통신하기 위해서는 스트림이 필요
1)입출력에 따른 분류
=>InputStream: 입력을 받기 위한 스트림 - 외부에서 읽어오기 위한 스트림
=>OutputStream: 출력을 하기 위한 스트림 - 내부의 데이터를 전송하기 위한 스트림
2)전송 단위에 따른 분류
=>ByteStream: 바이트 단위로 전송하는 스트림, 그림 파일 처럼 문자가 아닌 데이터의 전송에 사용, 이 기종 간의 통신에 이용
=>CharacterStream: 문자 단위 전송
=>ObjectStream: 인스턴스로 단위로 전송
=>자바 소켓 서버와 iOS가 채팅을 하는 경우 기본적으로는 ByteStream을 이용해야 합니다.
**ByteStream
=>데이터를 Byte 단위로 주고 받는 스트림
1.InputStream & OutputStream
1)InputStream
=>Byte 단위로 입력받기 위한 스트림을 위한 추상 클래스
=>공통으로 사용할 메소드를 선언한 클래스
int available(): 읽을 수 있는 바이트 수 리턴
void close(): 스트림 닫는 메소드
int read(): 하나의 바이트를 읽어서 정수로 리턴, 읽은 데이터가 없으면 -1을 리턴
int read(byte [] b): 데이터를 읽어서 b에 저장하고 읽은 바이트 수를 리턴, 읽은 데이터가 없으면 -1을 리턴
int read(byte [] b, int off, int len): 데이터를 읽어서 b에 저장하는데 off 부터 len 만큼만 저장하고 읽은 바이트 수를 리턴, 읽은 데이터가 없으면 -1을 리턴
long skip(long n): n 만큼 넘어가는 메소드
OutputStream
- 바이트 단위로 데이터를 전송하기 위한 스트림의 추상 클래스
- 다른 클래스에서 공통으로 사용할 메소드를 선언만 한 클래스
- void close(): 스트림을 닫는 메소드
- void write(byte[] b),void write(int b)
- void write(byte[] b, int off, int len): b배열에서 off부터 len만큼 전송
- void flush(): 버퍼의 내용을 전부 전송
- 데이터를 전송할 때는 버퍼에 모아서 한꺼번에 전송함.
write로 데이터를 전송할 때 버퍼의 크기를 넘어서면 전송을 하지만 그렇지 않으면
전송하지 않는 경우가 발생하는데 이 때는 flush를 이용해서 내용을 전부 전송해주어야 함.
FileInputStream & FileOutputStream
- 파일에 바이트 단위로 기록하고 읽어오는 클래스
- 파일 경로를 생성자에 입력해서 인스턴스를 생성
- 생성할 때 파일의 경로가 없을 수 있어서 FileNotFoundException 예외처리를 해야함.
- 기록을 하는 클래스의 생성자는 읽기를 하는 클래스의 생성자보다 1개 정도가 더 많음.
기록을 할 때는 전부 지우고 기록할 것인지 이어서 쓸 것인지를 설정해 주어야 하기 때문.
기본은 전부 지우고 기록하는것.
buffer: 임시 기억장치, 입/출력할 내용을 저장해서 한번에 입출력하라고 함.
입출력 효율을 높이기 위해 사용함,
다른 하드웨어와 통신할 때는 jvm이 하드웨어를 제어할 수 있는 native 메소드를 호출함.
BufferdInputStream & PrintStream
- 버퍼를 이용해서 입출력 효율을 높이기 위한 스트림
- 버퍼를 이용하지 않으면 입출력 메소드를 호출할 때마다 운영체제의 native메소드를 호출해서
효율이 나빠질 수 있음.
- 버퍼에 모아 한꺼번에 처리하는 방식을 권장
- 인스턴스를 생성할 때 다른 스트림 인스턴스를 받아서 생성함.
*PrintStream.print(): 해쉬코드가 저장. write하면 됨
Character Stream
- 문자 단위로 데이터를 주고 받는 스트림
- 파일 전송 등에는 사용할 수 없고 오로지 문자 전송에만 사용하는 스트림
1. Reader
- 문자 단위 읽기에 사용하는 메소드를 소유한 추상 클래스
FileReader & FileWriter
- 파일에 문자 닺위로 읽고 쓰기 위한 스트림
- 이 클래스의 인스턴스를 이용해서 읽고 쓰기를 하면 native mothod를 자주 호출해서
입출력의 효율이 떨어질 수 있음
BufferedReader & PrintWrite
1) Buffered Reader
- 버퍼를 이용해서 문자 단위로 읽고 쓰는 클래스
String readLine()메소드가 추가되어 있음
한 줄의 문자열을 읽어서 문자열로 리턴하는 메소드로 읽은 데이터가 없으면 null을 리턴
2) PrintWriter
- 버퍼를 이용해서 문자 단위로 쓰는 클래스
- print와 println 메소드가 있음