2010-05-25 5 views
4

Java에서 속성이 FILE_ATTRIBUTE_TEMPORARY이고 FILE_FLAG_DELETE_ON_CLOSE 인 파일을 Windows에서 만드는 방법은 무엇입니까?Java의 Windows 임시 파일

파일을 메모리에 저장하고 싶습니다.

정확하게 말하자면, 예를 들어 응용 프로그램이 중단되는 경우 일부 데이터가 디스크에 남아있을 때 상황을 피하기 위해 exit-delete 메커니즘이 만족스럽지 않습니다.

답변

4

다음과 같이 사용하십시오. 메모리에 저장되지는 ​​않지만 앱이 종료 될 때 삭제되는 임시 파일입니다.

try { 
    // Create temp file. 
    File temp = File.createTempFile("pattern", ".suffix"); 

    // Delete temp file when program exits. 
    temp.deleteOnExit(); 

    // Write to temp file 
    BufferedWriter out = new BufferedWriter(new FileWriter(temp));  
    out.write("aString");  
    out.close(); 
} catch (IOException e) { 
// (..) 
} 
+0

음, 파일을 사용하는 외부 Windows (Java가 아닌) 응용 프로그램에 일부 데이터를 전달하려고합니다. 파일에서 읽기는 해당 응용 프로그램의 유일한 옵션입니다. 그리고 상황을 피하기를 원합니다. 예를 들어 응용 프로그램 충돌과 같은 이유로 일부 데이터가 디스크에 남을 때입니다. 그것이 내가 생각하기에, 임시 Windows 파일이 최상의 솔루션이 될 것입니다. Delete-on-exit 메커니즘으로 인해 디스크에 데이터가 남을 수 있습니다. –

+0

@ Przemysław, 앱이 충돌하는 경우 실행할 수있는 것을 제어 할 수 없습니다.앱이 시작된 직후에 임시 파일 정리를하는 것은 어떨까요? –

+0

'FILE_ATTRIBUTE_TEMPORARY' +'FILE_FLAG_DELETE_ON_CLOSE'는 디스크에 파일을 남길 기회를 가지고 있습니다. deleteOnExit도 사용하면 시스템 메모리가 압박 받아야하고 응용 프로그램이 충돌하기 때문에 기회가 줄어 듭니다. tmpfs는 약간 더 나은 옵션만을 제공하며 파일은 다음 재부팅 때까지 응용 프로그램이 손상된 후에도 사용할 수 있습니다. – mjaggard

2

메모리 블록 즉 데이터 구조를 사용하지 않는 이유는 무엇입니까? 파일을 만드는 배후의 인센티브는 무엇입니까? 스크래치 파일을 원할 경우 temp filedelete on exit이 도움이됩니다.

+0

음, 파일을 사용하는 외부 Windows (Java가 아닌) 응용 프로그램에 일부 데이터를 전달하려고합니다. 파일에서 읽기는 해당 응용 프로그램의 유일한 옵션입니다. 그리고 상황을 피하기를 원합니다. 예를 들어 응용 프로그램 충돌과 같은 이유로 일부 데이터가 디스크에 남을 때입니다. 그것이 내가 생각하기에, 임시 Windows 파일이 최상의 솔루션이 될 것입니다. Delete-on-exit 메커니즘으로 인해 디스크에 데이터가 남을 수 있습니다. –

+0

@ PrzemysławRóżycki - 문제는 파일의 내용 (임시 파일 포함)이 일반적으로 파일이 삭제 된 후에 디스크에 남아 있다는 것입니다. Norton Utilities에 대해 들어 보셨습니까? –

0

파일을 메모리에 저장하려고합니다.

Windows에서 파일을 임시로 표시하고 닫을 때 삭제한다고해서 파일 시스템에 기록되지 않는다고 보장 할 수는 없습니다.

UNIX/Linux를 사용하면 TmpFS 또는 RamFS 파일 시스템에서 파일을 만들 수 있습니다. 즉 RAM 메모리에 파일을 저장하는 파일 시스템이다. TmpFS는 가상 메모리에 의해 백업되므로 RamFS에있는 파일의 일부 또는 전부가 스왑 디스크에 저장 될 수 있습니다. RamFS는 가상 메모리에 의해 백업되지 않으며 RAM에만 있어야합니다.

RamFS 및 TmpFS에 대한 개요는 here입니다.

그러나 RamFS 내용이 디스크에 저장 될 수 있습니다 (적어도 이론 상으로는).

  • 시스템을 최대 절전 모드로 전환하면 시스템의 전원이 꺼지기 전에 RAM의 전체 내용이 디스크에 저장됩니다.

  • 커널이 충돌하고 커널 크래시 덤프가 활성화 된 경우 커널 메모리 (RamFS 포함)의 내용이 덤프에 기록됩니다.

+0

Windows와 비 Windows 모두 시스템의 메모리가 부족한 경우 디스크에 쓰는 임시 파일 시스템을 제공합니다. 이 기능은 표준 API를 통해 Java 프로그래머가 액세스 할 수 있어야합니다. – mjaggard

+0

당신은 페이징/가상 메모리에 대해 이야기하고 있습니다. 1) 임시 파일이 아닙니다. 2) 공간이 부족할 때만 데이터가 페이징 영역에 기록됩니다. 3) 응용 프로그램이 페이징 공간을 파일 시스템으로 취급 할 수있게 해주는 Java와 같은 다른 표준 API는 없습니다. 4) 나는 그러한 가상 API가 OP를 어떻게 도울지를 보지 못했다. –

+0

아니요, 임시 파일에 대해 이야기하고 있습니다. 필자는 비 Windows 운영 체제에서는 tmpfs를, Windows에서는 FILE_ATTRIBUTE_TEMPORARY + FILE_FLAG_DELETE_ON_CLOSE를 의미합니다. 둘 다 파일을 메모리에 기록 할 수 있으며 메모리 압력에 따라 디스크에 기록됩니다. Java에는 표준 API가 없습니다. 올바른 내용이지만 C++에는 API가 있습니다. 그것은 그것이 그가 요구 한 것이기 때문에 OP를 돕습니다. http://blogs.msdn.com/b/larryosterman/archive/2004/04/19/116084.aspx – mjaggard

0

당신은 윈도우 특정 솔루션 후, 그래서 왜 wndows에게 ProcessBuilder를 통해 execed 명령을 사용하여 파일을 만들 수 없습니다.

+0

이것은 질문에서 사실이지만, tmpfs가 Linux에서 똑같은 일을하기 때문에 이에 대한 해결책은 일반적 일 수 있습니다. – mjaggard

1

플래그를 모두 설정해도 파일이 파일 시스템에 저장 될 수 있습니다. 시스템 캐시가 너무 작아지면 파일이 디스크에 기록되고 시스템이 손상되면 후 프로세스 정리가 수행되지 않습니다.

그러나 저는 Windows에서의 JVM 구현이 플래그를 기본적으로 사용하지 않는 이유를 알고 싶습니다. 적어도 deleteOnExit()는 이와 같이 대체로 구현되어야합니다.