Serialization 在Java 8中有没有一种使用files.lines读取序列化文件的方法

Serialization 在Java 8中有没有一种使用files.lines读取序列化文件的方法,serialization,file-io,lambda,java-8,java-stream,Serialization,File Io,Lambda,Java 8,Java Stream,我试图读取对象的序列化文件,但我想尝试Java8的功能编程特性;然而,我不断得到一个格式错误的异常。显然,Files.lines读取的是流,而不是对象。(因此,格式错误的输入——它无法使用所使用的字符集处理字符串的序列化字符 我通常会使用ObjectInputStream,但我想尝试一些新的东西。Java 8中是否缺少一些东西,允许在lambdas上下文中使用流读取序列化文件 如果您感兴趣,下面是我在了解它正在创建流之前所做的一次尝试(WordDefinitions.dat是一个序列化文件,其中

我试图读取对象的序列化文件,但我想尝试Java8的功能编程特性;然而,我不断得到一个格式错误的异常。显然,Files.lines读取的是流,而不是对象。(因此,格式错误的输入——它无法使用所使用的字符集处理字符串的序列化字符

我通常会使用ObjectInputStream,但我想尝试一些新的东西。Java 8中是否缺少一些东西,允许在lambdas上下文中使用流读取序列化文件

如果您感兴趣,下面是我在了解它正在创建流之前所做的一次尝试(WordDefinitions.dat是一个序列化文件,其中包含来自我称为Definition的类的自定义数据类对象——基本上只是用于实验的字符串):

List defsList=
Files.line(path.get(“WordDefinitions.dat”))
.collect(Collectors.toList());
我甚至尝试了一个明确的演员阵容:

List<String> defsList =
    Files.lines(Paths.get("WordDefinitions.dat"))
        .map(item -> {
            Definition temp = (Definition)item;
            return temp.toString();
         })
         .collect(Collectors.toList());
List defsList=
Files.line(path.get(“WordDefinitions.dat”))
.地图(项目->{
定义温度=(定义)项;
返回温度toString();
})
.collect(Collectors.toList());

否。序列化对象不是行。

没有将
ObjectInputStream
转换为
流的功能,通常,这些功能不能很好地配合使用。最值得注意的是,
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; }
    }
}

不,您没有遗漏任何内容。没有等效的Files.lines()可以返回流。我看到了两个主要原因:1.在文件中保存序列化对象并不常见,应该在IMO中避免(首选更长期、开放和可维护的解决方案,如JSON或XML),2.使用序列化将对象保存到文件时,序列化单个列表或对象集要容易得多。谢谢!我感谢您的输入。是的,正如我在问题文本中所示,我已经解决了这个问题。JB Nizet很好地回答了我的问题--“没有等效的文件.lines()会返回流”。谢谢你的时间。哇!回答太棒了!这帮了我很大的忙!我需要花一段时间来学习其中的新概念,但我迫不及待地要解决它们!我听说过拆分器,但不知道它们是什么或它们的用途。现在我有很好的理由更仔细地研究它们。而且我从未听说过StreamSupport类!Th非常感谢您分享您的知识!
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; }
    }
}
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);
}