我有一个包含一些信息的文件,如何读取所有信息?
Name names;
try (FileInputStream fileInputStream = new FileInputStream(file)) {
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
names = (Name) objectInputStream.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
答案 0 :(得分:0)
您有几种解决方案,具体取决于输入:
您可以迭代直到流被完全用尽:我认为这是我提供给您的解决方案中最糟糕的解决方案。更糟糕的是,您正在检查是否已达到EOF,同时您应该知道完成的时间(例如:文件格式错误)。
Set<Name> result = new HashSet<>();
try {
for (;;) {
result.add((Name)objectInputStream.readObject());
}
} catch (EOFException e) {
// End of stream
}
return result;
产生输入时,序列化一个集合并在其上调用readObject()
。只要每个对象都实现Serialization
,Serializable
就应该能够读取集合。
static void write(Path path, Set<Name> names) throws IOException {
try (OutputStream os = Files.newOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(os)) {
oos.writeObject(names);
}
}
static Set<Name> read(Path path) throws IOException {
try (InputStream is = Files.newInputStream(path);
ObjectInputStream ois = new ObjectInputStream(is)) {
// WARN Files.newInputStream is not buffered; ObjectInputStream might
// be buffered (I don't remember).
return (Set<Name>) ois.readObject();
}
}
在产生输入时,可以添加一个int
来指示要读取的对象的数量,并对其进行迭代:如果您不太在意集合({ {1}})。结果文件将较小(因为您将没有HashSet
元数据)。
HashSet
另外,int result = objectInputStream.readInt();
Name[] names = new Name[result]; // do some check on result!
for (int i = 0; i < result; ++i) {
names[i] = (Name) objectInputStream.readObject();
}
很好,但是由于它们使用Set
/ hashCode()
删除重复项,因此,如果您定义equals()
/ equals
,则对象可能会更少事后更改(例如:您的hashCode
区分大小写,但现在不区分大小写,例如:Name
)。