java.io 패키지
자바의 기본적인 데이터 입출력 API제공
입력스트림과 출력스트림의 개념
스트림 : 데이터의 흐름
입력 스트림 데이터가 들어오는 것
출력 스트림 데이터가 밖으로 나가는 것
바이트 기반 스트림과 문자 기반 스트림
바이트 기반 스트림
그림 . 멀티미디어 ㅁ누자 등 모든 종류의 데이터를 받고 보낼 수 잇다.
문자 기반 스트림
문자만 받고 보낼 수 있도록 특화되어 있다,
InputStrim
바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스
read() 메서드
데이터를 읽어들이는 기본형
read(byte[] b) 메서드
byteArray단위 만큼 한번에 읽어올수 있다
read(byte[] b, int off, int len) 메서드
int off 부터 int len까지 읽어들일수 있다.
close() 메서드
반납 해준다.
byte 단위 입력 스트림
package kr.co.kihd.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.nio.charset.Charset;
public class InputStreamReadTest01 {
//일반예외가 발생하는데 그 예외를 JVM에게 던지고 있음.
public static void main(String[] args) throws Exception {
//다형성이 적용된 코드
InputStream iStream = new FileInputStream("C:\\workspace\\test.txt");
int readByte; //읽은 바이트수를 리턴 받는 변수
//InputStream read()는 더이상 읽을게 없다면, -1값을 리턴함.
//기본적으로 이클립스는 한글을 3바이트로 읽어들인다. (UTF-8)
while( (readByte = iStream.read()) != -1) {
//아스키코드값을 출력
System.out.println("읽은 데이터 (1바이트) : " + readByte);
//강제업케스팅 후 문자로 출력
System.out.println("읽은 문자 : " + (char)readByte);
}
//이클립스 디폴트 캐릭터셋
System.out.println(Charset.defaultCharset());
iStream.close();
}
}
읽은 데이터 (1바이트) : 65
읽은 문자 : A
읽은 데이터 (1바이트) : 66
읽은 문자 : B
읽은 데이터 (1바이트) : 67
읽은 문자 : C
같은 코드
package kr.co.kihd.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.nio.charset.Charset;
public class InputStreamReadTest01 {
//일반예외가 발생하는데 그 예외를 JVM에게 던지고 있음.
public static void main(String[] args) throws Exception {
//다형성이 적용된 코드
InputStream iStream = new FileInputStream("C:\\workspace\\test2.txt");
int readByte; //읽은 바이트수를 리턴 받는 변수
//InputStream read()는 더이상 읽을게 없다면, -1값을 리턴함.
//기본적으로 이클립스는 한글을 3바이트로 읽어들인다. (UTF-8)
while(true) {
readByte = iStream.read();
if(readByte == -1)
break;
//아스키코드값을 출력
System.out.println("읽은 데이터 (1바이트) : " + readByte);
//강제업케스팅 후 문자로 출력
System.out.println("읽은 문자 : " + (char)readByte);
}
//이클립스 디폴트 캐릭터셋
System.out.println(Charset.defaultCharset());
iStream.close();
}
}
한글출력
package kr.co.kihd.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class InputStreamReadTest02 {
public static void main(String[] args) throws Exception {
InputStream iStream = new FileInputStream("C:\\workspace\\test3.txt");
int readByteNo;
byte[] bytes = new byte[3];
while( (readByteNo = iStream.read(bytes)) != -1) {
System.out.println("읽은 바이트 수 : " + readByteNo);
//String 클래스로 반드시 디코딩해야 한들이 출력됨.
String str = new String(bytes);
System.out.println("읽은 문자열 : " + str);
}
iStream.close();
}
}
시작인덱스 2이고 3개만 읽어서 저장하는 코드를 작성
package kr.co.kihd.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class InputStreamReadTest03 {
public static void main(String[] args) throws Exception {
InputStream iStream = new FileInputStream("C:\\workspace\\test4.txt");
int count;
byte[] readBytes = new byte[10];
//시작인덱스 2이고 3개만 읽어서 저장하는 코드를 작성
count = iStream.read(readBytes, 2, 5);
System.out.println("읽은 바이트 수 : " + count);
for(byte b : readBytes) {
System.out.println("읽은 바이트 : " + (char)b);
}
iStream.close();
}
}
OutputStream
바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스
package kr.co.kihd.outputstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Arrays;
public class OutputStreamTest01 {
public static void main(String[] args) throws Exception {
//파일로부터 출력스트림을 생성하여 대입한다.(다형성)
OutputStream oStream = new FileOutputStream("C:\\workspace\\write.txt");
byte[] data = "ABC".getBytes();
System.out.println(Arrays.toString(data)); //아스키코드가 출력됨.
//3번 루핑한다. 한 글자씩 보내기 때문임.
for(int i = 0; i<data.length; i++) {
oStream.write(data[i]);
}
//write()를 사용하면 무조건 flush()를 호출하며, 반드시 메모리 버퍼를
//비우도록 하자. 물론 main() 종료하면 알아서 버퍼에서 나가지만,
//가능한한 flush()를 호출하도록 하는 것을 습관화하도록 한다.
oStream.flush();
System.out.println("저장이 완료되었습니다.");
oStream.close();
}
}
[65, 66, 67]
저장이 완료되었습니다.
for문 없이 write 효율적
package kr.co.kihd.outputstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutputStreamTest02 {
public static void main(String[] args) throws Exception {
// 파일로부터 출력스트림 생성해서 대입하고 있다.
OutputStream oStream = new FileOutputStream("C:\\workspace\\write2.txt");
//"ABC가나다" 문자열을 통해서 바이트 배열을 얻고 있다.(인코딩)
byte[] data = "ABC가나다".getBytes("ISO8859-1");
//getBytes()를 사용할때, 매개변수의 값으로 캐릭터셋을 줄수가 있는데
//EUC-KR,x-windows-949는 한글을 2바이트 인식,
//UTF-8은 한글을 3바이트로 인식한다.
//ISO8859-1 캐릭터 셋에서는 한글을 1바이트로 인식한다.
System.out.println("data 바이트배열의 크기 " + data.length);
//바이트 배열을 한번에 스트림에 보낸다.
//이앞에서 본 write(int b)메서드 비해서 훨씬 효율적이다.
oStream.write(data);
System.out.println("저장이 완료되었습니다.");
oStream.flush();
oStream.close();
}
}
data 바이트배열의 크기 6
저장이 완료되었습니다.
InputStream 으로 만들기
package kr.co.kihd.outputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class OutputStreamTest02 {
public static void main(String[] args) throws Exception {
// 파일로부터 출력스트림 생성해서 대입하고 있다.
OutputStream oStream = new FileOutputStream("C:\\workspace\\write2.txt");
//"ABC가나다" 문자열을 통해서 바이트 배열을 얻고 있다.(인코딩)
byte[] data = "ABC가나다".getBytes();
//getBytes()를 사용할때, 매개변수의 값으로 캐릭터셋을 줄수가 있는데
//EUC-KR,x-windows-949는 한글을 2바이트 인식,
//UTF-8은 한글을 3바이트로 인식한다.
//ISO8859-1 캐릭터 셋에서는 한글을 1바이트로 인식한다.
System.out.println("data 바이트배열의 크기 " + data.length);
//바이트 배열을 한번에 스트림에 보낸다.
//이앞에서 본 write(int b)메서드 비해서 훨씬 효율적이다.
oStream.write(data);
System.out.println("저장이 완료되었습니다.");
oStream.flush();
System.out.println();
//출력으로 내보낸 파일인 write2.txt파일을 읽어들인다.
InputStream iStream = new FileInputStream("C:\\workspace\\write2.txt");
int count = 0;
//UTF-8 한글이 3바이트이므로 바이트배열을 3바이트 생성함.
byte[] readBytes = new byte[3];
int i = 0;
while( (count = iStream.read(readBytes)) != -1) {
i++;
String str = new String(readBytes); //디코딩
System.out.println("읽은 값 : " + str);
System.out.println("읽은 바이트 수 : " + count);
}
System.out.println("루핑 수 : " + i);
iStream.close();
oStream.close();
}
}
data 바이트배열의 크기 12
저장이 완료되었습니다.
읽은 값 : ABC
읽은 바이트 수 : 3
읽은 값 : 가
읽은 바이트 수 : 3
읽은 값 : 나
읽은 바이트 수 : 3
읽은 값 : 다
읽은 바이트 수 : 3
루핑 수 : 4
시작인덱스가 3이고, 15개의 길이만큼 파일로 내보낸다
package kr.co.kihd.outputstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutputStreamTest03 {
public static void main(String[] args) throws Exception {
OutputStream oStream = new FileOutputStream("C:\\workspace\\write3.txt");
byte[] data = "ABC빅데이터란".getBytes();
System.out.println("data바이트 계열의 크기 : " + data.length);
//시작인덱스가 3이고, 15개의 길이만큼 파일로 내보낸다.
oStream.write(data, 3, 15);
oStream.flush();
System.out.println("파일이 저장되었습니다.");
oStream.close();
}
}
복사 - 기본형
package kr.co.kihd.outputstream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileCopyTest {
public static void main(String[] args) throws Exception {
FileInputStream fInputStream = new FileInputStream("C:\\workspace\\write3.txt");
FileOutputStream fOutputStream =
new FileOutputStream("C:\\workspace\\write3_복사본.txt");
int data = 0;
while( (data = fInputStream.read()) != -1) {
fOutputStream.write(data);
}
fOutputStream.flush();
System.out.println("C드라이브에 write3_복사본.txt파일이 생성되었습니다.");
fOutputStream.close();
fInputStream.close();
}
}
복사 - 배열타입
package kr.co.kihd.outputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class FileCopyTest2 {
public static void main(String[] args) throws Exception {
FileInputStream fInputStream = new FileInputStream("C:\\workspace\\write3.txt");
FileOutputStream fOutputStream =
new FileOutputStream("C:\\workspace\\write3_복사본.txt");
byte[] readBytes = new byte[1000];
int data = 0;
while( (data = fInputStream.read(readBytes)) != -1) {
fOutputStream.write(readBytes);
System.out.println("읽은 바이트 수 : " +data);
}
fOutputStream.flush();
System.out.println("C드라이브에 write3_복사본.txt파일이 생성되었습니다.");
fOutputStream.close();
fInputStream.close();
}
}