수요일, 6월 17, 2009

FileOutputStream의 오묘함

FileOutputStream fos = null;

try {
for(int i=0; i<10;i++) {

File file = new File(fullyName);

fos = new FileOutputStream(file, true);
fos.write(sb.toString().getBytes());
fos.flush();
}
} catch(Exception e) {
e.printStackTrace();
} finally {
fos.close();
}

위의 코드의 문제점은 fos를 마지막 10번째 fos만 close()를 하는것이 문제 입니다.

FileOutputStream 의 close()메소드를 호출하지 않으면 Windows 시스템에서는 파일을 lock하고 있습니다. lock의 해제는 프로그램을 종료하거나 gc가 일어나서 java가 더이상 참조를 하지 않을때 입니다.
그때에 비로소 삭제 될수 있는것이죠.
linux 시스템에서는 파일을 lock하지 않습니다.

그럼 하나의 폴더에 파일을 몇개까지 쓸수 있을까요? 어제부터 프로그램을 돌리는데 631,770개까지 파일을 생성하는데 성공했습니다.

물런 파일은 계속 생성되지만 cpu 97% 잡아먹고 생성시간은 파일100개 생성하는데 30초가 걸립니다.
자 내일까지 몇개나 더 생성할수 있을런지... 이런 부분은 나의 지식의 얇기가 드러나네요. 흐미...
os의 파일 구조를 좀더 공부해야겠지만, 다른 볼것도 많다는 핑계를 두고 싶네요.

댓글 4개:

  1. 익명9/09/2010

    그럼 나머지 9개의 fos는 어떻게 close() 해줘야 하는건가요?

    답글삭제
  2. finally문을 for문 안쪽으로 넣어서 닫도록 해야하구요.
    catch문에서 exception을 throw 하던지해야겠지요.

    답글삭제
  3. 익명9/10/2010

    혹시나 해서 댓글 달았는데 이렇게 빨리 다시 답을 주시다니 감사합니다.
    자바초보인데 소스를 리뷰하다가 비슷한 부분이 있어서 댓글을 달게되었습니다.
    그럼 hangum님 말씀대로 하면 아래와 같이 하면 문제가 없을까요?

    FileOutputStream fos = null;

    for(int i=0; i<10;i++) {
    try {
    File file = new File(fullyName);

    fos = new FileOutputStream(file, true);
    fos.write(sb.toString().getBytes());
    fos.flush();
    } catch(Exception e) {
    e.printStackTrace();
    } finally {
    try {
    if (fos != null) {
    fos.close();
    }
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
    }

    답글삭제
  4. 익명9/10/2010

    혹시나 해서 댓글 달았는데 이렇게 빨리 다시 답을 주시다니 감사합니다.
    자바초보인데 소스를 리뷰하다가 비슷한 부분이 있어서 댓글을 달게되었습니다.
    그럼 hangum님 말씀대로 하면 아래와 같이 하면 문제가 없을까요?

    FileOutputStream fos = null;

    for(int i=0; i<10;i++) {
    try {
    File file = new File(fullyName);

    fos = new FileOutputStream(file, true);
    fos.write(sb.toString().getBytes());
    fos.flush();
    } catch(Exception e) {
    e.printStackTrace();
    } finally {
    try {
    if (fos != null) {
    fos.close();
    }
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
    }

    답글삭제