티스토리 뷰
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 안에서만 사용할 수 있기 때문에 다른 함수에서는 사용할 수 없다.
중괄호 밖으로 못나온다.
'코딩 > JAVA' 카테고리의 다른 글
[4주차 5일] 참조변수, 스태틱, 인스턴스 (0) | 2023.11.05 |
---|---|
[4주차 4일] Chapter 15. Java Newtwork Programming (1) | 2023.11.02 |
[4주차 3일] Chapter 12. 스레드 (1) | 2023.11.01 |
[4주차 2일] Chapter 12. 스레드 (0) | 2023.10.31 |
[4주차 2일] Chapter 11. 컬렉션 프레임웍 (1) | 2023.10.31 |
- Total
- Today
- Yesterday