a battle with myself

[java] 입출력(I/O) Stream(file/buffered) 본문

java

[java] 입출력(I/O) Stream(file/buffered)

열공_중 2016. 6. 21. 15:43

사용빈도가 높은 Stream

 

byte Stream(1byte 씩 읽거나 씀)

(2진,바이너리 형태의 파일을 읽거나 쓸때 사용)

 

InputStream             //     OutputStream

FileInputStream                FileOutputStream

ObjectInputStream            ObjectOutputStream

 

오브젝트 스트림에 객체를 담아주기 위해선 객체에 Serializable 인터페이스를 구현하여 객체 직렬화를 사용해줘야한다.

 

 

 

중간단계

InputStreamReader

OutputStreamWriter

 

이 두개의 스트림은  1byte형태의 stream 2바이트 형태로 읽고 쓸 수 있게 해준다.

 

 

 

 

character stream(2byte 씩 읽거나 씀)

(text 형태의 파일을 읽거나 쓸때 사용)

 

Reader                    //        Writer

FileReader               //        FileWriter

BufferedReader        //         BufferedWriter

//        PrintWriter(버터레드라이터는 사용후 남은 버퍼를 날려주기 위해 flush() 를 꼭 사용

          해줘야하나  프린터 라이터는 오토 플러쉬를 지원 해준다)

 

---------------------------------------------------------------------------------------------------------------------------------

 

//5mb 크기의 text 파일 을 읽어 들일때의 속도 비교

public class Stream_test{
   int temp;


  String path = "d:a.txt";    // 5mb 크기의 text 파일
  public void testStream(){
    try{
        FileInputStream fs = new FileInputStream(path);
        long before = System.currentTimeMillis();

        while((temp=fs.read())!= -1){
            System.out.println((char)temp);
        }

        long amount = System.currentTimeMillis()-before;
        System.out.println("소요된 시간은 : " + amount);
        fs.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

  public void testReader(){
    try{
       FileReader fr = new FileReader(path);

        long before = System.currentTimeMillis();



        while((temp=fr.read())!= -1){
          System.out.println((char)temp);
        }

        long amount = System.currentTimeMillis()-before;
        System.out.println("소요된 시간은 : " + amount);
        fr.close();
    }catch(Exception e){
        e.printStackTrace();
    }

  public static void main(String []args){
    Stream_test st = new Stream_test();
    st.testStream();           // 약 10초 소요(9772)
    st.testReader();            / 약  5초  소요(5129)
    // text 파일을 읽어 올시 2바이트 읽는 리더가 빠르다.
  }
}

 

 

---------------------------------------------------------------------------------------------------------------------------------

 

//file 복사

 

public class Stream_test{

    int temp;

    String path = "d:a.txt";    // 5mb 크기의 text 파일

    String newPath = "d:copya.txt";    //  이동 복사 경로

 

    public void testCopy(){

        try{

            FileReader fs = new FileReader(path);

            FileWriter fw = new FileWriter(newPath);

            long before = System.currentTimeMillis();

 

            while((temp=fs.read())!= -1){

                fw.write(temp);

            }

            long amount = System.currentTimeMillis()-before;

            System.out.println("소요된 시간은 : " + amount);

            fr.close();

            fw.close();

        }catch(Exception e){

            e.printStackTrace();

        }

    }

 

 

    public static void main(String []args){

        Stream_test st = new Stream_test();

        st.testCopy()                // 약 3초 소요(3172)

        //출력문이 없기 때문에 시간이 빠름

    }

}

---------------------------------------------------------------------------------------------------------------------------------

// 한줄씩  읽거나 쓰는  BufferdReader 와  BufferedWriter

 

 

public class Stream_test{

    String temp;

    String path = "d:a.txt";    // 5mb 크기의 text 파일

    String newPath = "d:copya.txt";    //  이동 복사 경로

 

 

    public void testBuffered(){

        try{

            BufferedReader br = new BufferedReader(new FileReader(path));

            BufferedWriter bw = new BufferedWriter(new FileWriter(newPath));

            long before = System.currentTimeMillis();

 

            while((temp=br.readLine()) != null){

                bw.write(temp+"\r\n");

            }

            bw.flush();

            long amount = System.currentTimeMillis()-before;

            System.out.println("소요된 시간은 : " + amount);

            br.close();

            bw.close();

        }catch(Exception e){

            e.printStackTrace();

        }

    }

 
 

    public static void main(String []args){

        Stream_test st = new Stream_test();

        st.testBuffered();                        

        // 일반적인 copy 보다 빠름 한줄씩 읽어온다.

    }

}

---------------------------------------------------------------------------------------------------------------------------------

 

//try문 안에서 리더 구현

 

public class Stream_test{
    String temp;
    String path = "d:a.txt"; // 5mb 크기의 text 파일
    String newPath = "d:copya.txt//이동 복사 경로
    public void testBuffered(){
        try(BufferedReader br = new BufferedReader(new FileReader(path));
            BufferedWriter bw = new BufferedWriter(new FileWriter(newPath))){
            long before = System.currentTimeMillis();

            while((temp=br.readLine()) != null){
                bw.write(temp+"\r\n");
            }
            long amount = System.currentTimeMillis()-before;
            System.out.println("소요된 시간은 : " + amount);

        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void main(String []args){
        Stream_test st = new Stream_test();
        st.testBuffered();
        // try(  안에 구현시 close()를 해주지 않아도 된다. ) 
    }
}