메모리에 새 java.io.File을 만드는 방법은 무엇입니까?


98

하드 디스크가 아닌 메모리 File에서 새 파일을 만들려면 어떻게 java.io해야합니까?

Java 언어를 사용하고 있습니다. 하드 드라이브에 파일을 저장하고 싶지 않습니다.

잘못된 API ( java.util.jar.JarFile)에 직면했습니다 . 그것은 기대하고 있어요 File fileString filename. 파일이없고 ( byte[]콘텐츠 만 있음 ) 임시 파일을 만들 수 있지만 아름다운 솔루션은 아닙니다. 서명 된 항아리의 다이제스트를 확인해야합니다.

byte[] content = getContent();
File tempFile = File.createTempFile("tmp", ".tmp");
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(archiveContent);
JarFile jarFile = new JarFile(tempFile);
Manifest manifest = jarFile.getManifest();

임시 파일을 만들지 않고 매니페스트를 얻는 방법에 대한 모든 예는 감사하겠습니다.


8
그래서 메모리에 바이트를 원하십니까?
Sotirios Delimanolis 2013

6
당신은 무엇을하려고 이와 File?
Jon Skeet 2013

5
File정의에 의해 하드 드라이브에 있습니다.
Uwe Plonus 2013

3
영구 메모리에 파일을 저장하지 않으려면 파일을 만드는 이유는 무엇입니까?
Bhavik Shah 2013

7
와, StackOverflow의 상상력 부족은 놀랍습니다. 누군가는 파일이 필요한 인터페이스를 사용하고 있기 때문에 간단한 메모리 파일이 필요할 수 있습니다. 인터페이스는 InputStream 용으로 작성되어야했지만 그렇지 않았습니다. 임시 파일은 과잉처럼 보이므로 메모리 내 java.io.File이 더 좋습니다.
Novaterata

답변:


30

스트림에 쓰려면 메모리에서 다음을 사용하십시오.

new ByteArrayOutputStream();

5
ByteArrayOutputStream은 파일 객체가 필요한 인터페이스와 함께 사용할 수 없기 때문에 질문에 답하지 않습니다.
FableBlaze

1
@FableBlaze 그럼, 그 질문에 대한 답은 "불가능하다"입니다. 이 답변은 실용적이며 사용자가 대신 무엇을 할 수 있는지 알려줍니다. Andreas의 대답은 분명히 더 철저하고 더 나은 대답입니다.
haraldK

"불가능하다"는 것이 제 생각에는 타당한 대답이 될 것입니다. 그러나 어떤 이유로 하드 드라이브에 쓸 수 없다면 메모리 내 파일 시스템 (Andreas의 답변에 언급 됨)도 언급 될 수 있다고 생각합니다.
FableBlaze

80

하드 디스크가 아닌 메모리에 java.io에서 새 파일을 만들려면 어떻게해야합니까?

어쩌면 당신은 혼동 FileStream:

  • A File는 파일 및 디렉토리 경로 이름 의 추상적 인 표현입니다 . File객체를 사용하여 파일 시스템의 파일 메타 데이터에 액세스하고이 파일 시스템의 파일에 대한 일부 작업 (예 : 파일 삭제 또는 만들기)을 수행 할 수 있습니다. 그러나 File클래스는 파일 내용을 읽고 쓰는 방법을 제공하지 않습니다.
  • 읽기와 파일 쓰기, 당신은 사용하고 Stream, 객체를 같은 FileInputStreamFileOutputStream. 이러한 스트림은 File개체 에서 만든 다음 파일을 읽고 쓰는 데 사용할 수 있습니다.

파일에서 읽고 쓰는 것과 유사한 방식으로 a 및 a 를 사용하여 바이트 버퍼 에서 읽고 쓰는 방식으로 메모리에 상주하는 바이트 버퍼를 기반으로 스트림을 만들 수 있습니다 . 배열은 "파일의"콘텐츠가 포함되어 있습니다. 그러면 개체 가 필요하지 않습니다 .ByteArrayInputStreamByteArrayOutputStreambyteFile

모두 File...ByteArray...스트림에서 상속 java.io.OutputStream하고 java.io.InputStream사용자가 파일 또는 바이트 배열에서 읽는 여부를 숨길 수있는 공통의 슈퍼 클래스를 사용할 수 있도록하는 것이 각각.


95
이것이 원래 포스터가 원하는 것인지 확실하지 않지만 "File in memory"가 유용 할 때 한 가지 예는 입력 매개 변수로 java.io.File이 필요한 기존 라이브러리를 재사용하려는 경우입니다. 실제로 메모리에 저장된 "파일"을 사용하고 싶습니다. 이 경우 한 가지 해결책은 Apache Commons VFS를 사용하여 DefaultFileSystemManager를 인스턴스화하고이를 사용하여 RamFileProvider를 만드는 것입니다. 나는 (더 완전한) 적절한 대답은이를 추가 한 것이지만,이 질문은 ... 몇 시간 전에 폐쇄 된 것으로 보인다
소린 포스텔 니쿠에게

2
+1 실제 파일을 사용하지 않고 구성 요소를 단위 테스트하기 위해 이런 종류의 솔루션을 찾고있었습니다
GClaramunt

3
"실제 파일"을 생성하지 않으려면 임시 파일을 생성 해보십시오. 참조 createTempFile를 위해 java.io.file. 이 파일은 단위 테스트가 종료 될 때 자동 삭제되도록 설정할 수 있습니다.
Andrew-Dufresne 2014 년

2
이것은 질문에 대한 답이 아닙니다. @SorinPostelnicu가 잘 말했듯이 메모리의 "파일"은 메모리의 파일 시스템과 비슷합니다.
Felipe

1
아마도 OP의 사용 사례와 값 비싼 시스템 디스크 I / O로 지연 시간을 줄이는 귀중한 방법을 합친 것 같습니다.
Eddie B

3

Jimfs 와 같은 메모리 내 파일 시스템을 사용할 수 있습니다.

다음은 readme의 사용 예입니다.

FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
Path foo = fs.getPath("/foo");
Files.createDirectory(foo);

Path hello = foo.resolve("hello.txt"); // /foo/hello.txt
Files.write(hello, ImmutableList.of("hello world"), StandardCharsets.UTF_8);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.