자바 고 효율 파일 스 트림 읽 기 쓰기 작업 상세 설명

안내 문
나중에 잊 어 버 리 지 않도록 파일 흐름 의 성능 대 비 를 기록 하 세 요.
보통 파일 읽 기와 쓰기 작업 을 자주 합 니 다.자바 에 서 는 많은 작업 파일 의 종 류 를 제공 합 니 다.일반적으로 파일 작업 도 스 트림 작업 이 라 고 하 는데 다음 과 같은 방식 으로 분류 할 수 있 습 니 다.
4.567917.기능 에 따라 바이트 흐름 과 문자 흐름4.567917.노드 흐름 과 여과 흐름 에 따라 노드 흐름 은 파일 을 직접 조작 하고 여과 흐름 은 노드 흐름 과 여과 흐름 을 포장 했다.예 를 들 어 FileInputStream 과 Buffered FileInputStream 은 각각 노드 흐름 과 여과 흐름 이다파일 흐름 비교
다음은 우리 가 자주 사용 하 는 몇 가지 흐름 을 중점적으로 비교 해 보 겠 습 니 다.
(1) DataInputStream+FileInputStream
(2) DataInputStream+BufferedInputStream
(3)BufferedReader+FileReader(버퍼 크기 에 따라 성능 이 다 릅 니 다.예 를 들 어 1K 와 8K)
(4) BufferedFileReader
먼저 결론 을 붙인다.
소모 시간 대비:
(4)우(3)―8096 우(3)-1024 우(2)<(1)



또한 Buffered FileReader 가 파일 을 읽 는 모든 줄 의 내용 을 최적화 할 수 있다 면 전통 적 인 코드 는 다음 과 같다.

BufferedFileReader in = new BufferedFileReader(); 
for (int i=0; i < nargs; i++) { 
 try { 
  in.open(args[i]); 
  while ((line = in.readLine()) != null) { 
   nlines++; 
  } in.close(); 
} catch (Exception e) { 
 System.out.println(" BFRTest: exception:" + e ); 
}
코드 의 다섯 번 째 줄 에서 Buffered Reader 는 먼저 StringBuffer 를 만 든 다음 에 하나의 String 으로 돌아 갑 니 다.여 기 는 두 번 의 문자 복사 와 관련 됩 니 다.10000 줄 을 읽는다 고 가정 하면 10000 개의 임시 String 대상 이 생 성 되 고 메모리 가 많이 소 모 됩 니 다.Buffered Reader 의 버퍼 흐름 은 개인 적 인 것 이기 때문에 버퍼 흐름 을 스스로 관리 할 수 있 습 니 다.파일 을 읽 는 가장 좋 은 방법 코드 는 다음 과 같 습 니 다.

  FileReader fr;
  int nlines = 0;
  char buffer[] = new char[8192 + 1];
  int maxLineLength = 128;

  //assumes no line is longer than this
  char lineBuf[] = new char[maxLineLength];
  for (int i = 0; i < nargs; i++) {
   try {
    fr = new FileReader(args[i]);

    int nChars = 0;
    int nextChar = 0;
    int startChar = 0;
    boolean eol = false;
    int lineLength = 0;
    char c = 0;
    int n;
    int j;

    while (true) {
     if (nextChar >= nChars) {
      n = fr.read(buffer, 0, 8192);
      if (n == -1) { // EOF
       break;
      }
      nChars = n;
      startChar = 0;
      nextChar = 0;
     }

     for (j = nextChar; j < nChars; j++) {
      c = buffer[j];
      if ((c == '
') || (c == '\r')) { eol = true; break; } } nextChar = j; int len = nextChar - startChar; if (eol) { nextChar++; if ((lineLength + len) > maxLineLength) { // error } else { System.arraycopy(buffer, startChar, lineBuf, lineLength, len); } lineLength += len; // // Process line here // nlines++; if (c == '\r') { if (nextChar >= nChars) { n = fr.read(buffer, 0, 8192); if (n != -1) { nextChar = 0; nChars = n; } } if ((nextChar < nChars) && (buffer[nextChar] == '
')) nextChar++; } startChar = nextChar; lineLength = 0; continue; } if ((lineLength + len) > maxLineLength) { // error } else { System.arraycopy(buffer, startChar, lineBuf, lineLength, len); } lineLength += len; } fr.close(); } catch (Exception e) { System.out.println("exception: " + e); }
NIO 파일 흐름
FileChanel 소개
통 로 는 이전 흐름 이 단 방향 이 고 통 로 는 양 방향 이 며 읽 을 수도 있 고 쓸 수도 있다.파일 읽 기 효율
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기