예외처리 방법
예외 처리 방법1) finally로 예외 처리
- 예외 처리 구문과 상관 없이 반드시 수행해야 하는 경우 작성
- (보통 사용한 자원을 반납할 목적)
예외 처리 방법2) try~with~resource로 예외 처리
- 자바7에서 추가된 기능으로 finally에서 작성했던 close처리를 try문에서 자동으로 close처리
Application1
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Application1 {
public static void main(String[] args) {
/* 위에서 배운 예외처리를 가장 많이 활용하는 것이 io(input/output)
* 이다. 아직 io를 배우지 않았지만 io문법보다는 try-catch 블럭의
* 실제 사용과 흐름에 집중해서 살펴보자. */
/* FileNotFoundException 발생 */
// BufferedReader in = new BufferedReader(new FileReader("test.dat"));
BufferedReader in = null;
/* try 블럭 내부와 finally 블럭 내부에서 모두 사용하기위해
* 지역변수가 아닌 전역 변수로 선언
* 즉, finally 블럭에서 사용하려면 레퍼런스 변수를 try 블럭
* 밖에서 선언해야 한다. */
try {
/* FileReader라는 클래스의 생성자에 예외를 throws해놓았다.
* 사용하는 쪽에서 반드시 예외 처리를 해야하기 때문에 try-catch
* 블럭안에서 생성자를 호출하여 인스턴스를 생성해야 한다. */
in = new BufferedReader(new FileReader("test.dat"));
// FileNotFoundException: test.dat
// (지정된 파일을 찾을 수 없습니다)
String s;
/* readLine메소드도 IOException을 throws 하므로
* catch 블록을 추가해서 예외처리 구문을 작성해야 한다. */
while ((s = in.readLine()) !=null) {
System.out.println(s);
}
/* FileNotFoundException와 EOFException 을
* 동시에 처리할 수 있다.
* 같은 레벨의 자손을 한 번에 처리할 수 있다.
* */
} catch (FileNotFoundException | EOFException e) {
e.printStackTrace();
} catch (IOException e) {
/*입출력에 관한 추상화 된 예외 클래스이다.
* FileNotFoundException와 EOFException은 IOException의 후손이다.
*
* catch 블럭은 여러개를 작성할 시 상위 타입이 하단에 오고
* 후손 타입이 먼저 작성되어야 한다.
*
* */
e.printStackTrace();
} finally {
/* 파일을 스트림 해왔다면 반드시 닫아주는 작업이 필요
* 예외 처리 구문과 상관없이 반드시 수행해야하는 경우 작성하며
* 보통 사용한 자원을 반납할 목적으로 사용하게 된다.
* */
try {
/* 입출력에 사용한 스트림을 닫아주는 메소드이다.
* IOException을 위임한 메소드이기 때문에 finally 블럭
* 안이더라도 예외처리를 중첩으로 해주어야 한다. */
/* 그냥 실행하면 NullPointerException이 발생한다.
* 파일을 찾지 못해 객체를 생성하지 못하고
* 레퍼런스 변수는 null 값을 가지고 있는데
* null 을 참조하는 상태에서 참조연산자 사용시 발생하는 예외이다.
* NullPointerException은 uncheckedException이므로
* try-catch로 처리하기 보다는
* 보통은 if-else 구문으로 해결가능하다.
* */
// in.close();
// java.lang.NullPointerException
if(in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
} // IOException 발생
}
}
}
Application2
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Application2 {
public static void main(String[] args) {
/* try-with-resource */
/* JDK 1.7에서 추가된 문법이다.
* close 해야 하는 인스턴스의 경우 try 옆에 괄호안에서 생성하면
* 해당 try-catch 블럭이 완료될 때 자동으로 close 처리 해준다.
* */
/* 소괄호 안에서 스트림을 읽어온다. */
try (BufferedReader in = new BufferedReader(new FileReader("test.dat"))) {
String s;
while ((s = in.readLine()) != null) {
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Exception과 오버라이딩
- 오버라이딩 시 throws하는 Exception의 개수와 상관없이 같거나 후손 범위여야 함
class SuperClass
import java.io.IOException;
public class SuperClass {
/* 예외를 던지는 메소드를 하나 작성한다. */
public void method() throws IOException {}
}
class SubClass extends SuperClass
import java.io.FileNotFoundException;
import java.io.IOException;
public class SubClass extends SuperClass {
/* 예외없이 오버라이딩 할 수 있다. */
// @Override
// public void method() {}
// /* 같은 예외를 던져주는 구문으로 오버라이딩 할 수 있다. */
// @Override
// public void method() throws IOException {}
/* 부모의 예외 처리 클래스보다 상위의 예외로는
* 후손클래스를 오버라이딩 할 수 없다. */
// @Override
// public void method() throws Exception {}
/* 하지만 부모의 예외처리 클래스보다 더 하위에 있는 예외
* (즉, 더 구체적인 예외상황)인 경우에는 오버라이딩 할 수 있다. */
@Override
public void method() throws FileNotFoundException {}
}
입출력
File 클래스
- 파일 시스템의 파일을 표현하는 클래스
- 파일크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능을 제공
File 인스턴스 생성
File file = new File(“file path");
File file = new File("C:/data/fileTest.txt");
파일/디렉토리 생성 및 삭제 메소드
파일/디렉토리 생성 및 삭제 메소드
Application
import java.io.File;
import java.io.IOException;
public class Application {
public static void main(String[] args) {
/* File을 이용한 스트림을 사용하기 앞서
* File 클래스의 기본사용법을 확인 해보자. */
/* jdk 1.0 부터 지원하는 API로 파일 처리를 수행하는 대표적인 클래스이다.
* 대상 파일에 대한 정보로 인스턴스를 생성하고
* 파일의 생성, 삭제 등등의 처리를 수행하는 기능을 제공하고 있다. */
/* 파일 클래스를 이용해서 인스턴스를 생성한다.
* 대상 파일이 존재하지 않아도 인스턴스를 생성할 수 있다.
* 메모리상에 인스턴스를 생성하기만 했기 때문 */
File file = new File("src/com/greedy/section01/file/test.txt");
/*실제로 만들어보자*/
try {
/* createNewFile을 통해 파일을 생성할 수 있고 성공실패여부를
* boolean 으로 반환한다. */
boolean createSuccess = file.createNewFile();
/* 제대로 생성이 됐는지 확인 */
/* 최초 실행시 새롭게 파일이 만들어지므로 true 가 반환
* 하지만, 파일이 한번 생성 되고 난 이후는 새롭게 파일을 만들지
* 않기 때문에 false를 반환한다. */
System.out.println("createSuccess : " + createSuccess);
// true (refresh 선행 필수)
} catch (IOException e) {
e.printStackTrace();
}
/* 생성한 파일의 정보 */
System.out.println("파일의 크기 : " + file.length() + "byte");
System.out.println("파일의 경로 : " + file.getPath());
System.out.println("현재 파일의 상위 경로 : " + file.getParent());
/* 절대 경로란 최상위 루트 위치로부터의 경로를 의미한다. */
System.out.println("파일의 절대 경로 : " + file.getAbsolutePath());
// 파일의 크기 : 0byte
// 파일의 경로 : src\com\greedy\section01\file\test.txt
// 현재 파일의 상위 경로 : src\com\greedy\section01\file
// 파일의 절대 경로 : D:\dev\1_java\workspace\chap14-io\src\com\greedy\section01\file\test.txt
/* 파일 삭제 */
/* 삭제 후 성공 여부를 boolean 으로 반환한다.
* */
boolean deleteSuccess = file.delete();
/* 지워졌는지 여부 확인 */
System.out.println("deleteSuccess : " + deleteSuccess);
// deleteSuccess : true
}
}
입출력
입출력(IO)란?
- Input과 Output의 약자로 컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는 것
- 장치와 입출력을 위해서는 하드웨어 장치에 직접 접근이 필요한데 다양한 매체에 존재하는 데이터들을
사용하기 위해 입출력 데이터를 처리 할 공통적인 방법으로 스트림을 이용
스트림
스트림(Stream)이란?
- 입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스
- 모든 스트림은 단반향이며 각각의 장치마다 연결할 수 있는 스트림 존재
- 하나의 스트림으로 입출력을 동시에 수행할 수 없으므로 동시에 수행하려면 2개의 스트림이 필요
스트림 종류
Application1
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Application1 {
public static void main(String[] args) {
/* 입출력과 관련된 API는 java.io 에서 제공하고 있다.
* API 문서에서 목록을 확인해보면 대부분
* InputStream/OutputStream & Reader/Writer 로 끝난다.
* 이 중 InputStream과 Reader 는 데이터를 읽어오는 입력스트림이고
* OutputStream과 Writer는 데이터를 내보내는 출력스트림이다.
*
* 또한 InputStream과 OutputStream은 데이터를 1바이트 단위로
* 입/출력을 하고 Reader와 Writer는 문자 (2 or 3바이트) 단위로
* 작업을 한다.
*
* 자바 프로그램과 연결되는 외부 데이터의 타입이 무엇인지는 클래스
* 이름을 보고 유추가 가능하다.
* InputStream/OutputStream & Reader/Writer 를 빼고
* 남은 단어가 바로 외부 데이터의 타입이다.
*
* ex : FileInputStream 은 InputStream을 제거하고 남은단어가
* File 이므로 외부 데이터는 File임을 알 수 있다.
*
* */
/* FileInputStream */
FileInputStream fin = null;
try {
/* 대상 파일이 존재하지 않는 경우 발생하는
* FileNotFoundException 에 대해서 핸들링 해야 한다. */
/* 인스턴스만 생성한 후 실행해보면 예외가 발생한 것을 볼 수 있다. */
/* 파일을 직접 생성한 뒤 다시 실행 하면 예외가 발생하지 않는데
* 스트림인스턴스가 정상적으로 생성되었기 때문이다. */
fin = new FileInputStream("src/com/greedy/section02/stream/testInputStream.txt");
/* 파일 생성 : 해당 폴더 우클릭 - new - file - 하위 폴더 선택후 -
* 파일이름.txt 입력 */
int value;
/* read()는 throw IOException이므로
* 'add catch clause to surrounding try '
* 눌러서 catch block 추가
* read() : 파일에 기록 된 값을 순차적으로 읽어오고 더이상
* 읽어올 데이타가 없는 경우 -1반환
* */
// while ((value = fin.read()) != -1) {
//
// /* 값을 정수로 읽어온다. */
// System.out.println(value);
//
// /* 문자로 출력하고 싶은 경우 형변환 하면 된다. */
// System.out.println((char) value);
// }
/* 출력 */
// 97
// a
// 98
// b
// 99
// c
// 100
// d
// 101
// e
/* 1byte 씩 읽어와야 하는 경우도 존재하긴 하지만 대부분의 경우 비효율적이다.
* byte 배열을 이용해서 한 번에 데이터를 읽어오는방법도 제공한다.
* */
/* File 클래스의 length()로 파일의 길이를 알 수 있다. */
System.out.println("파일의 길이 : " + new File("src/com/greedy/section02/stream/testInputStream.txt").length());
/* File의 길이만큼의 byte 배열을 만든다. */
int fileSize = (int) new File("src/com/greedy/section02/stream/testInputStream.txt").length();
byte[] bar = new byte[fileSize];
/* read() 메소드의 인자로 생성한 byte 배열을 넣어주면
* 파일의 내용을 읽어서 byte 배열에 기록해준다. */
fin.read(bar);
/* 해당 스트림은 파일의 끝까지 다 읽어들인 스트림이기 때문에
* 위에 1바이트씩 읽어온 while 반복문을 주석해야 정상적으로 동작한다. */
for (int i=0; i < bar.length; i++) {
System.out.print((char) bar[i]);
}
// 파일의 길이 : 5
// abcde
/* 한글 값을 입력하는 경우 한글이 깨져서 나온다.
* 한글은 한 글자에 3byte 이기 때문에 3byte 데이터를
* 1byte로 읽어오면 글자가 깨지게 된다. */
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
/* fin 인스턴스가 null 이 아닌 경우 자원 반납을 해야한다. */
if (fin != null) {
try {
/* 자원해제를 하는 경우에도 IOException을 핸들링 해야한다.
* 이미 자원이 반납 된 경우 발생하는 Exception이다.
* */
/* 자원 반납을 해야하는 경우
*
* 1. 장기간 실행 중인 프로그램에서 스트림을 닫지않는 경우
* 다양한 리소스에 누수(leak)가 발생한다.
* 2. 뒤에서 배우는 버퍼를 이용하는 경우 마지막에 flush()로
* 버퍼에 있는 데이터를 강제로 전송해야 한다.
* 만약 잔류 데이터가 남은 상황에서 추가로 스트림을 사용한다면
* 데드락(deadlock)상태가 된다.
* 판단하기 어렵고 의도하지 않은 상황에서도 이런 현상이 발생할 수 있기
* 때문에 마지막에는 flush()를 무조건 실행해주는 것이 좋다.
* close() 메소드는 자원을 반납하며 flush() 를 해주기 때문에
* close() 만 제대로 해주어도 된다.
* */
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Application2
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Application2 {
public static void main(String[] args) {
/* FileReader */
/* FileInputStream과 사용하는 방법이 거의 동일하다.
* 단, byte 단위가 아닌 character 단위로 읽어들이는 부분이 차이점이다.
* 따라서 2바이트던 3바이트던 글자단위로 읽어오기 때문에
* 한글을 정상적으로 읽어올 수 있는 방식이다. */
FileReader fr = null;
try {
/* 파일이 존재하지 않는 경우 파일을 찾지 못한다는 예외가 발생하므로
* 파일을 추가해서 정상적으로 스트림이 생성되게 한다. */
fr = new FileReader("src/com/greedy/section02/stream/testReader.txt");
// testReader.txt (지정된 파일을 찾을 수 없습니다)
/* 파일 생성 : 패키지에 대고 우클릭 - new - file - 해당패키지 재 클릭 -
* 파일명.txt 입력 */
/* 파일 내용을 읽어오는 것도 동일하다. */
/* 한글 값을 입력해도 하나의 글자 단위로 읽어온다. */
// int value;
//
// while((value = fr.read()) != -1) {
// System.out.print((char) value);
// }
// 안녕하세요 출력
/* 단 byte 배열로 읽어오면 한글은 깨지게 되므로
* char 배열로 내용을 읽어오는 기능을 제공하고 있다.
* */
/* 배열의 길이를 구하기 위한 과정 */
char[] carr = new char[(int) new File("src/com/greedy/section02/stream/testReader.txt").length()];
/* 위에서 길이를 구했다면 이번엔 내용을 읽어줘야함 */
fr.read(carr);
/* 길이만큼 반복을 돌며 읽어와 char로 형변환 한 carr의 인덱스를 출력함 */
for(int i = 0; i < carr.length; i++) {
System.out.print(carr[i]);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
/* 사용이 끝났다면 반드시 닫아주어야 함 */
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
InputStream
- 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스
- 추상클래스이므로 객체를 생성할 수 없다.
OutputStream
- 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스
- 추상클래스이므로 객체를 생성할 수 없다.
Reader
- 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스
Writer
- 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스
Application3
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Application3 {
public static void main(String[] args) {
/* FileOutputStream */
/* 프로그램의 데이터를 파일로 내보내기 위한 용도의 스트림이다.
* 1바이트 단위로 데이터를 처리한다.
* */
FileOutputStream fout = null;
try {
/* 스트림으로 길을 만들고 도착지가될 파일을 괄호속에 입력한다. */
/* FileNotFoundException을 핸들링해야하는 것은 동일하지만
* 실행해도 예외가 발생하지 않고 인스턴스가 잘 생성된다.
* 파일을 수동으로 만들어줘야하는 InputStream과 달리,
* OutputStream의 경우 대상 파일이 존재하지않으면 파일을 자동으로
* 생성해준다.
*
* 단, 만약 지정할 경로의 스펠링을 틀린다면()오류가 발생한다.
* 경로가 정확한 상태에서 파일만 없는 것은 자동으로 만들어 주는 것이다.
* FileNotFoundException이 핸들링하는 부분은 경로
* => (지정된 경로를 찾을 수 없습니다.)
*
* */
/* 두번째 인자로 true를 전달하면 이어쓰기가 된다.
* 전달하지 않으면 (false) 덮어쓰기가 된다.
* */
fout = new FileOutputStream("src/com/greedy/section02/stream/testOutputStream.txt");
/* 이어쓰기 해보자 */
fout = new FileOutputStream("src/com/greedy/section02/stream/testOutputStream.txt" /*, true*/);
/* write() 메소드는 IOException을 핸들링 해야한다. */
fout.write(97);
// IOException 이 발생할 가능성이 있기에 catch 블록 작성
/* byte 배열을 이용해서 한 번에 기록할 수도 있다.
* 10 : 개행문자 (엔터)
* */
/* byte 배열을 이용해서 한 번에 기록할 수도 있다. */
byte[] bar = new byte[] {98, 99, 100, 101, 102, 10, 103, 104, 105};
fout.write(bar);
/* bar의 1번 인덱스부터 3의 길이만큼 파일에 내보내기 */
fout.write(bar, 1, 3); // 1번인덱스부터 3의 길이만큼
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fout != null) {
try {
/* IOException를 핸들링 해 주어야 한다. */
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Application4
import java.io.FileWriter;
import java.io.IOException;
public class Application4 {
public static void main(String[] args) {
/* FileWriter */
/* 프로그램의 데이터를 파일로 내보내기 위한 용도의 스트림이다.
* 1글자 단위로 데이터를 처리한다.
* */
FileWriter fw = null;
try {
/* IOException을 핸들링 해주기 위해 try-catch 구문실행 */
/* 단, 경로를 잘못 입력하면 FileNotFoundException
* 에러가 발생한다. Writer의 경우 대상파일이 존재하지 않으면
* 파일을 자동으로 생성해준다.
* */
/* 두번째 인자로 true 전달시 내용을 이어쓰기가 된다.
* 인자를 전달하지 않으면 (또는 false) 덮어쓰기가 된다. */
fw = new FileWriter("src/com/greedy/section02/stream/testWriter.txt", true);
/* write() 메소드도 IOException을 핸들링 해야 한다. */
/* true 가 두번째 인자로 전해져있기 때문에 새로고침을 누를 수록
* a가 이어써서 늘어난다. */
fw.write(97);
/* 문자 단위 출력도 내부 버퍼를 사용하므로 쌓여있는 데이터를
* flush()로 내보내 줘야 최종적으로 파일에 출력되는
* 모습을 확인 할 수 있다. 또는 close()로 자원을 반납하면
* 반납 전에 flush()가 호출되므로 파일에 출력되는 모습을
* 확인할 수 있다.
* */
// fw.flush();
/* 문자 기반 스트림은 직접 char 자료형으로 내보내기도 가능하다. */
fw.write('A');
/* 혹은 char 배열도 가능하며 */
fw.write(new char[] {'a', 'p', 'p', 'l', 'e'});
/* 문자열도 가능하다. */
fw.write("우리나라 대한민국");
// 이어쓰는 상황이므로 새로고침시 같은 내용이 한번 더 출력된다.
// 출력 : aaaaAapple우리나라 대한민국
} catch (IOException e) {
e.printStackTrace();
} finally {
/* 1 바이트가 아닌 데이터를 다룰 때는 내부적으로
* 데이터를 쌓아서 다 차면 내보내기 때문에 의도한다면
* 자체적으로 닫아서 내보내기 해주어야 한다.
* 그게 flush와 close이다. */
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileInputStream
- 파일로부터 바이트 단위로 읽을 때 사용하며, 그림, 오디오,비디오,텍스트 파일 등 모든 종류의 파일 읽기 가능
- InputStream의 하위 클래스로 InputStream의 메소드를 그대로 사용 가능
- FileInputStream 인스턴스 생성
- FileInputStream객체가 생성될 때 파일과 직접 연결
- 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수
FileInputStream fis = new FileInputStream("C:/data/test.txt");
FileReader
- 텍스트 파일로부터 Byte 단위가 아닌 character 단위로 읽어 들임
(2바이트이던 3바이트이던 글자 단위로 읽어 오기 때문에 한글을 정상적으로 읽어올 수 있음) - FileInputStream과 사용하는 방법이 거의 동일
- Reader의 하위 클래스로 Reader의 메소드를 그대로 사용 가능
- FileReader 인스턴스 생성
1. FileReader객체가 생성될 때 파일과 직접 연결 됨
2. 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수
FileReader fr = new FileReader("C:/data/test.txt");
FileReader fr = new FileReader(new File("C:/data/test.txt"));
FileOutputStream
- 파일로부터 바이트 단위로 출력할 때 사용하며, 그림, 오디오,비디오,텍스트 파일 등 모든 종류의 파일 읽기 가능
- OutputStream의 하위 클래스로 OutputStream의 메소드를 그대로 사용 가능
- FileOutputStream 인스턴스 생성
FileOutputStream객체가 생성될 때 파일과 직접 연결
만약 파일이 존재하지 않으면 자동으로 생성하지만 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음
FileIOutputStream fis = new FileOutputStream("C:/data/test.txt");
- 만일 기존 파일에 이어서 계속 추가 작성하고 싶다면 아래와 같이 작성
FileIOutputStream fis = new FileOutputStream("C:/data/test.txt", true);
FileWriter
- 텍스트 파일에 Byte 단위가 아닌 character 단위로 출력
(FileReader와 마찬가지로 글자 단위로 데이터를 처리) - FileOutputStream과 사용하는 방법이 거의 동일
- Writer의 하위 클래스로 Writer의 메소드를 그대로 사용 가능
- FileWriter 인스턴스 생성
FileWriter객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 자동으로 생성하지만 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음
FileWriter fw = new FileWriter("C:/data/test.txt");
- 만일 기존 파일에 이어서 계속 추가 작성하고 싶다면 아래와 같이 작성
FileWriter fw = new FileWriter("C:/data/test.txt", true);
보조 스트림
- 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해서 사용
- 보조 스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 입출력 처리가 불가능
- 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림을 생성
보조 스트림의 종류
- 입출력 성능(BufferedInputStream/BufferedOutputStream)
- 기본 데이터 타입 출력(DataInputStream, DataOutputStream)
- 객체 입출력(ObjectInputStream/ObjectOutputStream) 등의 기능을 제공하는 보조스트림이 있다
EX)
FileInputStream fis = new FileInputStream("sample.txt"); //기반 스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis); //보조스트림 생성
bis.read(); //보조스트림으로부터 데이터 읽어옴
'Programming > JAVA' 카테고리의 다른 글
자바의 정석 ch13-3~6 : 쓰레드의 구현과 실행 (1) | 2023.04.10 |
---|---|
입출력 (I/O) 2 (0) | 2022.01.14 |
예외 처리 (0) | 2022.01.11 |
컬렉션 (0) | 2022.01.10 |
제네릭과 컬렉션 (0) | 2022.01.07 |