هل هناك وسيلة موجزة لإنشاء مدخلات inportStream في Google Guava؟

StackOverflow https://stackoverflow.com/questions/2363408

  •  23-09-2019
  •  | 
  •  

سؤال

هناك عدد قليل من طرق المصنع في 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 () ، ولكن لا يبدو أن هناك سببًا واضحًا للقيام بالتساوي () على تيارين.

أفهم أن مؤلفي الجوافا يترددون في إضافة مثل هذه الطريقة (التافهة) - ما مدى شيوعًا أن يكون الأمر شائعًا (أو جزئيًا ، ولكن دون معرفة أين تم ترك الدفق ، لذلك يكون جيدًا كما هو غير قابل للاستعمال بعد ذلك) اقرأ دفقين فقط لمعرفة ما إذا كان هل هي نفسها ، دون أي معالجة أخرى للبيانات؟ هل تأتي هذه البايتات من مصدر غير قابل للتكرار ، مثل مقبس الشبكة؟ خلاف ذلك ، إذا كان مجرد ملف في مكان ما ، أو صفيف بايت في الذاكرة ، فهناك طرق أخرى تقرضها لإجراء اختبار المساواة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top