티스토리 뷰

Chapter 13. 입출력 자바의 IO 패키지

 

▶ 학습 목표

: 스레드가 무엇인지 설명할 수 있고 스레드를 생성하고 구현할 수 있다.

 

 

 

 

 

 

13-1. IO와 스트림

 

 

- IO

 

: 데이터를 읽고 기록하는 것을 input, output이라고 하여 IO라고 한다. 

이때 input은 프로그램으로 들어오는 값이고, output은 밖으로 나가는 값이다.

입출력이라고 부르고 자바에서는 입출력 처리를 위해 IO패키지를 제공한다.

 

 

- 스트림

 

: 스트림은 데이터의 흐름을 뜻한다.

데이터 통신은 한 쪽 방향으로만 가능하기 때문에 FIFO 구조를 이루고 있다.

스트림의 종류는 다양하지만 크게 나누면 출력 단위가 1byte인 바이트기반 스트림과 문자단위(2byte)인 문자기반 스트림이 있다.

 

 

 

 

13-2. 바이트기반 스트림

 

:바이트단위로 데이터를 입출력하는 스트림이다.

 

 

- 바이트기반 스트림의 활용

 

바이트 단위로 입출력하기 때문에 1byte씩 읽어서 1byte씩 출력한다.

InputStream 과 OutStream 이 모든 바이트 기반 스트림의 조상이된다.

InputStream을 상속받는 스트림은 read() 추상 메서드를 구현하고 OutStream을 상속받는 스트림은 write() 추상 메서드를 구현한다.

 

 

InputStream OutStream
abstract int read() abstract void write(int b)
int read(byte[] b) void write(byte[] b)
int read(byte[] b, int off, int len) void write(byte[] b, int off, int len)

 

 

읽거나 출력할 대상에 따른 스트림

입력 스트림 출력 스트림 대상
FileInputStream FileOutStream 파일
PipedInputStream PipedOutStream 메모리
AudioInputStream AudioOutStream 오디오
ByteArrayInputStream ByteArrayOutStream 프로세스

 

 

 

스트림을 하고자고할 경우 인스턴스를 생성할 때 생성자의 인자로 데이터를 입력받거나 출력 받을 곳을 넘겨준 다음 적절한 메서드를 사용한다.

 

FileInputStream fis = null;
fis = new FileInputstream("읽어올 파일의 위치");
fis.read();

 

 

 

 

 

13-3. 바이트기반 보조 스트림

 

:바이트 기반 스트림의 성능을 향상시키는 역할을 하는 보조 스트림

 

 

 

- 바이트기반 보조 스트림의 활용

 

: 바이트기반 보조 스트림은 실제 입력 스트림을 도와서 성능을 향상시키는 역할을 한다.

 

 

입력 보조 스트림 출력 보조 스트림 사용
FileInpuStream FileOutputStream 필터를 이용한 입출력
BufferedInputStream BufferedOutputStream 버터를 통해 입출력
DataInputStream DataOutputStream 기본형 단위로 데이터 처리
없음 PrintStream print, printf, println

 

 

 

보조 스트림을 사용하는 방법은 데이터를 전송할 스트림을 선언 후 인자로써 보조 스트림의 생성자에 넣어준다. 

FileInputStream fis = null;
fis = new FileInputStream("파일 위치");
BufferedInputStream bis = new BufferedInputStream(fis);

 

* 모든 보조 스트림들은 다른 스트림들과 마찬가지로 InputStream 과 OutputStream의 자식으로 입출력방법이 같다.

입출력방법은 보조 스트림의 참조변수로 입출력한다.

 

 

 

 

exam-100

파일을 복사하는 프로그램

 

 

 

먼저 C드라이브 안의 dd 폴더에 prac 텍스트 파일을 저장한다.

 

 

 

 

파일을 복사하기 위한 코드를 작성한다.

 

package chapter13;

import java.io.*;
import java.io.IOException;

public class File01 {

	public static void main(String[] args) throws IOException {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		fis = new FileInputStream("C:\\dd\\prac.txt");  //절대경로
		fos = new FileOutputStream("result.txt");  //상대경로
		BufferedInputStream bis = new BufferedInputStream(fis);  
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		int data;
		while((data=fis.read()) != -1)
		{
				bos.write(data);
		}
				
		bos.close();
		bis.close();
				
	}

}

 

 

 

 

