Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch14. 자바 입출력 (3) 본문

JAVA 문법

Ch14. 자바 입출력 (3)

밍응애 2021. 2. 18. 00:14

< 바이트 단위 입출력 스트림 >

* 바이트 단위 스트림

  • InputStream : 바이트단위 입력스트림 최상위 클래스 (FileInputStream, ByteArrayInputStream, FilterInputStream...)
  • OutputStream : 바이트단위 출력스트림 최상위 클래스 (FileOutputStream, ByteArrayOutputStream, FilterOutputStream...)

* FileInputStream과 FileOutputStream 사용하기

- 파일의 한 바이트씩 자료를 읽고 쓰는데 사용 --> 한글과 같은 문자는 X (FileReader, FileWriter를 사용해야함)

- 입력 스트림은 파일이 없으면 예외 발생시키는 반면, 출력 스트림은 파일을 생성하여 출력함

 

- 예제

# FileInputTest1 클래스

package Ch14.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");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				fis.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

--> 실제 파일이 없으므로 입력스트림인 FileInputStream이 예외를 발생시킴

--> 따라서 fis를 연 적도 없기에 finally에서 close()을 하려고하면 nullPointException이 떨어지게 된다

 

이제 input.txt 파일을 실제 패키지 안에 생성한 후 다음과 같이 텍스트를 작성한 후 FileInputStream으로 읽어보자.

package Ch14.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");
			
			int i;
			while( (i = fis.read()) != -1 ) {
				System.out.print((char)i);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				fis.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("end");

	}

}

--> 읽고자 하는 파일의 끝에 도달하면 -1을 반환하므로 끝까지 읽기 위해 while안에 조건식을 걸어준다

--> char타입으로 변환하여 출력해보면, FileInputStream은 1바이트씩만 읽어오므로 한글은 읽지 못하고 나머지 문자는 잘 읽는 것을 알 수 있다

# FileInputTest2

package Ch14.stream.inputstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputTest2 {

	public static void main(String[] args) {
		
		
		try(FileInputStream fis = new FileInputStream("input2.txt")){
			//try안에서 리소스 오픈하고 오토클로즈업 --> 클로즈가 불림
			int i;
			while( (i = fis.read()) != -1 ) {
				System.out.print((char)i);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("end");
	}

}

input2.txt는 다음과 같다

--> try안에서 리소스를 오픈하고 오토클로즈업을 하므로 클로즈가 불려서 따로 finally 쓰지 X

 

# FileInputTest3 -- byte[] 단위로 읽기

FileInputSream클래스의 read()메서드를 보면, 

1바이트씩 / byte[] array / bite[] array에서 offset을 지정하고 length만큼 읽는 3가지 옵션이 있다

 

여기서 read(byte[] b)를 사용해보자.

package Ch14.stream.inputstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputTest3 {

	public static void main(String[] args) {
		
		
		try(FileInputStream fis = new FileInputStream("input2.txt")){
			//try안에서 리소스 오픈하고 오토클로즈업 --> 클로즈가 불림
			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();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//System.out.println("end");

	}

}

--> 10바이트씩 array로 읽어오기 때문에 10바이트를 맞춰주기 위해 만약 읽어오는 데이터에서 바이트 수가 부족하다면 가비지로 채워진다 (QRST는 전에 읽었던 데이터로 가비지로 채울 때 쓰임)

--> 따라서 코드를 다음과 같이 바꿔준다

--> 이제 읽어온 개수만큼만 출력하게 되므로, 읽어온 개수인 i도 함께 출력해보면

--> 10개, 10개, 6개를 읽어와 각각 그 개수만큼 찍어주므로 가비지는 더이상 출력되지 않는다

 

# FileOutputTest 클래스

package Ch14.stream.outputstream;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputTest {

	public static void main(String[] args) {
		try(FileOutputStream fos = new FileOutputStream("output.txt", true)){
			fos.write(65);
			fos.write(66);
			fos.write(67);
		}catch(IOException e) {
			System.out.println(e);
		}

	}

}

--> output.txt파일이 없으므로 파일이 생성된 후 write()가 수행된다

--> 인자로 true를 주면 append가 됨

 

# FiileOutputTest2 클래스 -- FileInputStream과 FileOutputStream 모두 써보기

package Ch14.stream.outputstream;

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 문법' 카테고리의 다른 글

Ch14. 자바 입출력 (5)  (0) 2021.02.18
Ch14. 자바 입출력 (4)  (0) 2021.02.18
Ch14. 자바 입출력 (2)  (0) 2021.02.16
Ch14. 자바 입출력 (1)  (0) 2021.02.16
Ch15. 자바 Thread 프로그래밍 (5) - multi-thread 프로그래밍  (0) 2021.02.15