스트림이란?

  • 일차원적인 데이터의 흐름
  • 외부의 데이터를 읽고 쓰려는 것

흐름의 방향에 따른 분류

  • 입력 스트림(input stream), input은 io에 있다
  • 출력 스트림(output stream)

데이터 형태에 따른 분류

  • 문자 스트림(character stream), Reader/Writer
  • 바이트 스트림(byte stream), input/output

FileReader 클래스

  • 텍스트 파일을 읽는 클래스
  • 더 이상 읽을 것이 없으면 -1을 리턴한다
  • io는 무조건 예외 처리 해야한다
import java.io.FileReader;
public class FileReaderExam {
     public static void main(String[] args){
           FileReader reader = null;
           char arr[] = new char[30];
           
           try{
                reader = new FileReader("poam.txt");
                while(true){
                      int data = reader.read(arr);
                      if(-1 >= data)
                           break;
                      System.out.println(arr);
                }
/*              while(true){
                      int data = reader.read(); // 하나씩 옮기므로  비효율적이다
                      if(-1 == data){
                           break;
                      }
                      
                      char ch = (char)data;
                      System.out.print(ch);
                }
*/              
           }catch(Exception e){
                e.printStackTrace();
           }finally{
                // close도 예외 발생할 수 있음
                try{
                      reader.close();
                      
                }catch(Exception e2){}
           }
     }

FileWriter 클래스

  • 텍스트를 파일에 쓰는 클래스
  • 파일이 없어도 알아서 만들어준다
import java.io.FileWriter;
import java.util.Scanner;
public class FileWriteExam {
     
     public static void main(String[] args) {
           FileWriter writer = null;
           Scanner sc = new Scanner(System.in);
           System.out.println("입력:");
           String str = "";
           String poem = "";
           
           while(!(str = sc.nextLine()).equals("q")){
                poem+=str;
                poem+="\n";
           }
           
           try{
                writer = new FileWriter("poem2.txt");
                writer.write(poem);
                
           }catch(Exception e){
                e.printStackTrace();
           }finally{
                try{
                      writer.close();
                }catch(Exception e2){}
           }
     }
}

파일 Copy

import java.io.FileReader;
import java.io.FileWriter;
public class FileCopy {
     public static void main(String[] args) {
           FileReader      fileRead = null;
           FileWriter      fileWrite = null;
           String text = new String();
           
           try{
                fileRead = new FileReader("poam.txt");
                while(true){
                      int value = fileRead.read();
                      if(-1 ==value)
                           break;
                      
                      text+=(char)value;
                }
                
                // 쓰기
                fileWrite = new FileWriter("poam_copy.txt");
                fileWrite.write(text);
                
           }catch(Exception e){             
                System.out.println(e.getMessage());
           }finally {
                try{
                      fileRead.close();
                      fileWrite.close();
                }catch (Exception e) {
                      System.out.println(e.getMessage());
                }
           }
     }

객체를 Bytes로 변환

  • nodestream : 제일 앞에 있는 스트림
  • filterstream : 연결되어있는 스트림
  • 객체를 데이터로 써서 txt파일로 저장하면 데이터를 재사용할 수 있다
  • Seiralizable 한 class라면 직렬화 가능(오버라이딩 x)
  • 클래스의 멤버객체들도 Seiralizeable 되어있어야 직렬화 가능
  • ArrayList는 기본적으로 직렬화 가능하지만, 그 안의 객체도 Seiralizedable되어 있어야 가능하다
  • transient키워드를 쓰면 데이터가 null로 넘어간다(숨기고 싶은 필드에 사용)

Byte Stream class

  • FileInputStream : 디렉토리에 있는 파일의 내용을 직렬화 한다
  • ObjectInputStream : 직렬화한 정보를 객체 타입으로 변환한다
  • FileOutputStream : 파일에 바이트 내용을 입력한다(역직렬화)
  • ObjectOutputStream : 파일이나 객체 정보를 바이트로 변환한다

SerialExam.java

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

public class SerialExam {
    Member m;
    
    public void read(){        //파일에 있는 Member객체 역직렬화
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("object.ser"));
            m = (Member)ois.readObject(); // 파일에 직렬화 완성
        } catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                ois.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    
    public void write(){    //Member객체를 생성 파일에 직렬화
        m = new Member("가가가", 20);
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("object.ser"));
            oos.writeObject(m);
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            try{
                oos.close();
            }catch(Exception e2){
                
            }
        }
        
    }
    
    public static void main(String[] args) {        
        SerialExam se = new SerialExam();
        se.write();
        se.m = null;
        se.read();
        
        System.out.println(se.m);
    }
}

Meber.java

package kosta.io;
import java.io.Serializable;
public class Member implements Serializable {
     private String name;
     private int age;
     public Member(String name, int age) {
           super();
           this.name = name;
           this.age = age;
     }
     public String getName() {
           return name;
     }
     @Override
     public String toString() {
           return "Member [name=" + name + ", age=" + age + "]";
     }
     public void setName(String name) {
           this.name = name;
     }
     public int getAge() {
           return age;
     }
     public void setAge(int age) {
           this.age = age;
     }
}