Post

[JAVA] 패키지와 스트림

입출력 스트림

  • Java 프로그램에서 입출력을 수행하기 위한 스트림
    • 입력 스트림은 데이터 생산자(소스)와 프로그램을 연결
    • 출력 스트림은 프로그램과 소비자(목적지)를 연결
  • 입출력 종류(파일, 주변 장치, 네트워크 소켓 등)에 상관없이 동일한 방법으로 프로그램 작성
  • 입출력 스트림 클래스는 java.io 패키지에서 제공함

스트림의 정의와 특성

  • 데이터 생산자/소비자와 프로그램 사이의 데이터 흐름
  • 순서가 있는 일련의 데이터 흐름으로, 정해진 방향으로 전달되며 순차적으로 접근 가능

스트림의 분류

바이트 스트림과 캐릭터 스트림

  • 바이트 스트림
    • byte 단위로 데이터를 다룸
    • 관련 클래스: ~InputStream, ~OutputStream
  • 캐릭터 스트림
    • char 단위로 데이터를 다룸
    • 관련 클래스: ~Reader, ~Writer

기본 스트림과 보조 스트림

  • 기본 스트림
    • 기본 입출력 기능을 제공하는 스트림
  • 보조 스트림
    • 자체적으로 입출력 기능을 수행할 수 없으며, 기본 스트림과 함께 사용되어 보조 기능을 제공하는 스트림
    • 기본 스트림 객체를 먼저 생성하고, 기본 스트림을 인자로 사용하여 보조 스트림 객체를 생성함
1
2
FileInputStream fis = new FileInputStream("text.txt");
BufferedInputStream bis = new BufferedInputStream(fis);

스트림 관련 클래스

  입력 스트림출력 스트림
기본 스트림바이트 스트림InputStream
FileInputStream
ByteArrayInputStream
OutputStream
FileOuputStream
ByteArrayOuputStream
 문자 스트림Reader
FileReader
CharArrayReader
StringReader
Writer
FileWriter
CharArrayWriter
StringWriter
보조 스트림바이트 스트림BufferedInputStream
DataInputStream
ObjectInputStream
BufferedOutputStream
DataOutputStream
ObjectOutputStream
PrintStream
 문자 스트림BufferedReaderBufferedWriter
PrintWriter
 기타 스트림InputStreamReaderOutputStreamWriter

바이트 스트림과 캐릭터 스트림

InputSream 클래스

  • 바이트 단위 입력 스트림 클래스 중 최상위 추상 클래스
  • 하위 클래스는 ~InputStream
메소드설명
abstract int read()입력 스트림으로부터 1 바이트를 읽어 정수로 리턴함
int read(byte[] b)입력 스트림으로부터 읽어서 byte 배열에 저장하고 읽은 바이트 개수를 리턴함
int read(byte[] b, int off, int len)입력 스트림으로부터 len 바이트를 읽어서 바이트 배열의 off 위치부터 저장하고 읽은 바이트 개수를 리턴함
int available()다음 read()할 때, 블로킹 없이 입력 스트림에서 읽을 수 있는 바이트 단위의 데이터 길이를 리턴함
long skip(long n)입력 스트림에서 n 바이트를 건너뛰고 건너뛴 문자 수를 리턴함
void mark(int readlimit)입력 스트림에서 현재 위치를 표시함
void reset()mark()에서 표시된 위치로 스트림의 현재 위치를 이동

OutputStream 클래스

  • 바이트 단위 출력 스트림 클래스 중 최상위 추상 클래스
  • 하위 클래스는 ~OutputStream
메소드설명
abstract void write(int b)1byte 데이터를 출력 스트림에 씀
void write(byte[] b)byte형 배열 b의 모든 바이트를 출력 스트림에 씀
void write(byte[] b, int off, int len)byte형 배열 b의 off 위치부터 len 바이트를 출력 스트림에 씀
void close()출력 스트림을 닫고 자원을 돌려줌
void flush()출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄

Reader 클래스

  • 캐릭터 단위 입력 스트림 클래스 중 최상위 추상 클래스
  • 하위 클래스는 ~Reader
메소드설명
int read()입력 스트림에서 1개 문자(2바이트)를 읽어 리턴함
int read(char[] cbuf)입력 스트림에서 문자들을 읽어 char형 배열 cbuf에 저장하고, 읽은 문자의 개수를 리턴함
boolean ready()입력 스트림에 입력 데이터가 준비되었으면 true를 리턴함
abstract void close()입력 스트림을 닫고 자원을 반환함

Writer 클래스

  • 캐릭터 단위 출력 스트림 클래스 중 최상위 추상 클래스
  • 하위 클래스는 ~Writer
