मेमोरी में एक नया java.io.File कैसे बनाएं?


98

मैं हार्ड डिस्क पर नहीं, मेमोरी में नया File(से java.io) कैसे बना सकता हूं ?

मैं जावा भाषा का उपयोग कर रहा हूं। मैं हार्ड ड्राइव पर फ़ाइल को सहेजना नहीं चाहता।

मैं एक खराब एपीआई ( java.util.jar.JarFile) के साथ सामना कर रहा हूं । इसकी उम्मीद File fileहै String 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
तो आप बस स्मृति में बाइट्स चाहते हैं?
सोथिरियोस डेलिमोनोलिस

6
क्या आप की कोशिश कर रहे करने के लिए इस के साथ File?
जॉन स्कीट

5
Fileबाई डेफिनिशन हार्ड ड्राइव पर है।
उव प्लोनस

3
यदि आप इसे लगातार मेमोरी पर नहीं चाहते हैं तो फाइल बनाने की क्या बात है?
भाविक शाह

7
वाह, StackOverflow पर कल्पना की कमी आश्चर्यजनक है। किसी को इन-मेमोरी फ़ाइल सरल की आवश्यकता हो सकती है क्योंकि वे एक इंटरफ़ेस का उपयोग कर रहे हैं जिसके लिए एक फ़ाइल की आवश्यकता होती है। इंटरफ़ेस को एक इनपुटस्ट्रीम के लिए लिखा जाना चाहिए था, लेकिन यह नहीं था। एक अस्थायी फ़ाइल बस overkill की तरह लगता है, इसलिए एक स्मृति java.io.File बेहतर होगा।
नवतारा

जवाबों:


30

एक स्ट्रीम में लिखने के लिए, मेमोरी में, उपयोग करें:

new ByteArrayOutputStream();

5
यह प्रश्न का उत्तर नहीं देता है क्योंकि बाइटएयरऑउटपुटस्ट्रीम एक इंटरफ़ेस के साथ प्रयोग करने योग्य नहीं है जिसमें फ़ाइल ऑब्जेक्ट की आवश्यकता होती है।
१२:०२ पर फबेब्लज १aze

1
@FableBlaze खैर, सवाल का जवाब, "यह संभव नहीं है"। यह उत्तर व्यावहारिक होने की कोशिश करता है और बताता है कि उपयोगकर्ता इसके बजाय क्या कर सकता है। एंड्रियास का उत्तर स्पष्ट रूप से अधिक गहन और बेहतर (ए) उत्तर पर प्रयास है।
haraldK

"यह संभव नहीं है" मेरी राय में एक मान्य उत्तर होगा। हालाँकि मुझे लगता है कि इन-मेमरी फाइलसिस्टम (एंड्रियास के उत्तर की टिप्पणियों में उल्लिखित) का भी उल्लेख किया जा सकता है, क्योंकि यदि आप किसी कारण से हार्ड-ड्राइव पर लिखते हैं, तो यह एक तरीका हो सकता है।
फैबलब्लज

80

मैं मेमोरी में नई फ़ाइल (java.io से) कैसे बना सकता हूं, हार्ड डिस्क में नहीं?

शायद आप भ्रमित कर रहे हैं Fileऔर Stream:

  • Fileफ़ाइल और निर्देशिका पथनामों का एक सार प्रतिनिधित्व है । किसी Fileऑब्जेक्ट का उपयोग करके , आप फ़ाइल सिस्टम में फ़ाइल मेटाडेटा तक पहुँच सकते हैं, और इस फाइल सिस्टम पर फ़ाइलों पर कुछ ऑपरेशन कर सकते हैं, जैसे फ़ाइल को हटाना या बनाना। लेकिन Fileवर्ग फ़ाइल सामग्री को पढ़ने और लिखने के तरीके प्रदान नहीं करता है।
  • किसी फ़ाइल से पढ़ने और लिखने के लिए, आप किसी Streamऑब्जेक्ट का उपयोग कर रहे हैं , जैसे FileInputStreamया FileOutputStream। इन धाराओं को किसी Fileऑब्जेक्ट से बनाया जा सकता है और फिर फ़ाइल से पढ़ने और लिखने के लिए उपयोग किया जा सकता है।

आप एक बाइट बफ़र के आधार पर एक स्ट्रीम बना सकते हैं जो मेमोरी में रहता है , एक ByteArrayInputStreamऔर ByteArrayOutputStreamएक बाइट बफर को पढ़ने और लिखने के लिए उसी तरह से जिस तरह से आप एक फाइल से पढ़ते हैं और लिखते हैं। byteसरणी "फाइल के" सामग्री है। आपको Fileतब किसी ऑब्जेक्ट की आवश्यकता नहीं है ।

दोनों File...और ByteArray...धाराओं से विरासत java.io.OutputStreamऔर java.io.InputStream, क्रमशः, ताकि आप कि क्या आप एक फ़ाइल से या बाइट सरणी से पढ़ रहे हैं छिपाने के लिए आम सुपर क्लास उपयोग कर सकते हैं।


95
मुझे यकीन नहीं है कि यह वही है जो मूल पोस्टर चाहता था, लेकिन एक उदाहरण जब "मेमोरी में फ़ाइल" उपयोगी होगा, जब आप किसी मौजूदा लाइब्रेरी का पुन: उपयोग करना चाहते हैं, जिसे एक java.io.File की आवश्यकता इनपुट इनपुट पैरामीटर के रूप में है, लेकिन आप वास्तव में स्मृति में संग्रहीत "फाइलों" का उपयोग करना चाहते हैं। उस मामले में, मुझे लगता है कि एक समाधान Apache Commons VFS का उपयोग एक DefaultFileSystemManager को तुरंत करने के लिए किया जाएगा और एक RamFileProvider बनाने के लिए इसका उपयोग किया जाएगा। मैंने इसे (अधिक पूर्ण) उचित उत्तर के रूप में जोड़ा होगा, लेकिन ऐसा लगता है कि यह प्रश्न कुछ समय पहले बंद कर दिया गया है ...
सोरिन पोस्टेलनिकु

2
+1 मैं इस तरह के समाधान की तलाश में था, एक वास्तविक फ़ाइल का उपयोग किए बिना इकाई परीक्षण के घटक पर
GClaramunt

3
यदि आप "वास्तविक फ़ाइल" नहीं बनाना चाहते हैं, तो आप एक अस्थायी फ़ाइल बनाने का प्रयास कर सकते हैं। के createTempFileलिए देखें java.io.file। यूनिट टेस्ट से बाहर निकलने पर यह फाइल ऑटो डिलीट करने के लिए सेट की जा सकती है।
एंड्रयू-डफ्रेसने

2
इस सवाल का जवाब नहीं है। जैसा कि @SorinPostelnicu ने कहा है कि मेमोरी में एक "फाइल" मेमोरी में एक फाइलसिस्टम जैसा है।
फेलिप

1
संभवतः ओपी के उपयोग के मामले और महंगी प्रणाली डिस्क i / o के साथ विलंबता को कम करने का एक मूल्यवान तरीका है।
एडी बी

3

आप इन-मेमोरी फ़ाइल सिस्टम का उपयोग कर सकते हैं, जैसे कि जिमफॉज़

यहाँ उनके 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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.