바이트 단위 입출력 스트림
- InputStream : 바이트 단위 입력 스트림 최상위 클래스
- OutputStream : 바이트 단위 출력 스트림 최상위 클래스
■ 추상 메서드를 포함한 추상 클래스로 하위 클래스가 구현하여 사용
스트림 클래스 | 설명 |
FileInputStream |
파일에서 바이트 단위로 자료를 읽는다. |
ByteArrayInputStream |
Byte 배열 메모리에서 바이트 단위로 자료를 읽는다. |
FilterInpuStream |
기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스이다 |
스트림 클래스 | 설명 |
FileOutputStream | 바이트 단위로 파일에 자료를 쓴다. |
ByteArrayOutputStream | 바이트 배열에 바이트 단위로 자료를 쓴다. |
FilterOutputStream | 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스 |
FileInputStream과 FileOutputStrem의 사용
- 파일에 한 바이트씩 자료를 읽고 쓰는데 사용
- 입력 스트림은 파일이 없는 경우 예외 발생
- 출력스트림은 파일이 없는 경우 파일 생성하여 출력
■ FileInputStream
package stream.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputTest1 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("input.txt");
//한글자씩-> i = fis.read();
// System.out.println((char)i);
// i = fis.read();
// System.out.println((char)i);
//-1 파일이 다 읽기되면 반환되는 값
// 파일 전체를 읽을때는 아래와 같이 사용
int i;
while((i=fis.read())!=-1) {
System.out.println((char)i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("end");
}
}
★ FileInpuStream사용해서 위와 같이 사용한 경우에는 영어는 잘 읽히지만, 한글은 깨져서 출력된다.
그 이유는 한 바이트씩 읽기 때문에 깨져서 출력된다.
package stream.inputstream;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputTestAuto {
public static void main(String[] args) {
//auto close사용되기때문에 간결화 가능
//byte[]바이트 어레이를 사용하면 좀더 빠르게 읽을 수 있다.
try(FileInputStream fis = new FileInputStream("input.txt")){
int i ;
while((i=fis.read()) !=-1) {
System.out.println((char)i);
}
}
catch(IOException e) {
e.printStackTrace();
}
System.out.println("END");
}
}
■ byte[] 어레이 사용시에 Buffer를 이용하므로 파일을 읽을때 가비지 값이 남을 수 있다는 점을 생각하고 사용하기
package stream.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputTest3 {
public static void main(String[] args) {
//byte[]바이트 어레이를 사용하면 좀더 빠르게 읽을 수 있다.
try(FileInputStream fis = new FileInputStream("input2.txt")){
int i ;
byte[] bs = new byte[10];
while((i=fis.read(bs)) !=-1) {
// for(byte b:bs) {
// System.out.print((char)b);
// }
// System.out.println();
for(int k=0;k<i;k++) {
System.out.print((char)bs[k]);
}
System.out.println();
}
}
catch(IOException e) {
e.printStackTrace();
}
// System.out.println("END");
}
}
■ FileOutputStream -> 파일 생성이 생성 간단한 예제
package stream.inputstream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputTest1 {
public static void main(String[] args) {
try(FileOutputStream fos=new FileOutputStream("output.txt")){
fos.write(65);
fos.write(66);
fos.write(67);
}catch(IOException e){
System.out.println(e);
}
}
}
■ FileOutputStream / FileInputStream 사용
1.파일을 생성한다.
2.생성된 파일을 읽는다.
(true의 의미는 이어서 쓴다라는 의미)
package stream.inputstream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputTest2 {
public static void main(String[] args) {
byte[] bs = new byte[26];
byte data = 65;
for(int i =0; i<bs.length;i++) {
bs[i]= data;
data++;
}
try(FileOutputStream fos=new FileOutputStream("alpha.txt",true);
FileInputStream fis=new FileInputStream("alpha.txt")){
fos.write(bs);
int ch;
while((ch=fis.read()) !=-1){
System.out.print((char)ch);
}
}catch(IOException e){
System.out.println(e);
}
}
}
반응형
'JAVA' 카테고리의 다른 글
Socket통신 HTTP 통신 (0) | 2019.10.22 |
---|---|
문자 단위 입출력 스트림 (0) | 2019.10.20 |
자바 입출력 스트림 (0) | 2019.10.18 |
Multi-Thread 프로그래밍 (0) | 2019.10.17 |
예외처리 (0) | 2019.10.17 |