파일 실행 후 저장된 파일이 result라는 이름으로 저장된 것을 볼 수 있다.

 

이때,

fis = new FileInputStream("C:\\dd\\prac.txt"); 은 절대 경로로 경로를 정확하게 작성해준다.

fos = new FileOutputStream("result.txt"); 은 상대 경로로 기존 파일이 있는 위치를 기준으로 위치를 지정한다.

 

 

 

 

 

 

13-4. 문자기반 스트림

 

: 문자 기반 스트림은 16비트(2바이트)의 문자나 문자열을 읽고 쓰는 스트림이다.

 

 

 

- 문자 기반 스트림의 활용

 

Reader Writer
int read() void write(int c)
int read(char[] cbuf) void write(char[] cbuf)
abstract int read(char[] cbuf, int off, int len) abstract void write(char[] cbuf, int off, int len)
void write(String str)
void write(String str, int off, int len)

 

 

 

읽거나 출력할 대상에 따른 스트림

(InputStream에서 Reader로, OutputStrem에서 Writer로 바뀜)

 

입력스트림 출력스트림 대상
FileInputReader FileWriter 파일
PipedInputReader PipedWriter 메모리
CharArrayReader CharArrayWriter 프로세스

 

 

 

텍스트 파일을 읽어오고 싶을 때는 FileReader 스트림의 객체를 생성하여 읽어올 파일의 위치를 생성자의 인자로 넘긴다.

 

FileReader fr = null;
fr = new FileReader("파일 위치");

 

 

 

 

 

 

13-5. 문자기반 보조 스트림

 

: 문자기반 스트림의 성능을 향상시키는 역할을 한다.

 

 

 

 

- 문자 기반 보조 스트림의 활용

 

문자 기반 스트림 성능을 향상시키기 위한 보조 스트림

입력 보조 스트림 출력 보조 스트림 사용
FilterReader FilterWrtier 필터를 이용한 문자 입출력
BufferedReader BufferedWriter 버퍼를

 

 

 

보조 스트림을 사용할 경우 문자기반 스트림을 생성한 후 인자를 보조 스트림으로 넘겨준다.

 

 

FilterReader fr = null;
fr = new FileReader("파일 위치");
BufferedReader br = new BufferedReader(fr);

 

 

 

 

 

 

13-6. 스트림의 예외 처리

 

: 입출력의 모든 메서드는 IOException(입출력예외(파일이 없을 수 있기때문에 발생함))이 발생할 가능성이 있다.

그렇기 때문에 예외처리를 해야한다.

또한, 스트림의 오류 여부와는 상관 없이 반드시 닫아주기 위해 finally문에서 close() 메서드를 사용하는 것이 좋다.

 

 

 

 

exam-101

파일 복사 프로그램에 예외처리를 적용한 코드

 

package chapter13;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class File02 
{

	public static void main(String[] args) 
	{

		FileInputStream fis = null;
		FileOutputStream fos = null;
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		
		try {
			fis = new FileInputStream("C:\\dd\\prac.txt");
			fos = new FileOutputStream("result.txt");
			bis = new BufferedInputStream(fis);
			bos = new BufferedOutputStream(fos);
			int data;
			
			while((data=fis.read())!=-1) 
			{
				bos.write(data);
			}
		}
		catch(Exception e) 
		{
			e.printStackTrace();
		}
		finally 
		{
			
		}
		try 
		{
			bos.close();
			bis.close();
		}
		catch(IOException e) 
		{
			e.printStackTrace();
		}

	}

}

 

이전 100번에서 본 예시에서 예외처리를 추가로 하는 코드이다.

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import 코드를 간단하게 import java.io.* 코드로 바꾸어줄 수 있다.

 

.*은 안의 모든 클래스를 사용한다는 뜻이다.

 

 

 

 

public static void main(String[] args) 
	{

		FileInputStream fis = null;
		FileOutputStream fos = null;
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;

101예시에서 생성과 초기화를 따로한 모습을 볼 수 있다.

이렇게 따로 한 이유는 bos 등 변수를 나중에 사용할 수도 있기 때문이다.

 

쉽게 말해 try 안에 생성을 같이 하면 try 안에서만 사용할 수 있기 때문에 다른 함수에서는 사용할 수 없다.

중괄호 밖으로 못나온다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday