입출력 : IO( Input Output ) Stream
-
JVM외부에 존재하는 데이터를 처리하기 위해 연결하는 클래스들
-
java.io 패키지에서 클래스들 제공
입력의 근원 |
|
출력의목적지 |
1.시스템
( 키보드 ) |
JVM |
1.시스템
( 모니터 ) |
2.파일
( 하드디스크 ) |
2.파일
( 하드디스크 ) | |
3.network |
3.network | |
InputStream
입력스트림 |
|
OutputStream
출력스트림 |
-
Java의 IO는 단반향 IO이다 ( 읽기와 쓰기가 동시에 될수 없다. )
-
8bit Stream(byte기반)과 16bit Stream(String 기반)으로구분된다.
8bit Stream |
16bitStream |
바이트기반 |
문자열기반 |
속도빠름 |
속도느림 |
데이터의 양은 적다. |
데이터의 양이 많다. |
모든 데이터를 읽고 쓸수있다. |
문자열데이터만 읽고 쓸 수있다. |
8 Bit Stream |
16Bit Stream | ||
입력
InputStream |
출력
OutputStream |
입력
Reader |
출력
Writer |
ObjectInputStream
( 객체를 입력 ) |
ObjectOutputStream
(객체를 출력 ) |
FileReader
( 문자열파일입력 ) |
FileWriter
( 문자열파일출력 ) |
FileInputStream
( 파일을 입력 ) |
FileOutputStream
(파일을 출력 ) |
BufferedReader
( 문자열파일입력,속도개선 ) |
BufferedWriter
( 문자열파일출력,속도개선 ) |
DataInputStream
( 데이터를 입력 ) |
DataOutputStream
( 데이터를 출력 ) |
|
|
1.Stream의 결합
Stream은 결합 가능하다 ( 8bit + 8bit ,16bit + 16bit , 8bit + 16bit )
1)8bit+16bit
InputStreamReader 를 사용한다.
2)16bit+16bit
BufferedReader 의 readLing() 메소드를 사용한다.
package day0419;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 시스템 입력 ( 키보드 입력 : System.in )
* @author owner
*/
public class UseKeyboardInput {
public UseKeyboardInput() {
System.out.println("아무키나 누르고 엔터");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
//8bit stream 과 16bit stream을 연결하여 줄단위읽기
// int key;
// while(true) {
// //key = System.in.read(); //읽어들인 문자를 조합할수 없기 때문에 한글은 사용할 수 없다.
// key = br.read();
// if(key==13) {
// break;
// }
// System.out.println("읽어 들인 값: "+ (char)key+","+key);
}//end while
}catch(IOException e) {
e.printStackTrace();
}
}//UseKeyboardInput
public static void main(String[] args) {
new UseKeyboardInput();
}//main
}//UseKeyboardInputS
2.파일 입력
1)FileInputStream : 8bit
-파일의 내용을 출력할 필요가없는 파일을 읽어들일때사용(이미지,동영상복사)
2)FileReader : 16bit
-파일을 읽어 뿌려야할때
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
혹은
BufferedReader br = new BufferedReader(new FileReader(file));
사용
3.Stream의 사용이 끝났다면 Stream 을 반드시 끊어야 한다.
close()메소드 사용
4.File
java.io 패키지 존재
파일정보얻기,directory생성, 파일삭제
4.1) 생성
File f = new File(" 파일의 경로" );
4.2) method
절대경로 얻기 :f.getAbsolutePaht():String;
폴더명 : f.getParent():String;
파일명 : f.getName():String;
파일인지 여부 : f.isFile():boolean;
폴더인지 여부 : f.isDirectory(): boolean;
읽기가능한지 여부 : f.canRead();boolean;
쓰기가능한지 여부 : f.canWhrite();boolean;
실행가능한지 여부 : f.canExecute():boolean;
숨긴파일인지 여부 : f.isHidden();
폴더내 파일의 목록 : f.listFiles() : File[];
파일이름 변경 : f.renameTo(File ):boolean;
폴더를 생성 : f.mkdir() : boolean; // root 에는 폴더가 안만들어짐
폴더를 생성 : f.mkdirs() : boolean; // root 에도 폴더가 생성됨
파일지우기 : f.delete() : boolean;
파일이 마지막으로 수정된 날짜 : f.lastModified():long
파일존재여부 : f.exists():boolean
파일길이 : f.length():int
5.출력스트림
-
JVM내의 데이터를 JVM외부로 내보내는 것 File관련 스트림
-
파일과 연결 : 목적지에 파일이 없으면 파일 생성, 파일이 있으면 덮어쓴다.
-
flush() 메소드를 사용하여 목적지에 분출하고 close()메소드로 연결을 끊는다.
종류 |
차이점 |
공통점 |
FileOutputStream |
모든 파일을 생성 |
객체가 생성되자마자 폴더는 생성하지 못한다. |
FileWriter |
문자열 파일만 생성 |
사용법)
BufferedWriter bw = new BufferedWriter( new FileWriter(file));
bw.write("문자열");스트림에 기록
bw.flush() ; 목적지로 분출!
6.파일복사
-
8Bit 사용하면 모든 파일을 복사 할 수 있다.
-
16 bit 사용하면 text파일만 복사가능
7.객체쓰기
-
instance(생성된 객체)를 JVM외부로 내보내거나 JVM외부에 존재하는 instance 읽어들이는 일을 하는 stream
-
객체(instance)는 Stream을 타고 외부로 나 갈수 없다. (중요정보를 안전하게 보호하기 위해서 직렬화 X)
-
기본형 데이터형은 Stream을 타고 외부로 나갈 수 있다. ( 직렬화 O)
-
transient : 객체 직렬화방지키워드 ( 직렬화 되어 객체가 밖으로 나가더라도 transient가 붙어있으면 그 값은 외부로 나가지 못한다. )
-
객체를 JVM외부로 내보낼때 Serialiable interface를 구하면된다.(직렬화)
-
ObjectInputStream ( UnMarshall Stream : 쪼개진 객체가 다시 합쳐지는 것), ObjectOutputStream( Marshall Stream : 객체를 직렬화하여 쪼개고 출력하는 것)
-
직렬화된 객체를 검증하기 위해 Serial Version UID사용
ObjectOutputStream oos = new ObjectOutStream(new FileOutputStream(파일명));
oos.writeObject(객체);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(파일명));
ois.readObject(); < Class NotFoundException 발생할 우려가 있음