沒有這樣的功能,一個ObjectInputStream
轉換爲Stream<Object>
和概括而言,這些功能沒有發揮好在一起。最值得注意的是,ObjectInputStream
不提供任何方法來識別更多物體是否可用,即流的末尾是否已經達到。
public static Stream<Object> fromFile(File f) throws IOException {
FileInputStream is=new FileInputStream(f);
try {
ObjectInputStream ois=new ObjectInputStream(is);
return StreamSupport.stream(
new Spliterators.AbstractSpliterator<Object>(Long.MAX_VALUE, Spliterator.ORDERED) {
public boolean tryAdvance(Consumer<? super Object> action) {
try {
action.accept(ois.readObject());
return true;
} catch (IOException ex) {
throw new UncheckedIOException(ex);
} catch (ClassNotFoundException ex) {
throw new NoClassDefFoundError(ex.getMessage());
}
}
@Override public Spliterator<Object> trySplit() { return null; }
}, false).onClose(() -> { try { ois.close(); }
catch (IOException ex) { throw new UncheckedIOException(ex); } });
} catch(Throwable t) {
try(FileInputStream toClose=is) { throw t; }
}
}
至於說,該流不知道它的對象的數量,因此需要明確使用limit
,以確保沒有嘗試讀取:
不過,你可以使用下面的方法創建一個流過去的結局是:
File f=File.createTempFile("ser", null);
try(FileOutputStream os=new FileOutputStream(f);
ObjectOutputStream oos=new ObjectOutputStream(os)) {
oos.writeObject("hello");
oos.writeObject(42);
oos.writeObject(Arrays.asList("X", "Y", "Z"));
oos.flush();
}
System.out.println(f+": "+f.length()+" bytes");
try(Stream<Object> s=fromFile(f)) {
s.limit(3).forEach(System.out::println);
}
不,你不會錯過任何東西。沒有等效的Files.lines()會返回Stream
謝謝!我很欣賞這些意見。 – jamesc1101