JAVA

바이트 단위 입출력 스트림

Stater 2019. 10. 19. 09:30

바이트 단위 입출력 스트림

- 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