지난번 포스팅에서 파일 입출력을 해보았습니다. (http://yoonemong.tistory.com/150)
그런데 파일을 읽을때 FileInputStream을 하게 됩니다.
FileInputStream의 내장되어 있는 메소드중 read() 메소드는 기본적으로 1byte 단위로 읽게 됩니다.
그럼 많은 데이터를 읽으려면 시간이 많이 소요될것입니다.
그래서 오늘은 좀더 파일을 빨리 읽을수 있는 방법을 알려드릴까합니다.
방법은 간단합니다. 내가 원하는 byte만큼 읽어오는 것입니다.
<소스코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Test { public static void main(String[] args) { long startTime = System.currentTimeMillis(); FileInputStream fis = null; FileOutputStream fos = null; try{ fis = new FileInputStream("src/Test.java"); fos = new FileOutputStream("byte1.txt"); int readCount = -1; //읽었을때 값을 받기 위함 byte[] buffer = new byte[512]; while((readCount = fis.read(buffer)) != -1) { fos.write(buffer,0,readCount); } } catch(Exception e) { } try{ fos.close(); fis.close(); }catch(IOException e1) {} long longTime = System.currentTimeMillis(); System.out.println(longTime - startTime); } } | cs |
<결과>
byte[] buffer = new byte[512]; 자신이 원하는 바이트의 수만큼 데이터를 만들고
read(buffer) read메소드에 넣어줍니다. 이렇게 하면 read()메소드는 buffer의 크기만큼 데이터를 가져오게 되고
write 메소드를 통해 출력을 하면 되는데 write메소드를 보게 되면 인자값이 3개가 들어가는것을 볼수있습니다.
write(String s, int start , int len) 의 경우
s의 start지점부터 len 길이만큼 데이터를 출력시키겠다는 의미를 가지게 됩니다.
코드를 보게 되면 512byte만큼 데이터를 읽어오는데 512byte 를 굳이 한 이유가 있을까요?
대부분의 운영체제는 기본적으로 데이터를 가져오라고 하면 512byte씩 읽어오게 되는데 1byte를 가져오라고 하면
512byte중 1byte만 사용하고 511byte는 버리게 됩니다.
그렇기 때문에 만약 버퍼의 크기를 정하지 않고 read()를 두번하게 된다면 1024byte를 읽어오지만 버리는 데이터는 1022byte입니다.
그래서 보통 512byte를 읽어오는 방법을 택합니다.
'프로그래밍 > 자바' 카테고리의 다른 글
[JAVA] 자바 Thread 만들기 ( extends Thread) (0) | 2018.08.29 |
---|---|
자바 어노테이션(Annotation) 만들기 (0) | 2018.08.23 |
자바 파일 입출력 실습!! (0) | 2018.08.21 |
자바 I/O 알아보자 (0) | 2018.08.21 |
[JAVA] JAVA_FX 설치하기 (0) | 2018.08.07 |