Backend/JAVA
[JAVA] 입출력, stream
howdyoon
2023. 3. 26. 22:50
stream : 데이터를 운반하는데 사용되는 연결통로
스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없고,
입력스트림(input stream)과 출력스트림(output stream)을 사용해야 한다
입력스트림 | 출력스트림 | 입출력 대상의 종류 |
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리(byte배열) |
PipedInputStream | PipedOutputStream | 프로세스(프로세스간의 통신) |
AudioInputStream | AudioOutputStream | 오디오장치 |
[ byte 기반 스트림 ]
package oop0323;
import java.io.FileInputStream;
public class Test02_input {
public static void main(String[] args) {
//파일 입출력(.txt)
//File : .txt .pdf .xls .csv .ppt .jpg ...
//byte형 : 1바이트 할당
//char형 : 2바이트 할당
//1) byte기반 -> 한글깨짐
String filename="D:/java202301/workspace/basic01_java/src/oop0323/data.txt";
FileInputStream fis=null;
try {
fis=new FileInputStream(filename);
while(true) {
int data=fis.read(); //1바이트 읽기
if(data==-1) { //파일의 끝인지? End Of File
break;
}//if end
//System.out.println(data);
System.out.printf("%c", data);
}//while end
}catch (Exception e) {
System.out.println(e);
}finally {
//자원반납
try {
if(fis!=null) { fis.close(); }
}catch (Exception e) {}
}//end
}//main() end
}//class end
[ 문자(char) 기반 스트림 ]
바이트 기반 스트림 | 문자 기반 스트림 |
FileInputStream FileOuteputSteam |
FileReader FileWriter |
package oop0323;
import java.io.FileReader;
public class Test03_input {
public static void main(String[] args) {
//char 기반 -> 한글 안깨짐
String filename="D:/java202301/workspace/basic01_java/src/oop0323/data.txt";
FileReader fr=null;
try {
fr=new FileReader(filename);
while(true){
int data=fr.read(); //2바이트 읽기
if(data==-1) {
break;
}//if end
System.out.printf("%c", data);
}//while end
}catch (Exception e) {
System.out.println("파일 읽기 실패:" + e);
}finally {
//자원반납
try {
if(fr!=null) { fr.close(); }
}catch (Exception e) {}
}//end
}//main() end
}//class end
[ 문자기반 보조스트림 - FileReader, BufferedReader ]
바이트 기반 보조스트림 | 문자 기반 보조스트림 |
BufferedInputStream BufferedOutputStream |
BufferedReader BufferedWriter |
FilterInputStream FilterOutputStream |
FilterReader FilterWriter |
LineNumberInputStream(deprecated) | LineNumberReader |
PrintStream | PrintWriter |
package oop0323;
import java.io.BufferedReader;
import java.io.FileReader;
public class Test04_input {
public static void main(String[] args) {
//3) 메모장 파일의 내용을 엔터 단위로 가져오기
String filename="D:/java202301/workspace/basic01_java/src/oop0322/Order.java";
FileReader fr=null;
BufferedReader br=null;
try {
//1) 파일 가져오기 (읽기모드)
fr=new FileReader(filename);
//2) 엔터단위로 끊어서 읽기 위해 BufferedReader에 옮겨 담기
br=new BufferedReader(fr);
int num=0; //행번호
while(true) {
String line=br.readLine(); //4) 엔터(\n)를 기준으로 한줄씩 가져오기
if(line==null) { //파일의 끝인지? (EOF)
break; //무한 루프 빠져나감
}//if end
System.out.printf("%d %s\n", ++num, line);
//20행마다 밑줄 긋기
if(num%20==0) {
System.out.println("----------------------");
}//if end
}//while end
}catch (Exception e) {
System.out.println("파일 읽기 실패:" + e);
}finally {
//자원반납 순서 주의
try {
if(br!=null) { br.close(); }
}catch (Exception e) {}
try {
if(fr!=null) { fr.close(); }
}catch (Exception e) {}
}//end
}//main() end
}//class end
[ output ]
package oop0323;
import java.io.FileWriter;
import java.io.PrintWriter;
public class Test05_output {
public static void main(String[] args) {
//메모장 파일에 출력하기
//출력파일 (sungjuk.txt)이
//->없으면 파일은 생성된다 (create)
//->있으면 덮어쓰기(overwrite) 또는 추가(append)
String filename="D:/java202301/sungjuk.txt";
FileWriter fw=null;
PrintWriter out=null;
try {
//true : append 모드
//false : overwrite 모드
fw=new FileWriter(filename, false);
//autoFlush : true 버퍼클리어
out=new PrintWriter(fw, true);
//oop0313.Test07_format.java 참조
//out.printf();
out.println("무궁화,95,90,100");
out.println("홍길동,100,100,100");
out.println("라일락,90,95,35");
out.println("개나리,85,70,75");
out.println("진달래,35,40,60");
System.out.println("sungjuk.txt 데이터 파일 완성!!");
}catch (Exception e) {
System.out.println("파일 쓰기 실패" + e);
}finally {
try {
if(out!=null) { out.close(); }
}catch (Exception e) {}
try {
if(fw!=null) { fw.close(); }
}catch (Exception e) {}
}//end
}//main() end
}//class end