[JAVA] I/O

케이·2023년 1월 15일
2

JAVA

목록 보기
17/17
post-thumbnail

학습한 내용을 정리한 포스팅입니다. 틀린 내용이 있다면 지적해주시면 감사하겠습니다 🙇🏻‍♀️

스트림

스트림(stream)은 데이터의 연속적인 흐름 또는 데이터의 시퀀스라고 정의할 수 있다. 스트림은 Input/Output을 다루는 확실한 방법으로 스트림은 아래처럼 두 가지 타입이 있다.

https://media.geeksforgeeks.org/wp-content/uploads/20210119084545/Stream.png

그렇다면 Byte Stream이란? Byte Stream은 byte의 input/output을 쉽게 처리할 수 있도록 해준다. Byte Stream은 InputStream과 OutputStream으로 나뉜다.

InputStream과 OutputStream

(InputStream과 OutputStream은 위의 스트림 항목의 첫번째 다이어 그램에서 Byte Stream에 속한다.)

InputStream

InputStream은 Byte Stream의 추상 클래스로 stream input을 나타내고 file, image, audio, video, webpage 등을 읽는데 사용된다. InputStream은 한번에 한가지 아이템 소스의 데이터를 읽는다.

다음과 같은 메서드들을 갖는다.

  • Read next byte of data from the input stream and return -1 at the end of the file: public abstract int read()throws IOException
    -
    Close current InputStream: public int available()throws IOException
    -
    Returns an estimate of the number of bytes that can be read from the current input stream: public void close()throws IOException

InputStream의 종류에는 FileInputStream, ByteArrayInputStream, FilterInputStream, ObjectInputStream이 있다. 가장 많이 사용되는건 FileInputStream이다.

예제

sample.txt 안에 “HELLOWORLD”라고 텍스트가 저장되어 있다고 하자.

FileInputStream fileIn=new FileInputStream("C:\\sample.txt");

import java.io.FileInputStream;
  
public class InputStreamExample {
    public static void main(String args[])
    {
        // 텍스트 파일 읽어오기
        try {
            FileInputStream fileIn
                = new FileInputStream("sample.txt");
            int i = 0;
            while ((i = fileIn.read()) != -1) {
                System.out.print((char)i);
            }
            fileIn.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

Output:

OutputStream

OutputStream 또한 Byte Stream의 추상 클래스로 stream output을 나타내고 file, image, audio, video, webpage 등 데이터를 쓰는데 사용된다. OutputStream은 한번에 지정된 한 곳에만 데이터를 쓴다.

다음과 같은 메서드들을 갖는다

  • Write a byte to current Outputstream : public void write(int)throws IOException
  • Write array of byte to current output stream : public void write(byte[])throws IOException
  • Flushes the current OutputStream: public void flush()throws IOException
  • Close current Output Stream. : public void close()throws IOException

OutputStream에는 FileOutputStream, ByteArrayStream, FilterOutputStream, ObjectOutputStream이 있다. 가장 많이 사용되는 건 FileOutputStream이다.

예제

sample2.txt는 안에 내용이 없는 비어 있는 파일이다. 해당 파일에 “file is successfully updated”를 outputstream을 사용해서 입력한다. 입력 후 InputStream을 사용해 sample2.txt의 내용을 확인한다.

콘솔에서 볼 수 있듯이 파일이 업데이트 되었다는 문구 + sample2.txt의 내용이 입력된 것을 확인할 수 있다.

Byte와 Character 스트림

Character Stream

자바에서 character는 유니코드 컨벤션에 따라 저장된다. Character Stream은 character데이터를 읽고 쓸 수 있게 해준다. 예를 들어 FileReader와 FileWriter는 소스를 읽고 쓸 수 있는 Character Stream이다.

https://media.geeksforgeeks.org/wp-content/uploads/20220118112347/Stream.jpg

Byte Stream

Byte Stream은 byte 데이터를 처리한다. 예를 들어 FileInputStream은 소스를 읽고 FileOutputStream은 destination에 쓴다.

표준 스트림 (System.in, System.out, System.err)

표준 입출력은 콘솔을 통한 데이터 입력과 콘솔로의 데이터 출력을 의미한다. 자바에서는 표준 입출력을 위해 3가지 입출력 스트림, System.in, System.out, System.error를 제공하는데 이들은 자바 어플리케이션 실행과 동시에 자동으로 생성되어 개발자가 별도로 생성하는 코드를 작성하지 않고 사용이 가능하다.

System.out: 표준출력, 콘솔로 데이터를 출력시킨다.
System.in: 표준입력, 콘솔로부터(키보드) 데이터 입력을 받는다.
System.error: 표준에러, 콘솔로 데이터를 출력.

System 클래스를 열어보니 in, out, err의 타입은 InputStreram과 OutputStream이지만

실제로는 버퍼를 이용하는 BufferedInputStream과 BufferedOutputStream의 인스턴스를 사용한다.

파일 읽고 쓰기

자바에서 파일을 읽고 쓰기 위해서는 자바에서 제공하는 FileWriter, FileReader, BufferedReader, BufferedWriter를 사용하면 가능하다.

해당 클래스들을 사용해서 파일을 쓰고 읽도록 해보았다.

  1. "filetest.txt" 파일을 만들고 “파일테스트” 라는 내용을 저장한다.
  2. 해당 파일이 존재하는지 확인한다.
  3. "filetest.txt" 파일의 내용을 읽는다.

참고

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

3개의 댓글

comment-user-thumbnail
2023년 1월 15일

잘 봤어요 케이!

본문 내용 중
System.out: 표준출력, 콘솔로부터(키보드) 데이터 입력을 받는다.
System.in: 표준입력, 콘솔로 데이터를 출력시킨다.

해당하는 부분에서 콘솔로부터 데이터 입력 <-> 출력 내용이 바뀐 거 같아요.?

1개의 답글
comment-user-thumbnail
2023년 1월 15일

안녕하세요. 안녕히계세요.

답글 달기