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