메소드설명
void write(int c)1개 문자(2바이트)를 출력 스트림에 씀
void write(char[] cbuf)char형 배열 cbuf의 모든 문자를 출력 스트림에 씀
void write(String str)문자열 str을 출력 스트림에 씀
void write(String str, int off, int len)문자열 str의 off 위치부터 len개의 문자를 출력 스트림에 씀
abstract void close()출력 스트림을 닫고 자원을 반환함
void flush()출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄

파일 입출력

File 클래스

  • 파일이나 디렉터리를 표현하는 클래스
  • 파일이나 디렉터리의 정보 조회 또는 조작 기능을 제공
    • 이름과 경로 조회
    • 파일과 디렉터리의 생성 및 삭제
  • 입출력 메소드는 제공되지 않음
  • 생성자
    • new File(String pathname)
    • pathname은 상대 경로 또는 절대 경로
1
2
File myFile1 = new File("D:\\eclipse\\workspace\\Text\\src");
File myFile2 = new File("notepad.exe");
메소드설명
boolean exists()File 객체로 표현된 것이 실제 파일 또는 디렉터리로 존재하는지 여부
boolean isDirectory()File 객체에 지정된 경로가 디렉터리인지 여부
boolean isFile()File 객체에 지정된 경로가 파일인지 여부
String getName()파일 또는 디렉터리의 이름을 리턴함
String getPath()경로 전체를 리턴함
long length()파일인 경우, 크기를 바이트 단위로 리턴함
boolean createNewFile()File 객체에 지정된 파일을 생성함
boolean delete()File 객체에 지정된 파일이나 (비어있는 디렉터리인 경우) 디렉터리를 삭제함
boolean mkdir()File 객체에 지정된 것을 디렉터리로 만듦
맨 마지막 디렉터리만 생성할 수 있음
boolean mkdirs()위와 같으나 지정된 경로상의 모든 필요한 디렉터리를 생성
String[] list()File 객체에 지정된 디렉터리 안에 포함된 파일과 디렉터리의 이름을 문자열 배열로 리턴함
File[] listFiles()위와 같으나 File 객체의 배열로 리턴함
String getParent()상위 디렉터리 이름을 문자열로 리턴함
File getParentFile()상위 디렉터리를 File 객체로 리턴함
static File[] listRoots()파일 시스템에 존재하는 루트 디렉터리를 File 객체의 배열로 리턴함

예제: 디렉터리 내용 보기

1
2
3
4
5
6
7
8
File file = new File("c:\\windows");
File files[] = file.listFiles();
int i = 0;
while (i < files.length) {
  System.out.print(files[i].getPath());
  System.out.println("\t" + files[i].length);
  i++;
}

RandomAccessFile 클래스

  • 파일 포인터가 가리키는 임의의 위치에 읽기/쓰기 가능
  • byte 단위로 읽고 쓰며, 읽거나 쓸 때 파일 포인터가 이동함
  • 랜덤 액세스 파일을 byte 배열로 볼 수 있음
  • 생성자
    • RandomAccessFile(File file, String mode)
    • RandomAccessFile(String name, String mode)
    • mode는 읽기 전용의 “r” 또는 읽기/쓰기의 “rw”
메소드설명
int read()파일로부터 1 바이트를 읽어 정수로 리턴함
int read(byte[] b)파일로부터 읽어서 byte 배열에 저장하고 읽은 바이트 개수를 리턴함
int read(byte[] b, int off, int len)파일로부터 len 바이트를 읽어서 바이트 배열의 off 위치부터 저장하고 읽은 바이트 개수를 리턴함
void seek(long pos)pos에 지정된 위촐 파일 포인터를 이동함
void write(byte[] b)byte 배열의 내용을 파일에 씀
void write(byte[] b, int off, int len)byte 배열에서 off 위치부터 len 바이트를 파일에 씀

예제: RandomAccessFile 클래스를 이용하여 파일 쓰고 읽기

1
2
3
4
5
6
7
8
9
10
11
try (RandomAccessFile raf = new RandomAccessFile("c:\\java\\text.tsx", "rw")) {
  for (int i = 0; i < 10; i++)
    raf.write(i);
  for (int i = 9; i >= 0; i--) {
    raf.seek(i);
    System.out.print(raf.read());
  }
  raf.close();
} catch (Exception e) {
  System.out.println(e);
}

