자바에서 입출력을 진행하게 되면 내부적으로는 OS에게 부탁해서 물리적 장치인 하드디스크로부터 읽어오게된다. 이때 자바에서 1바이트를 읽어오라고 명령을 내리더라도 인접한 256바이트나 512바이트를 읽어오기때문에 읽어오는 단위는 운영체제의 읽기/쓰기 단위 또는 디스크의 섹터당 구성되어지는 바이트에 따라서 실제로 읽어들이는 다를 수 있다.

 

따라서 1000바이트의 파일을 1바이트씩 읽어오라고 실행하면 내부적으로 512바이트씩 1000번 읽어 온다는 의미가 된다.(이는 파일의 크기가 크거나 많을때 많이 성능 차이를 보일수 있다.) 그러므로 1바이트씩이 아니라 512바이트씩 읽어오게되면 2번만 디스크를 읽어 들이면 되기때문에 상당히 효율적으로 프로그램이 동작하게 되는것이다.

 

 

package ch4;

 

import java.io.FileInputStream;

import java.io.IOException;

 

public class FileView2 {

 

       public static void main(String[] args) {

              if (args.length != 1) {

                     System.out.println("사용법 : java FileView 파일명");

                     System.exit(0);

              } // if end

 

              FileInputStream fis = null;

              try {

                     fis = new FileInputStream(args[0]);

                     int readcount = 0;

                     byte[] buffer = new byte[512];

                     while ((readcount = fis.read(buffer)) != -1) {

                           System.out.write(buffer, 0, readcount);

                     }

              } catch (Exception ex) {

                     System.out.println(ex);

              } finally {

                     try {

                           fis.close();

                     } catch (IOException e) {

                     }

              }

       } // main

}

 

 

 

          int readcount = 0;

       byte[] buffer = new byte[512];

       while ((readcount = fis.read(buffer)) != -1) {

              System.out.write(buffer, 0, readcount);

       }

 

public int read(byte[] b) throws IOException

  APIb의 배열의 길이 바이트만큼 Input Stream으로 부터 읽어서 배열바이트 b에 저장하고 읽은 바이트수를 반환한다. 만일 읽을내용이 없는 경우 -1을 반환한다.

 

PrintStreamSystem.out write(buffer, 0, readcount)메소드는 다음의 API로 명시되어있다.

public void write(byte[] buf, int off, int len)  

buf의 바이트 배열로부터‘off’ offset으로부터 ‘len’바이트를 출력한다.

                  

 

 

 

 

Posted by Steven J.S Min
,