InputStream / OutputStream 는 바이트 기반 스트림의 조상
byte[] inSrc = {0,1,2,3,4,5,6,7,8,9};
byte[] outSrc = null;
byte[] temp = new byte[4];
ByteArrayInputStream input = null;
ByteArrayOutputStream output = null;
input = new ByteArrayInputStream(inSrc);
output = new ByteArrayOutputStream();
try {
while(input.available() > 0) {
int len = input.read(temp); // 읽어온 데이터 갯수를 반환
output.write(temp, 0, len); // 읽어온만큼 write 수행
}
} catch(IOException e) {
System.out.println("에러 발생");
}
outSrc = output.toByteArray();
System.out.println("inSrc = " + Arrays.toString(inSrc));
System.out.println("temp = " + Arrays.toString(temp));
System.out.println("outSrc = " + Arrays.toString(outSrc));
종류
보조스트림자체적으로 입출력을 수행할 수 없음
스트림을 먼저 생성한 후 이를 사용해서 보조 스트림을 생성함
스트림의 기능을 향상시키거나 새로운 기능을 추가함
FilterInputStream / FilterOutputStream 는
InputStream/OutputStream 의 자손이면서 보조스트림의 조상
(모든 보조스트림의 조상은 아님)
FilterInputStream / FilterOutputStream
- BufferedInputStream / BufferedOutputStream
- 스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조스트림
- 버퍼(byte 배열)를 사용해서 한번에 여러 바이트를 입출력
- 버퍼가 가득 차면 버퍼의 모든 내용을 출력소스에 출력하고, 버퍼를 비운뒤 다시 출력을 저장할 준비를 수행
→ 버퍼가 가득 찼을때 출력하므로 버퍼에 데이터가 남아있는 채로 프로그램이 종료될 수 있음
→ 출력작업 후 close()(내부적으로 flush() 를 호출) 나 flush() 를 호출하여 버퍼에 있는 내용을 출력하도록 해야한다.
- DataInputStream / DataOutputStream
- 각 기본 자료형단위로 읽고 쓸수 있도록 하는 보조스트림
- 각 기본 자료형 값을 16진수로 표현하여 저장
- 여러 자료형으로 읽기, 쓰기를 진행할 수 있다.
- 여러 자료형을 이용하여 쓰기를 수행한 경우 읽기 역시 쓰기에 사용된 순서대로 읽어와야 올바르게 읽어올 수 있다.
- PushbackInputStream
- SequenceInputStream
- InputStream 을 직접 상속 받는다.
- 어러 개의 입력 스트림을 연속적으로 연결해서 처리할 수 있도록 해주는 보조스트림
- PrintStream
- 데이터 스트림으로 다양한 형태로 출력 가능
- 데이터를 적절한 문자로 출력하도록 문자 기반 스트림의 역할을 수행하는 보조 스트림
- PrintWriter 가 더 다양한 언어의 문자를 처리하는데 적합
- 표준 출력인 System.out , System. err 가 PrintStream 를 사용한다.
- print(), println(), printf() 등 익숙한 메서드가 있다.
String line = "";
ArrayList<String> list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
try (InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr)) {
System.out.println("사용중인 OS 인코딩 정보 : " + isr.getEncoding());
do {
System.out.print("문장을 입력하세요. 마치시려면 q 를 입력하세요 >>> ");
line = br.readLine();
if (!line.equals("q")) {
list.add(line);
System.out.println("입력 내용 : " + line);
}
}while (!line.equalsIgnoreCase("q"));
for (String str : list) {
sb.append("[");
sb.append(str);
sb.append("]");
}
System.out.println(sb);
System.out.println("프로그램을 종료합니다.");
} catch (IOException e) {
e.printStackTrace();
}
public static void writeFileText(File file) {
try (InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
FileWriter output = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(output)) {
System.out.println("[입력하는 메세지를 " + file.getName() + " 파일에 저장합니다.]");
System.out.print(">>> ");
bw.newLine();
bw.newLine();
bw.write(br.readLine());
}catch (IOException e) {
e.printStackTrace();
}
}
public static void readFileText(File file) {
try (FileReader output = new FileReader(file);
BufferedReader bw = new BufferedReader(output)) {
String line;
System.out.println("파일 내용 출력 : " + file.getName());
while ((line = bw.readLine()) != null){
System.out.println(line);
}
}catch (IOException e) {
e.printStackTrace();
}
}
public static void makeNewFile(File file) {
System.out.println("새로운 파일을 생성합니다.");
writeFileText(file);
}
public static void main(String[] args) {
File dir = new File("/Users/username/someDirName");
String targetName = "file_write_test.txt";
File target = new File(dir, targetName);;
if (dir.exists()){
if (dir.isDirectory()){
System.out.println("디렉터리 이름 : " + dir.getName());
System.out.println();
// 디렉토리의 포함 파일과 디렉토리 목록 반환
File[] files = dir.listFiles();
if (files != null && files.length != 0){
boolean isTargetExist = false;
for (File file : files) {
String fileName = file.getName();
if (fileName.equals(targetName)) {
isTargetExist = true;
}
System.out.println("\t" + fileName);
}
if (isTargetExist) {
writeFileText(target); // 파일 쓰기
System.out.println();
readFileText(target);
} else {
makeNewFile(target); // 새로운 파일 생성 후 쓰기
System.out.println();
readFileText(target);
}
} else {
System.out.println("디렉터리가 비었습니다.");
makeNewFile(target); // 새로운 파일 생성 후 쓰기
System.out.println();
readFileText(target);
}
} else {
System.out.println("파일 이름 : " + dir.getName());
}
} else {
System.out.println("파일 또는 디렉터리가 존재하지 않습니다.");
}
}