FileInputStream과 FileOutputStream 클래스

  • byte 단위로 파일을 읽기/쓰기 위한 입출력용 기본 스트림
  • 바이트 단위의 입출력을 처리하므로 이미지나 오디오 파일 같은 이진 파일을 다룰 때 유용함
  • FileInputStream 클래스의 생성자
    • FileInputStream(String name)
    • FileInputStream(File file)
  • FileOutputStream 클래스의 생성자
    • FileOutputStream(String name)
    • FileOutputStream(File file, boolean append)

예제: FileInputStream과 FileOutputStream 클래스 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
File inFile = new File("c:\\Java\\Main.java");
File outFile = new File("c:\\Java\\FileTemp.java");
try (InputStream is = new FileInputStream(inFile);
    OutputStream os = new FileOutputStream(outFile)) {
      int nData;
      nData = is.read();
      while (nData != -1) {
        os.write(nData);
        nData = is.read();
      }
} catch (Exception e) {
  System.out.println(e);
}

FileReader와 FileWriter 클래스

  • char 단위로 파일을 읽거나 쓰기 위한 입출력용 기본 스트림
  • 문자 단위의 입출력을 처리하므로 텍스트 파일을 다룰 때 유용함
  • FileReader 클래스의 생성자
    • FileReader(String fileName)
    • FileReader(File file)
  • FileWriter 클래스의 생성자
    • FileWriter(String fileName)
    • FileWriter(File file)
    • FileWriter(File file, boolean append)

콘솔 입출력 스트림

Console 클래스

  • 콘솔 입출력을 제공하는 클래스
  • 키보드 입력과 화면 출력을 지원
  • 명령 프롬프트 창과 같은 콘솔 환경에서 사용자와의 상호작용을 지원
  • System.console()을 사용하여 콘솔 객체를 생성함
메소드설명
String readLine()콘솔에서 한 라인을 읽어 리턴함
char[] readPassword()콘솔에서 비밀번호를 읽어 리턴함
PrintWriter writer()콘솔과 연결된 PrintWriter 객체를 리턴함
Reader reader()콘솔과 연결된 Reader 객체를 리턴함

예제: Console 클래스를 이용한 입출력

1
2
3
4
5
6
7
8
9
10
11
String name;
char[] pw;
Console con = System.console();

System.out.print("name: ");
name = con.readLine();
System.out.print("password: ");
pw = con.readPassword();

con.printf("name: %s\n", name);
con.printf("password: %s\n", new String(pw));

보조 스트림

  • 기본 스트림의 성능이나 편의성을 높이는 보조 기능을 제공하는 스트림
  • 입출력 기능은 기본 스트림을 이용해야 함
  • 기본 스트림 객체를 먼저 생성하고, 이것을 보조 스트림 객체 생성자의 인자로 이용함
    • 기본 스트림을 보조 스트림으로 감싼다고 표현함
    • 프로그램에서는 보조 스트림 객체를 이용하여 입출력하면 됨

보조 스트림의 종류

  • 버퍼링 기능
    • BufferedInputStream, BufferedOutputStream
    • BufferedReader, BufferedWriter
  • Java의 기본 자료형을 그대로 읽기/쓰기 위한 기능
    • DataInputStream, DataOutputStream
  • 다양한 출력 형식 제공
    • PrintStream, PrintWriter
  • 텍스트 파일을 라인 단위로 읽거나 라인 번호를 관리하는 메소드 제공
    • LineNumberReader
  • 바이트 스트림과 캐릭터 스트림의 호환
    • InputStreamReader, OutputStreamWriter

LineNumberReader 클래스

  • 텍스트 파일을 라인 단위로 읽는 메소드 제공
  • BufferedReader의 서브 클래스
메소드설명
int read()입력 스트림으로부터 1개 문자(2바이트)를 리턴함
개행 문자(\n)를 만나면 라인 번호를 증가시킴
String readLine()입력 스트림으로부터 한 라인을 읽어 리턴하고 라인 번호를 증가시킴
int getLineNumber()현재 라인의 번호를 리턴함
long skip(long n)입력 스트림에서 n개의 문자를 건너뛰고 건너뛴 문자 수를 리턴함

InputStreamReader 클래스

  • 바이트 입력 스트림을 캐릭터 입력 스트림으로 변환해 주는 클래스
  • 특정 문자 인코딩을 사용하여 변환할 수 있음
  • 생성자
    • InputStreamReader(InputStream in, Charset cs)
1
2
3
4
5
6
7
try (InputStreamReader isr = new InputStreamReader(System.in, "euc-kr")) {
  while ((i = isr.read()) != '끝') {
    System.out.print((char) i);
  }
} catch (Exception e) {
  System.out.println(e);
}
This post is licensed under CC BY 4.0 by the author.