티스토리 뷰
다른곳의 데이터를 가져 오는것을 입력이라 하고, 다른 곳으로 데이터를 내보내는 것을 출력이라고 한다.
프로그래밍적인 행동에서 직관적으로 표현하자면,
입력(Input) : 파일 읽기, 이미지나 동영상 불러오기
출력(output) : 파일 쓰기, 이미지나 동영상 내보내기
프로그램이 어느 대상으로부터 입·출력이 가능하도록 중간에서 장치역할을 해줄 녀석을 스트림(stream)이라 하는데,
자바에서는 이 스트림이란 장치가 이미 클래스로 제공하고 있다.
입·출력에 사용되는 기본 클래스는 1바이트 단위로 데이터를 전송하는 InputStream(입력 클래스)과
OutputStream(출력 클래스)이 있다.
InputStream,OutputStream 클래스는 추상 클래스로 추상 메서드를 갖고 있으며,
두 클래스를 상속받고 확장 및 구현한 FileIn·OutputStream, DataIn·OutputStream, BufferedIn·OutputStream 하위클래스들이 존재한다.
조금 더 헷갈릴 수 있는 FileInputStream과 FileOutputStream 작성을 위주로 작성하겠다.
1. FileInputStream , FileOutputStream
파일에 데이터를 바이트로 읽고 쓰는 클래스다.
우선 텍스트 파일을 하나 만들어서 적당한 글자를 삽입하고, 이 파일을 읽어오는 코드를 작성해보자.
'C드라이브'에 'JavaInOutTest' 폴더를 만들고 'text.txt'라는 텍스트 파일을 만들었다.
이제 만들어진 텍스트파일에 대한 출력 코드를 작성해보자.
public static void main(String[] args) { InputStream inputStream = null; try { inputStream = new FileInputStream("C:\\JavaInOutTest\\test.txt"); int data = 0; while(true) { try { data = inputStream.read(); }catch(IOException e) { e.printStackTrace(); } if(data == -1){ break; } System.out.println("data : " + data); } }catch(FileNotFoundException e) { e.printStackTrace(); }finally { try { if(inputStream != null) inputStream.close(); }catch(IOException e) { e.printStackTrace(); } } } |
FileInputStream클래스로부터 객체를 만들텐데, 이때 생성자의 파라미터를 경로.파일명으로 넣어주었다.
FileInputStream 클래스에는 문자열 뿐 아니라 File 객체를 받는 생성자를 오버로딩 해주었기 때문에
아래와 같이 써도 무방하다.
File file = new File("C:\\JavaInOutTest\\test.txt"); inputStream = new FileInputStream(file); |
read()는 우리가 저장한 텍스트 데이터를 1byte씩 읽어줄 메서드다.
while(true)라는 무한반복 작업안에 read()는 조건(data == -1)에 부합되지 않으면 무한 실행 될 것이고,
int형으로 선언된 data에 리턴값이 대입될 것이다.
무한반복에서 벗어나기 위한 조건이 왜 -1인지에 대해서는 read()의 주석문을 참고해보면 알 수가 있다.
- If no byte is available because the end of the stream has been reached, the value
-1
is returned.
실행 결과를 살펴보자.
??????
텍스트파일에 저장되 있는 데이터는 'java test' 인데 왜 이런 결과가 나올까?
우선 개행된 'data : ' 출력문이 몇번 반복하였는지 보자.
9번 반복했다.
'java test' 는 몇 글자 인가?
공백을 포함하여 9글자다.
1바이트씩 잘 갖고 온거 같다.
결과가 숫자로 찍힌 이유는 read()의 리턴값은 반드시 byte의 표현범위의 정수값(0~255)을 가지며
아스키코드로 저장되기 때문이다.
아스키코드로 j를 10진수로 표현하면 106이 되고, a를 10진수로 표현하면 97이 된다.
read()의 주석문을 참고바란다.
- Reads the next byte of data from the input stream. The value byte is returned as an
int
in the range0
to255
.
* 아스키 코드에 대한 참고 자료
https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C
출력에 read()를 사용했다면, 입력은 write()를 사용한다.
코드를 통해 'C:\\JavaInOutTest' 경로에 'text.2txt'라는 텍스트 파일을 생성해보자.
public static void main(String[] args) { OutputStream outputStream = null;
try { outputStream = new FileOutputStream("C:\\JavaInOutTest\\test2.txt"); String data = "new test java"; byte[] arr = data.getBytes();
try { outputStream.write(arr); }catch(IOException e) { e.printStackTrace(); } }catch(FileNotFoundException e) { e.printStackTrace(); }finally { try { if(outputStream != null) outputStream.close(); }catch(IOException e) { e.printStackTrace(); } } } |
FileOutputStream 객체를 생성하여, 텍스트 데이터를 담는 변수의 byte수를 가져온후
write()안에 파라미터로 전달하면 된다.
컴파일 결과 아래와 같이 텍스트 파일과 데이터가 생성된다.
2. DataInputStream , DataOutputStream
byte단위의 입출력을 개선해서 문자열을 좀 더 편리하게 다룰 수 있도록 만들어진 클래스다.
다양한 자료형들을 바이트 단위로 분해하여 쓰고, 이를 다시 자료형별로 복원하여 읽는 기능을 수행한다.
3. BufferedInputStream , BufferedOutputStream
입력스트림에 버퍼를 추가한 필터 스트림으로, 버퍼가 추가될 경우 1바이트씩 읽지않고 한번에
많은 데이터를 미리 버퍼에 읽어 놓고 다음번 호출시 데이터 소스로부터 데이터를 읽지않고
메모리상의 버퍼에서 바로 읽어 효율이 좋음.
-----------------------------------------------------------------------
+
BufferedReader , BufferedWriter
Stream 클래스의 자손이 아닌 Reader클래스에서 만들어진 클래스들이다.
Stream이 byte 단위로 데이터를 처리하는 반면, Reader 클래스는 char 단위로 데이터를 처리 할 수 있도록
메서드를 제공하고 있다.
문자 입력 스트림으로부터 문자를 읽어 들이거나 문자 출력 스트림으로부터 문자를 내보낼때 버퍼링을 함으로써
문자, 문자 배열, 문자열 라인 등을 보다 효율적으로 처리 할 수 있다.
일반적인 텍스트 처리에 가장 많이 사용 된다.
'Language > Java' 카테고리의 다른 글
Swing 컴포넌트를 이용한 카페 주문 관리 #1 (0) | 2018.09.06 |
---|---|
네트워킹 (0) | 2018.09.05 |
예외처리 (0) | 2018.09.04 |
Collections (0) | 2018.09.03 |
문자열 클래스 (0) | 2018.09.03 |