728x90
입력 스트림과 출력 스트림
- 프로그램을 기준으로 데이터가 들어오면 입력 스트림, 데이터가 나가면 출력 스트림
- 프로그램이 다른 프로그램과 데이터를 교환하려면 양쪽 모두 입력 스트림과 출력 스트림이 필요합니다.

- 바이트 스트림 : 그림, 멀티미디어, 문자등 모든 종류의 데이터를 입출력 할때 사용
- 문자 스트림 : 문자만 입출력 할때 사용
자바는 데이터 입출력과 관련된 라이브러리를 java.io (input/output)패키지에서 제공합니다.

- 바이트 입출력 스트림의 최상위 클래스는 InputStream과 OutputStream 입니다.
- 문자 입출력 스트림의 최상위 클래스는 Reader와 Writer 입니다.

OutputStream
- OutputStream은 바이트 출력 스트림의 최상위 클래스로, 추상 클래스 입니다.
- 모든 바이트 출력 스트림 클래스는 이 OutputStream 클래스를 상속 받아서 만들어 집니다.

- OutputStream 클래스에는 모든 바이트 출력 스트림이 기본적으로 가져야 할 메소드가 정의 됩니다.

1바이트 출력
- write(int b) 메소드 : 매개값 int (4byte) 에서 끝 1byte 만 출력. 매개변수는 int 타입입니다.

WriteExam.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class writeExam {
public static void main(String[] args) throws IOException {
OutputStream os = null;
try {
os = new FileOutputStream("C:/Temp/test1.db");
byte a = 10;
byte b = 20;
byte c = 30;
os.write(a); //1 byte 씩 출력
os.write(b);
os.write(c);
}catch (IOException e) {
e.printStackTrace();
}finally {
os.flush(); // 내부 버퍼에 잔류하는 바이트를 출력 후 버퍼 비우기
os.close(); // 출력 스트림을 닫아 사용한 메모리를 해제합니다.
}
}
}
결과 :
C:/Temp/test1.db 파일 생성.(실행 전에 C:/Temp 디렉토리가 존재해야 합니다.)
tip)
FileOutputStream 생성자는 주어진 파일을 생성할 수 없으면 IOException을 발생 시킵니다.
write(), flush(), close() 메소드도 IOException이 발생할 수 있으므로 예외 처리를 해야 합니다.
바이트 배열 출력
- write(byte[] b) 메소드 : 매개값으로 주어진 배열의 모든 바이트를 출력합니다
- 배열의 일부분을 출력하려면 write(byte[] b, int off, int len) 메소드를 사용합니다.

writeExam2.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class WriteExam2 {
public static void main(String[] args) {
try {
OutputStream os = new FileOutputStream("c:/Temp/test2.db");
// byte[] array = {10, 20, 30};
byte[] array = {10, 20, 30, 40, 50};
// os.write(array);
os.write(array, 1, 3); //array index[1]부터 3개를 출력 할것.
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
결과:
c:/Temp/test2.db 파일 생성
InputStream
- InputStream은 바이트 입력 스트림의 최상위 클래스로, 추상클래스 입니다.
- 모든 바이트 입력 스트림은 InputStream 클래스를 상속받아 만들어 집니다.

- InputStream 클래스에는 바이트 입력 스트림이 기본적으로 가져야 할 메소드가 정의됩니다.

1바이트 입력
- read() 메소드 : 입력 스트림으로 부터 1byte를 읽고 int(4byte) 타입으로 리턴합니다. 리턴된 4byte 중 끝 1byte 에만 데이터가 들어가 있습니다.

- 더 이상 입력 스트림으로 부터 바이트를 읽을수 없다면 read() 메소드는 -1 을 리턴합니다.
- 읽을수 있는 마지막 바이트까지 반복해서 한 바이트씩 읽을 수 있습니다.

ReadExam.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class ReadExam {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("c:/Temp/test1.db");
while(true) {
int data = is.read();
if(data == -1) break; //파일 끝에 도달했을때.
System.out.println(data);
}
is.close(); // 입력 스트림을 닫고 사용 메모리 해제
}catch(FileNotFoundException e) {
e.printStackTrace(); // 파일이 없을때 예외 처리
}catch(IOException e) {
e.printStackTrace(); // 파일을 읽어 들일때 예외처리
}
}
}
결과 :
10
20
30
바이트 배열로 읽기
- read(byte[] b) 메소드 : 입력 스트림으로 부터 주어진 배열의 길이만큼 바이트를 읽고 배열에 저장한 다음, 읽은 바이트 수를 리턴합니다.
- read(byte[] b)도 입력 스트림으로 부터 바이트를 더이상 읽을수 없다면 -1을 리턴합니다. 읽을 수 있는 마지막 바이트 까지 반복해서 읽을수 있습니다.


ReadExam2.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class ReadExam2 {
public static void main(String[] args) {
try {
//데이터 출발지를 test2.db 로 하는 입력 스트림 생성
InputStream is = new FileInputStream("c:/Temp/test2.db");
byte[] data = new byte[100]; // 최대 100byte의 읽은 바이트를 저장할 배열을 생성합니다.
while(true) {
int num = is.read(data); // read해서 파일의 내용을 data 배열에 담습니다.
if(num==-1) break;
for(int i = 0; i<num; i++) {
System.out.println(data[i]);
}
}
is.close(); // 입력스트림 닫기
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}
결과 :
10
20
30
파일 복사 예제
CopyExam.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyExam {
public static void main(String[] args) throws Exception{
String originalFileName = "c:/Temp/test.jpg";
String targetFileName = "c:/Temp/test2.jpg";
InputStream is = new FileInputStream(originalFileName);
OutputStream os = new FileOutputStream(targetFileName);
byte[] data = new byte[64]; //한번에 작업할 최대 바이트수를 설정합니다.
//최대 바이트수가 작을수록 속도가 저하됩니다.
//cpu성능이 좋을수록 최대 바이트수를 크게 설정할수 있습니다.
while(true) {
int num = is.read(data); //파일 읽기
if(num == -1) break;
os.write(data, 0, num); //파일 쓰기
}
os.flush();
os.close();
is.close();
System.out.println("복사가 잘 되었습니다.");
}
}
728x90
'JAVA > Java 기초' 카테고리의 다른 글
| 요소 커스텀 집계.java (0) | 2023.01.30 |
|---|---|
| 입출력 스트림-2.java (0) | 2023.01.30 |
| Optional 클래스.java (0) | 2023.01.30 |
| 루핑, 매칭, 집계.java (0) | 2023.01.30 |
| 정렬. java (0) | 2023.01.30 |