티스토리 뷰

Language/Java

입력과 출력

kalza 2018. 9. 5. 14:14

다른곳의 데이터를 가져 오는것을 입력이라 하고, 다른 곳으로 데이터를 내보내는 것을 출력이라고 한다.

프로그래밍적인 행동에서 직관적으로 표현하자면, 


입력(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 range 0 to 255.



* 아스키 코드에 대한 참고 자료

 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함