입출력 원리
외붕 데이터는 프로그램 외부에 존재하는 모든 데이터를 의미. 하드디스크 상에 있는 파일, 네트워크 상에 존재하는 자원, 메로리에 있는 자원이 될 수도 있음. 외부 데이터 타입이 무엇이든 자바는 외부 데이터를 읽거나 쓰기 작업을 할 때 동일하게 처리.
입출력 API
java.io 패키지에 있으며 객체이름에서 InputStream, Reader, OutputStream, Writer 단어를 빼고 남은 단어가 외부 데이터 타입
InputStream, OutputStream 계열은 1바이트 단위로 Reader 와 Writer 계열은 2바이트 단위로 작업
모든 스트림은 단방향이므로 읽거나 출력하는 기능 중 하나만 처리 할 수 있음
기본 입출력 작업
파일 입출력
try{
FileInputStream fi = new FileInputStream("a.txt");
FileOutputStream fo = new FileOutputStream("b.txt");
}catch(Exception e){
e.printStackTrace();
}
파일에는 포인터라는 파일에서 데이터의 위치를 가리킴. 프로그램에서 파일ㅇ륵 읽거나 쓸 때는 파일 포인터가 가리키는 곳부터 작업을 시작하며, 작업이 끝나면 작업한 만큼 파일 포인터가 이동. fi.read() 메서드가 실행되면 포인터가 위치한 문자 한개를 읽어오고 포인터느 다음 문자를 가리킴, 이 작업을 계속 반복해서 모든 문자를 읽으면 파일포인터는 파일의 끝을 가리킴. 포인터가 파일의 끝을 가리킬 떄 fi.read() 메서드를 실행하면 -1을 반환.
public class Test01{
public static void main(String[] args){
try(FielInputStream fi = new FileInputStream("a.txt");
FileOutputStream fo = new FileOutputStream("b.txt");){
int c = 0;
while((c=fi.read())!=-1){
fo.write(c);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
Fileinput,output은 try문이 끝나면 자동해제 될 부분이라 넣어두고 파일포인터가 파일의 끝을 가르킬때까지 "a.txt" 읽어서 "b.txt"에 쓰기
표준 입출력
입출력 대상을 지정하지 않았을 경우에 사용되는 입출력 대상읠 의미. 프로그램에서 표준 입력은 키보드이고 표준 출력은 모니터이다. Java Se API는 키보드와 연결딘 표준 입력스트림과 모니터와 연결된 표준 출력 스트림을 제공함.
System.in은 키보드와 연결된 표준 입력 스트림, System.out은 모니터 정확히는 콘솔에 연결된 표준 출력 스트림
pulic class Test02{
public static void main(String[] args){
try(InputStream keyboard = System.in; PrinStream console = System.out;){
int c = 0;
while((c=keyboard.read())!= -1){
console.write(c);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
간단한 echo 프로그래밍 가능
필터 스트림 활용
java,io의 입출력 스트림들은 '기본 스트림'과 '필터 스트림'으로 분류할 수 있다. 기본 스트림은 일거나 출력하는 외부 데이터와 직접 연결되는 스트림이고 핕러 스트림은 외부 데이터와 직접 연결되는 것이 아니라 기본 스트림에 추가로 사용할 수 있는 스트림이다. 이는 생성자로 구분 할 수 있다.
FileReader(String fileName) >> 기본 스트림
BufferedReader(Reader in) >> 필터 스트림
필터스트림은 외부 데이터와 직접 연결되는 것이 아니라 독립적으로 사용할 수 없다.
FileReader fr = new FileReader("a.txt");
BufferedReader br = new BufferedReader(fr);
fr은 a.txt 파일과 직접 연결됬고 br은 fr에 추가로 연결한 스트림이다.
FileReader의 read() 메서드는 한 바이트 또는 인자로 전달한 바이트 배열의 수만큼 읽는다.
BufferedReader는 외부 데이터와 프로그램 중간에 버퍼를 사용한다. 버퍼는 외부로부터 읽은 데이터가 잠시 저장되는 곳이다. 프로그램에서는 버퍼에 있는 데이터를 읽어오므로 처리 속도도 빠르고 바이트 단위가 아니라 줄단위로 데이터를 읽을 수 있는 readLine() 메서드도 제공한다.
BufferedReader/Writer
Reader 계열과 Writer 계열의 스트림에 추가해서 사용할 수 있는 필터스트림. 특징은 외부 데이터를 읽거나 출력할 때 버퍼를 사용하여 문자를 처리함.
public class Test03{
public static void main(String[] args){
try(BufferedReader br = new BufferedReader(new IntputStreamReader(System.in))){
System.out.println("이름을 입력하세요");
String name = br.readLine();
System.out.println("Hello" + name);
}catch(Exception e){
e.printStackTrace();
}
}
}
System.in은 InputStream이기 때문에 InputStreamReader 객체를 생성하고 BufferedReader의 생성인자로 전달
키보드 > System.in > InputStreamReader > BufferReader > 자바프로그램 순으로 연결됨
BufferedInputStream/OutptuStream
InputStream 계열과 OutputStream 계열의 스트림에 추가해서 사용할 수 있는 필터 스트림.특징은 외부 데이터를 읽거나 출력할 때 버퍼를 사용
public class Test04{
public static void main(String[] args){
try(BufferedInputStream in = new BufferedInputStream(new FileInputStream("a.txt")));
ByteArrayOutputStream out = new ByteArrayOutputStream();){
byte[] buf = new Byte[1024];
int len = 0;
while((len = in.read(buf))!= -1){
out.write(buf, 0, len);
}
byte[] arr = out.toByteArray();
String s = new String(arr);
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}
}
}/code>