Stream 의 개념
stream이란 데이터를 운반하는데 사용되는 연결 통로
자바에서 입출력을 수행하려면 스트림이 필요하다.
스트림을 통해 데이터가 입력(inputStream)이 되고 출력(OutputStream)이 된다.
inputStream: 입력장치로부터 자바 프로그램으로 데이터를 전달하는 소프트웨어 모듈
outputStream: 자바 프로그램에서 출력 장치로 데이터를 보내는 소프트웨어 모듈
자바 입출력 스트림의 특징
- 단방향 : 한쪽 방향으로만 입력되고 출력이 됨
- FIFO(First In First Out) : 먼저 입력된 것이 먼저 출력이 됨.
- 스트림은 바이트(byte)단위로 데이터를 전송한다
위와 같이 여러 종류의 입출력 스트림이 있으며,
어떠한 대상에 대해서 작업을 할 것인지 그리고 입력을 할건지 출력을 할 것인지에 따라 해당 스트림 선택하여 사용
(이들은 모두 InputStream 또는 OutputStream의 자손들)
java의 입출력 관련 클래스는 java.io 패키지에 존재함.
==> 해당 패키지에 있는 클래스들을 이용하여 파일을 입출력함
IO Stream(input/Output Stream(입출력 스트림)) 의 종류
바이트 스트림
- 입출력 되는 데이터를 단순 바이트의 스트림으로 처리
- 1byte 단위 이다.
- 영상이나 음악을 처리할때 바이트 스트림을 이용
ex) binary 파일을 읽는 입력 스트림
문자 스트림
- 문자만 입출력 하는 스트림
- 문자가 아닌 binary 데이터는 스트림에서 처리하지 못함
- 2byte 단위 통로이다.
ex) 텍스트 파일을 읽는 입력 스트림
- 영어 abc는 문자이긴 하나 1단어당 1byte여서 바이트 입출력 스트림을 이용해도 된다.
- 단 한글은 2byte여서 무조건 문자 입출력 스트림만 사용 할수 있다.
File 클래스
- 파일 및 디렉토리(폴더)를 만들어 주는 클래스
- 파일 입출력 시에 사용이 됨.
- 파일 디렉토리에 대한 경로명, 크기, 타입, 수정 날짜 등의 속성을 제공함
또한 파일 삭제, 디렉토리 생성, 파일 이름 변경, 디렉토리 내의 파일 리스트 제공 등 다양한 파일 관리 작업을 지원함.
1. FileInputStream / FileOutputStream
- 1바이트 단위로 파일을 처리하는 바이트 기반 입출력 스트림
- 그림(이미지), 오디오 파일 등 모든 종류의 파일 처리가 가능.
2. FileReader / FileWriter
- 2바이트 단위로 파일을 처리하는 문자 기반 입출력 스트림
- 문자 단위로 처리를 하기 때문에 그림, 오디오 파일들은 처리가 불가능.
system.in과 read() 예제
import java.io.IOException;
public class Ex01 {
public static void main(String[] args) {
System.out.println("한 문자를 입력하세요...");
// system.in : 표준입력장치(키보드)
// read() : 표준입력장치를 통해서 입력받은 데이터를 읽게 됨. 읽으면 ASCII코드(숫자)로 반환됨.
try {
int num = System.in.read();
System.out.println("읽어온 데이터(ASCII) >>> " + num);
System.out.println("읽어온 데이터(문자) >>> " + (char)num);
} catch (IOException e) {
e.printStackTrace();
}
}
}
system.in : 표준입력장치(키보드)
read() : 표준입력장치를 통해서 입력받은 데이터를 읽게 됨.
바이트 스트림에 속해 있어서 1byte만 을 입력 받는다. 읽으면 ASCII코드(숫자), 즉 정수형으로 반환됨
(*read()의 반환타입이 byte가 아니라 int인 이유는 반환값의 범위가 0~255와 -1이기 때문.
※ 자바에서 byte 타입이 표현할 수 있는 범위는 -128부터 127까지)
실행 시 엔터(enter)를 치면
한 문자를 입력하세요...
읽어온 데이터(ASCII) >>> 13
읽어온 데이터(문자) >>>
엔터의 아스틱코드인 13이 출력되며,
A를 치면
한 문자를 입력하세요...
A
읽어온 데이터(ASCII) >>> 65
읽어온 데이터(문자) >>> A
A(대문자 a)의 아스틱코드인 65가 출력된다.(소문자 a의 경우 97이 출력)
FileInputStream 예제
C:\test\test1.txt
abcde
package sist;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class Ex01 {
public static void main(String[] args) {
InputStream is = null;
// read()메서드로 받은 값을 저장할 변수 선언
int readByte;
try {
// FileInputStream : 어떤 파일의 내용을 읽고자 하는 경우 사용
is = new FileInputStream("C:/test/test1.txt");
while(true) { // 무한반복
// read() 사용시 더 이상 읽을 데이터가 없으면 read() 메소드는 -1값을 반환함
readByte = is.read();
// 더이상 읽을 데이터가 없으면 while문 탈출
if(readByte == -1) {
break;
}
System.out.println((char)readByte);
}
// 연결 해제
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
FileInputStream : 어떤 파일의 내용을 읽고자 하는 경우 사용
read() 메서드 사용시 더 이상 읽을 데이터가 없으면 -1값을 반환함.
이때 InputStream을 연 후 파일을 읽고 마무리 후에는 Stream을 닫는 흐름을 일반적으로 가져가게 되는데,
이런 흐름에서 예외(exception)가 발생할 수 있는 위치는 InputStream을 열때, 파일을 읽을 때, InputStream을 닫을 때 총 3군데 이므로 try~catch문을 사용하여 예외처리를 한다.
a
b
c
d
e
아스틱코드로 반환된 readByte를 다시 (char)로 형변환하여 출력
println 구문이므로 한 문자씩 출력하고 다음줄로 넘어간다.
C:\test\test2.txt
abcde
package sist;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class Ex02 {
public static void main(String[] args) throws Exception{
InputStream is = new FileInputStream("C:/test/test2.txt");
// read()메서드로 받은 값을 저장할 변수 선언
int readByte;
byte[] bytes = new byte[3];
String data = "";
while(true) {
readByte = is.read(bytes);
if(readByte == -1) {
break;
}
System.out.println(readByte);
// byte배열을 문자열로 바꾸어 String 객체를 생성
data += new String(bytes, 0, readByte);
} // while문 end
System.out.println(data);
is.close();
}
}
String(byte[] bytes, int offset, int length)
byte배열, 스트링시작위치(offset), 스트링길이(length)를 지정하여 String 객체를 생성
3
2
abcde
'Back-End > Java' 카테고리의 다른 글
[Java] Swing - JComboBox, JList, JLable, JTextField, JTable, JTabbedPane, JMenu, ETC (0) | 2021.09.29 |
---|---|
[Java] GUI(AWT, Swing) - JFrame, JButton, JCheckBox, JRadioButton, JToggleButton (0) | 2021.09.29 |
[JAVA] 컬렉션 프레임워크(Collection Framework) - Map (0) | 2021.09.17 |
[JAVA] 컬렉션 프레임워크(Collection Framework) - Set (0) | 2021.09.17 |
[JAVA] 컬렉션 프레임워크(Collection Framework) - Stack, Queue (0) | 2021.09.17 |
댓글