2018년 10월 2일 화요일

Java FileInputStream / BufferedReader의 스트림 출력 비교

이번에는 FileInputStream과 BufferedReader로 바이트단위를 출력할때 방법에 대해서 살펴보겠다.

1) 1바이트씩 출력하기
2) 한 줄씩 출력하기

위의 2가지경우가 있는데, 예제를 통해서 살펴보자
FileInputStream은 파일의 내용을 읽어오는데, 1바이트씩 문자를 읽어온다.
이와 다르게 BufferedReader는 파일(텍스트)을 한 줄씩(한 라인씩) 읽어서 값들을 출력 할 수 있다.

예제. 1바이트씩 출력한것과 한 줄(텍스트의 한 라인)씩 출력 소요시간 비교
  1. package org.java.project;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.BufferedReader;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. @FunctionalInterface
  10. interface ByteCodePrint{
  11.     public void ByteCodeFunc();
  12. }
  13. abstract class ByteCodes{
  14.     public static String FileReadPath = "data.txt";
  15.    
  16. }
  17. class ByteCodeExam extends ByteCodes {
  18.     public BufferedReader br;
  19.     public long startTime;
  20.     public long endTime;
  21.     public FileInputStream fis;
  22.    
  23.    
  24.     public ByteCodeExam() throws FileNotFoundException{
  25.         super();
  26.         this.fis = new FileInputStream(ByteCodes.FileReadPath);
  27.         this.br = new BufferedReader(new InputStreamReader(this.fis));
  28.     }
  29.     public void fileClose() {
  30.         if(this.fis != null)
  31.             try {
  32.                 this.fis.close();
  33.                 if(this.br != null)
  34.                     this.br.close();
  35.             } catch (IOException e) {
  36.                 // TODO Auto-generated catch block
  37.                 e.printStackTrace();
  38.             }
  39.        
  40.     }
  41.     ByteCodePrint LinePrint = ()  -> {
  42.         String reader = "";
  43.             try{
  44.                 this.startTime = System.currentTimeMillis();
  45.                 while((reader = this.br.readLine()) != null) {
  46.                     System.out.println(reader);
  47.                 }
  48.                 this.endTime = System.currentTimeMillis();
  49.                 System.out.println("LineBuffer의 소요된 시간 : " + (this.endTime - this.startTime) / 1000.0);
  50.             } catch (IOException e) {
  51.                 System.out.println(e.getMessage());
  52.             }
  53.     };
  54.     ByteCodePrint OneBytePrint = () -> {
  55.         try {
  56.             int reader = 0;
  57.             this.startTime = System.currentTimeMillis();
  58.             while( (reader = this.fis.read()) > 0) {
  59.                 System.out.print((char) reader);
  60.             }
  61.             this.endTime = System.currentTimeMillis();
  62.             System.out.println("\nOneByte의 소요된 시간 : " + (this.endTime - this.startTime) / 1000.0);
  63.         } catch( IOException  e) {
  64.             System.out.println(e.getMessage());
  65.         }
  66.     };
  67. }
  68. public class Compile{
  69.      public static void main(String[] args) {
  70.          try {
  71.             ByteCodeExam b = new ByteCodeExam();
  72.            
  73.             b.OneBytePrint.ByteCodeFunc(); // FileInputStream의 객체로 1Byte씩 출력하기
  74.             b.LinePrint.ByteCodeFunc();    // BufferReader의 객체로 한 줄씩 출력하기
  75.             b.fileClose();
  76.         } catch (FileNotFoundException e) {
  77.             System.out.println(e.getMessage());
  78.         }
  79.          
  80.      }
  81. }


실행결과
1) 1Byte씩 출력




2) 한 줄씩 출력















위의 소스코드는 한줄에 A~Z까지 차례대로 번갈아가면서 출력을하는데,
총 717줄까지 존재하며, 717줄까지 출력하는데 걸리는시간을 비교한 예제이다.

Buffer라는 메모리에 한 줄의 문자들을 전부 담아서 한줄씩 출력하는데 걸리는 시간이 더 짧았으며 이는 우리가 파일이나 네트워크상에서 입/출력 스트림을 처리할때에는 buffer를 사용한다면 더 효과적인 방법일것이라는 것을 설명하는 예제이다.

다음시간에는 DataInputStream에 대해서 살펴보도록하겠다.

댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...