কিভাবে একটি নতুন java.io.File স্মৃতিতে তৈরি করবেন?


105

হার্ড ডিস্কে নয়, আমি কীভাবে মেমরিতে নতুন File(থেকে java.io) তৈরি করতে পারি ?

আমি জাভা ভাষা ব্যবহার করছি। আমি হার্ড ড্রাইভে ফাইলটি সংরক্ষণ করতে চাই না।

আমি একটি খারাপ API ( 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সংজ্ঞা দ্বারা হার্ড ড্রাইভ হয়।
উওয়ে প্লোনাস

4
আপনি যদি অবিচ্ছিন্ন স্মৃতিতে না চান তবে কোনও ফাইল তৈরি করার কী দরকার?
ভাভিক শাহ

9
বাহ, স্ট্যাকওভারফ্লোতে কল্পনার অভাব চমকপ্রদ। কারও কাছে মেমরি-ইন ফাইল সহজ লাগতে পারে কারণ তারা এমন একটি ইন্টারফেস ব্যবহার করছেন যা একটি ফাইলের প্রয়োজন। ইন্টারফেসটি একটি ইনপুট স্ট্রিমের জন্য লেখা উচিত ছিল, তবে তা ছিল না। একটি টেম্প ফাইলটি কেবল ওভারকিলের মতো মনে হয়, তাই একটি ইন-মেমরি জাভা.আইও.ফাইলে ভাল।
নভেটরতা

উত্তর:


30

একটি স্ট্রিমে লিখতে, মেমরিতে, ব্যবহার করুন:

new ByteArrayOutputStream();

6
এটি প্রশ্নের উত্তর দেয় না যেহেতু বাইটআরআউটআউটপুট স্ট্রিম এমন কোনও ইন্টারফেসের সাথে ব্যবহারযোগ্য নয় যা একটি ফাইল অবজেক্টের প্রয়োজন।
ফেবলব্লেজ

4
@ ফ্যাবলব্লেজ ওয়েল, তখন প্রশ্নের উত্তর, "এটি সম্ভব নয়"। এই উত্তরটি ব্যবহারিক হওয়ার চেষ্টা করে এবং ব্যবহারকারী পরিবর্তে কী করতে পারে তা বলার চেষ্টা করে। Andreas এর উত্তর পরিষ্কারভাবে আরও পুঙ্খানুপুঙ্খ এবং আরও ভাল (একটি চেষ্টা) উত্তর।
haraldK

"এটি সম্ভব নয়" আমার মতে একটি বৈধ উত্তর হবে। তবে আমি মনে করি যে একটি মেমোরি ফাইল সিস্টেম (আন্দ্রেসের উত্তরের মন্তব্যে উল্লিখিত) এছাড়াও উল্লেখ করা যেতে পারে, কারণ যদি আপনি কোনও কারণে হার্ড-ড্রাইভে লিখতে না পারেন তবে এটি তার চারপাশের উপায় হতে পারে।
ফেবলব্লেজ

83

হার্ড ডিস্কে নয়, আমি কীভাবে মেমরিতে নতুন ফাইল (java.io থেকে) তৈরি করতে পারি?

হতে পারে আপনি বিভ্রান্ত করছেন Fileএবং Stream:

  • Fileফাইল এবং ডিরেক্টরি প্যাথনামগুলির একটি বিমূর্ত উপস্থাপনা । কোনও Fileঅবজেক্ট ব্যবহার করে , আপনি কোনও ফাইল সিস্টেমে ফাইল মেটাডেটা অ্যাক্সেস করতে পারেন এবং এই ফাইল সিস্টেমে ফাইলগুলিতে কিছু অপারেশন করতে পারেন, যেমন ফাইল মুছুন বা তৈরি করুন। কিন্তু Fileশ্রেণী পড়া এবং ফাইল বিষয়বস্তু লিখতে পদ্ধতি প্রদান করে না।
  • একটি ফাইল থেকে পড়তে এবং লিখতে, আপনি একটি Streamঅবজেক্ট ব্যবহার করছেন , যেমন FileInputStreamবা পছন্দ করেন FileOutputStream। এই স্ট্রিমগুলি কোনও Fileঅবজেক্ট থেকে তৈরি করা যেতে পারে এবং তারপরে ফাইল থেকে পড়তে এবং লিখতে ব্যবহার করা যেতে পারে।

আপনি কোনও বাইট বাফারের উপর ভিত্তি করে একটি স্ট্রিম তৈরি করতে পারেন যা মেমরিতে থাকে , একটি ByteArrayInputStreamএবং একটি ব্যবহার করে ByteArrayOutputStreamপড়তে এবং বাইট বাফারকে একইভাবে আপনি কোনও ফাইল থেকে পড়তে এবং লিখতে লিখতে। byteঅ্যারে "ফাইল এর" সামগ্রী রয়েছে। আপনার Fileতখন কোনও জিনিসের দরকার নেই ।

উভয় File...এবং ByteArray...স্ট্রিম যথাক্রমে থেকে java.io.OutputStreamএবং উত্তরাধিকার সূত্রে প্রাপ্ত java.io.InputStream, যাতে আপনি কোনও ফাইল থেকে বা বাইট অ্যারে থেকে পড়ছেন কিনা তা লুকানোর জন্য আপনি সাধারণ সুপারক্লাসটি ব্যবহার করতে পারেন।


97
আমি নিশ্চিত নই যে এটির মূল পোস্টারটি কী চেয়েছিল, তবে একটি উদাহরণ যখন "মেমরির ফাইল" কার্যকর হবে তখন আপনি যখন কোনও বিদ্যমান লাইব্রেরিটির পুনরায় ব্যবহার করতে চান তবে একটি ইনপুট প্যারামিটার হিসাবে java.io.File প্রয়োজন, তবে আপনি আসলে মেমোরিতে থাকা "ফাইল" ব্যবহার করতে চান। সেক্ষেত্রে, আমি মনে করি যে একটি সমাধান হ'ল অ্যাপাচি কমন্স ভিএফএস ব্যবহার করে একটি ডিফল্টফাইলে সিস্টেম ম্যানেজার ইনস্ট্যান্ট করা এবং এটি একটি র‌্যামফিলপ্রোভাইডার তৈরি করতে ব্যবহার করা। আমি এটিকে (আরও সম্পূর্ণ) যথাযথ উত্তর হিসাবে যুক্ত করতাম তবে মনে হয় এই প্রশ্নটি কিছু সময় আগে বন্ধ হয়ে গেছে ...
Sorin Postelnicu

4
+1 আমি এই ধরণের সমাধানটির সন্ধান করছিলাম, ইউনিট টেস্টে আসল ফাইলটি ব্যবহার না করেই উপাদান আসবে
GClaramunt

4
আপনি যদি "প্রকৃত ফাইল" তৈরি করতে না চান তবে আপনি একটি অস্থায়ী ফাইল তৈরির চেষ্টা করতে পারেন। createTempFileজন্য দেখুন java.io.file। ইউনিট পরীক্ষাটি প্রস্থান করার সময় এই ফাইলটি স্বয়ংক্রিয়ভাবে মুছতে সেট করা যেতে পারে।
অ্যান্ড্রু-ডুফ্রেসন

4
এটি প্রশ্নের উত্তর দেয় না। @ সোরিনপোস্টেলনিকু যেমনটি বলেছেন ঠিক তেমনই একটি ফাইল "মেমোরি" মেমরির মধ্যে একটি ফাইল সিস্টেমের মতো।
ফিলিপ

4
সম্ভবত ওপি-র ব্যবহারের ক্ষেত্রে এবং ব্যয়বহুল সিস্টেম ডিস্ক আই / ও-এর সাহায্যে বিলম্বকে হ্রাস করার একটি মূল্যবান পদ্ধতির অঙ্ক করে।
এডি বি

6

আপনি ইন-মেমরি ফাইল সিস্টেম যেমন জিম্ফস ব্যবহার করতে পারেন

এখানে তাদের রেডমি থেকে ব্যবহারের উদাহরণ রয়েছে:

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.