هل هناك وسيلة موجزة لإنشاء مدخلات inportStream في Google Guava؟
سؤال
هناك عدد قليل من طرق المصنع في Google Goaava لإنشاء InputSuppliers ، على سبيل المثال من أ byte[]
:
ByteStreams.newInputStreamSupplier(bytes);
أو من File
:
Files.newInputStreamSupplier(file);
هل هناك طريقة مماثلة لإنشاء InputSupplier
لاجل منحه InputStream
?
وهذا هو ، طريقة أكثر إيجازا من فئة مجهولة:
new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return inputStream;
}
};
الخلفية: أود استخدام inputstreams مع EG Files.copy(...)
أو ByteStreams.equal(...)
.
المحلول
لا ، لم أر شيئًا.
أعتقد أنك وجدت أفضل طريقة.
البديل الوحيد عند تخزين inputStream في صفيف بايت أو ملف وإنشاء مورد مع bytestreams.newInputStreamSupplier () أو files.newinputStreamsupplier () ، لكنني أود أن أشجع على القيام بذلك.
يمكنك أيضا استخدام
public static long copy(InputStream from, OutputStream to)
من عند ByteStreams
يرى:SRC
نصائح أخرى
لا توجد طريقة لتحويل تعسفي InputStream
إلى InputSupplier<InputStream>
, ، لأن InputSupplier<InputStream>
من المفترض أن يكون كائنًا يمكنه إنشاء جديد وجديد InputStream
في كل مرة getInput()
الطريقة تسمى. هذا ممكن فقط عندما يكون المصدر الأساسي للبايت متاحًا لإعادة الاستخدام ؛ ومن هنا طرق المصنع التي تأخذ byte[]
أو File
وإعادة InputSupplier<InputStream>
.
كما يقترح ديميتريس ، InputSupplier
متعلق ب InputStream
بنفس الطريقة Iterable
متعلق ب Iterator
. الفئة المجهولة التي تصفها غير صحيحة لأنها تُرجع نفس دفق في كل مرة getInput()
يسمى ، لذلك سوف تعيد الدعوات اللاحقة InputStream
هذا استنفدت بالفعل ومغلقة.
فيما يلي مشكلة أخرى في فصلك المجهول: جزء من الدافع ل InputSupplier
هو الحد من رؤية الفعلي InputStream
بحيث يمكن إغلاقه تلقائيا. إذا قمت بلفه مرئيًا خارجيًا InputStream
في InputSupplier
ثم تمرير ذلك إلى طريقة فائدة ، قد تغلق طريقة الأداة المساعدة InputStream
. قد تكون على ما يرام مع ذلك ولكن هذا ليس نمط استخدام نظيف يريد الجوافة الترويج له.
عندما وجدت نفسي أرغب في فعل نفس الشيء ، أدركت أنني كنت أفعل ذلك للخلف. بدلا من القيام بذلك:
Files.copy(InputSupplier.of(inputStream), destinationFile);
(غير موجود) ، يجب أن أفعل ذلك بدلاً من ذلك:
ByteStreams.copy(inputStream, Files.newOutputStreamSupplier(destinationFile));
سيكون ذلك خطأ مثل لف مؤلفًا إلى حد كبير ، أشعر أنه لا يوجد مثل أي احتمال لمثل هذا الشيء الذي يدخل في المكتبة. كما يقول Elou ، يمكنك استخدام طريقة bytestreams.copy () ، ولكن لا يبدو أن هناك سببًا واضحًا للقيام بالتساوي () على تيارين.
أفهم أن مؤلفي الجوافا يترددون في إضافة مثل هذه الطريقة (التافهة) - ما مدى شيوعًا أن يكون الأمر شائعًا (أو جزئيًا ، ولكن دون معرفة أين تم ترك الدفق ، لذلك يكون جيدًا كما هو غير قابل للاستعمال بعد ذلك) اقرأ دفقين فقط لمعرفة ما إذا كان هل هي نفسها ، دون أي معالجة أخرى للبيانات؟ هل تأتي هذه البايتات من مصدر غير قابل للتكرار ، مثل مقبس الشبكة؟ خلاف ذلك ، إذا كان مجرد ملف في مكان ما ، أو صفيف بايت في الذاكرة ، فهناك طرق أخرى تقرضها لإجراء اختبار المساواة.