본문 바로가기

Java

입출력 Input / Output

스트림(Stream)

  • 애플리케이션이 다른 대상으로 데이터 입/출력시 중간 매개체 역할을 하는 단위
    애플리케이션 => (출력스트림) => 작업대상(파일,콘솔,서버등)
    애플리케이션 <= (입력스트림) <= 작업대상(파일,콘솔,서버등)

바이트 기반 입출력

  • 바이트 기반으로 입출력 해주는 클래스
  • 바이트 기반이라 한글 처리가 안됨
참고 : 아스키(ASCII)코드와 유니코드(Unicode)

InputStream 클래스

  • 여러 자식 클래스가 있음
  • System.in에서 in 은 InputStream을 구현해 놓은 객체
import java.io.IOException;

public class InputStreamTest {
    /**
     * InputStream 테스트
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int var_byte=-1;
        System.out.print("문자입력 >>");
        do{
            try{
                var_byte = System.in.read(); // 1byte 씩 읽어온다(한글은 깨짐)
            }
            catch(IOException io){
                io.printStackTrace();
            }
            if(var_byte == 10 || var_byte == 13) {
                break;
            }else {
                System.out.println("읽은 값 : " + (char)var_byte);
            }

        }
        while(true);
        System.out.println("end");
    }
}

FileInputStream

  • 파일로부터 바이트 단위로 데이터를 읽어 들이는 스트림 클래스
  • 파일이 존재 해야함
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest {
    /**
     * FileInputStream 테스트
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileInputStream fIn=null;

        try{
            // 파일 있어야 함(워크스페이스 프로젝트 폴더)
            fIn = new FileInputStream("test.txt");

        }
        catch(IOException io){
            io.printStackTrace();
        }

        int var_read = -1;

        try{
            while((var_read = fIn.read()) != -1){
                System.out.print((char)var_read);
            }
        }
        catch(IOException io){
            io.printStackTrace();
        }
        finally{
            try{
                fIn.close();
            }
            catch(IOException io){
                io.printStackTrace();
            }
        }
    }
}

OutputStream

  • 바이트기반 출력 스트림 최상위 클래스
  • void write() : 1byte 출력
  • void flush() : 버퍼에 있는 데이터 출력

FileOutputStream

  • 특정 파일로 데이터 출력
  • 지정 경로에 파일이 없으면 자동 출력
  • 디렉토리가 없으면 FileNotFoundException 발생
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest {
    /**
     * FileOutputStream 테스트
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileOutputStream fo = null;
        String msg = "FileOutputStream Test";
        byte[] byteArray = msg.getBytes();

        try{
            fo = new FileOutputStream("d:/bigdata/data/fileoutput.txt",true); // true : append 모두
            fo.write(byteArray);
        }
        catch(IOException io){
            io.printStackTrace();
        }
        finally{
            try{
                fo.close();
            }
            catch(IOException io){
                io.printStackTrace();
            }
        }
    }
}

문자 기반 입출력

  • 한글 가능

Reader 클래스

  • 문자를 읽어 드리는 클래스
  • BufferedReader,FileReader, InputStreamReader
  • InputStreamReader : InputStream(바이트) -> Reader(문자)

BufferedReader 클래스

  • Reader 스트림에 버퍼 기능을 추가하는 스트림 클래스
  • 버퍼를 사용해 성능이 좋음
  • readLine() 메서드 : 라인별로 읽어 들여 String 타입으로 반환
  • InputStreamReader : 바이트 입력 스트림 -> 문자 입력 스트림 변환

sample.txt

Reader 테스트 1 입니다.
Reader 테스트 2 입니다.
Reader 테스트 3 입니다.
Reader 테스트 4 입니다.
Reader 테스트 5 입니다.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class BufferedReaderTest {
    /**
     * BufferedReader 테스트
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileInputStream fi = null;
        InputStreamReader isr = null;
        BufferedReader bfr = null;

        try{
            fi = new FileInputStream("sample.txt");
            isr = new InputStreamReader(fi); // InputStream -> Reader
            bfr = new BufferedReader(isr);

            String str = null;
            while((str = bfr.readLine()) != null){
                System.out.println(str);
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally{
            try{
                fi.close();
                isr.close();
                bfr.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

주소록 파일 정보 출력

  • StringTokenizer 객체로 문자열 처리

address.txt

홍길동,율도국,aaa@aaa.com,111-1111
이순신,전라도,bbb@bbb.com,222-2222
세종대왕,서울시,ccc@ccc.com,333-3333
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class ReadAddress {
    /**
     * 주소 정보 출력하기
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileInputStream fi = null;
        InputStreamReader isr = null;
        BufferedReader bfr = null;
        StringTokenizer st = null;

        try{
            fi = new FileInputStream("address.txt");
            isr = new InputStreamReader(fi); // InputStream -> Reader
            bfr = new BufferedReader(isr);

            String str = null;
            while((str = bfr.readLine()) != null){
                st = new StringTokenizer(str, ",");
                System.out.println("이름 : " + st.nextToken() + ",주소 : " + st.nextToken()
                        + ",이메일 : " + st.nextToken() + ",전화번호 : " + st.nextToken());
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally{
            try{
                fi.close();
                isr.close();
                bfr.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

FileReader

  • 파일로 부터 데이터를 문자 단위로 읽어 드림
  • Reader 객체가 됨
import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {
    /**
     * FileRader 테스트
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileReader fr = null;

        try{
            fr = new FileReader("sample.txt");
            int readChar=-1;
            while((readChar=fr.read()) != -1){
                System.out.print((char)readChar);
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally{
            try{
                fr.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

FileReader 로 주소록 읽기


package ch11;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class FileReadAddress {
    /**
     * 주소 정보 출력하기
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileReader fr = null;
        BufferedReader bfr = null;
        StringTokenizer st = null;

        try{
            fr = new FileReader("address.txt");

            bfr = new BufferedReader(fr);

            String str = null;
            while((str = bfr.readLine()) != null){
                st = new StringTokenizer(str, ",");
                System.out.println("이름 : " + st.nextToken() + ",주소 : " + st.nextToken()
                + ",이메일 : " + st.nextToken() + ",전화번호 : " + st.nextToken());
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally{
            try{
                fr.close();
                bfr.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

Writer 객체

  • 문자 단위로 데이터 출력
  • BufferedWriter, FileWriter, OutputStreamWriter
  • OutputStreamWriter : 바이트 출력 스트림 -> 문자 출력 스트림 변환

FileWriter

  • 파일에 데이터를 문자 단위로 출력
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {
    /**
     * FileWriter 테스트
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileWriter fw = null;
        String msg = "FileWriter 테스트입니다.\r\n";
        try{
            fw = new FileWriter("writer_sample.txt",true);
            fw.write(msg);
        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally{
            try{
                fw.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

BufferedWriter

  • flush() 해야 데이터 출력
  • close() 메서드 호출 시도 자동 출력
  • newLine() 자동개행기능이 없기때문에 개행을 해주어야 함
package chapter18;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class ReaderTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileWriter fileW = null;
        BufferedWriter buW = null;
        try{
        fileW = new FileWriter("buffer_writer.txt");
        buW = new BufferedWriter(fileW,4);
        buW.write('A');
        buW.write('B');
        buW.write('C');

        buW.flush();

        buW.newLine();
        buW.write('E');
        buW.write('F');
        buW.write('G');

        //buW.flush();
        }
        catch(IOException io){
            io.printStackTrace();
        }finally{
//            try {
//                buW.close();
//            } catch (IOException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
        }
    }

}

객체 입출력

  • 직렬화 : 객체 -> 파일, 네트워크에 출력(연속되는 바이트로 변경)
  • 역직렬화 : 직렬화된 바이트를 객체로 변환

Serializable 인터페이스 구현

  • 구현할 메소드는 없고 직렬화 할 객체에 implements 만 하면 됨
  • 구현없이 직렬화 시도시 NotSerializableException 발생
  • 특정 변수를 직렬화 대상에서 빼려면 transient 예약어 지정

ObjectInputStream 과 ObjectOutputStream

  • ObjectOutputStream : 객체를 출력 할때 직렬화 기능 수행
  • ObjectInputStream : 객체를 읽어올때 역 직렬화 기능 수행

객체 파일에 저장

참고:serialVersionUID

직렬화 가능한 User클래스 작성

package chapter18;

import java.io.Serializable;

public class User1 implements Serializable { /**
     * 
     */
    private static final long serialVersionUID = 1L;
// 직렬화 가능
    private String id;
    private String passwd;
    private transient int age; // 나이는 제외
    private String name;
    public User1(String id, String passwd, int age,String name) {
        super();
        this.id = id;
        this.passwd = passwd;
        this.age = age;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPasswd() {
        return passwd;
    }
    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "아이디 = " + id + ", 이름 = " + name + ", 나이 = " + age
                + ", 비밀번호 = " + passwd;
    }
}
파일에 입/출력
package chapter18;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectStreamTest {
    /**
     * ObjectInputStream , ObjectOutputStreamTest
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        User1 beforUser1 = new User1("hong", "1234", 20, "홍길동");
        User1 afterUser1 = null;
        FileOutputStream fileos = null;
        ObjectOutputStream objectos = null;
        FileInputStream fileis = null;
        ObjectInputStream objectis = null;

        try{
            fileos = new FileOutputStream("userInfo.ser");
            objectos = new ObjectOutputStream(fileos);
            objectos.writeObject(beforUser1);

            fileis = new FileInputStream("userInfo.ser");
            objectis = new ObjectInputStream(fileis);
            afterUser1 = (User1)objectis.readObject();

            System.out.println(afterUser1);
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally{
            try{
                fileos.close();
                fileis.close();
                objectos.close();
                objectis.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

'Java' 카테고리의 다른 글

JDBC  (0) 2022.03.07
네트워크 network  (0) 2022.03.07
스레드 thread  (0) 2022.03.07
스트림 stream  (0) 2022.03.07
람다 lambda  (0) 2022.03.07