Java。如果文件存在则尝试反序列化。否则就不要
Java. Try to deserialize if file exists. Otherwise just don't
我正在使用序列化为我的图书馆管理应用程序获取持久存储(我知道这不是正确的方式,但这是我的教授想要的方式)。
我在 main() 中使用以下代码;
controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros) controlador.getSerializador().abrirArchivo("libros.dat"));
我的 Serializador class 具有 abrirArchivo("FileName.dat")
功能(英文为 openFile)。
该函数如下所示:
public Object abrirArchivo(String nombreDelArchivo) {
Object retorno = null;
try {
lectorArchivos = new ObjectInputStream(new FileInputStream(
nombreDelArchivo));
retorno = lectorArchivos.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return retorno;
}
现在我正在尝试检查程序是否为任何文件获取 FileNotFoundException。如果是这样,它不应该反序列化该文件并转到下一个文件:那只是意味着我的图书馆中还没有书。
问题是,如果该行运行,它似乎将我使用 setListaLibros()
的图书列表设置为空。每当我尝试访问该列表时,我都会收到 NullPointerException。虽然该列表已经初始化为一个空列表,所以只要找不到 "libros.dat" 文件,我只需要将其保留即可。
完成这项工作的正确方法是什么?
您可以在此之前添加一行:controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros) controlador.getSerializador().abrirArchivo("libros.dat"));
检查文件是否存在。如果没有,则提示用户。这样,用户 知道 出了什么问题并可以采取相应措施。
或者,您可以更改 setListLibros
方法,其中如果传递的参数是 null
,那么您不做任何赋值。
就我个人而言,我会选择第一个选项。
作为旁注,请分解您的代码,如下所示:controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros) controlador.getSerializador().abrirArchivo("libros.dat"))
可能难以阅读和调试。
您可以像这样检查文件是否存在:
String fileName;
File f1 = new File(fileName);
if (f1.exists()) {
//Do the work
}
不知道我是否理解问题。但是,正如我在您的代码中看到的那样,当异常 FileNotFoundException 发生时,"retorno" 将保持为空。这就是您获得 setListaLibros(null) 的原因。
然后您的列表将变为空。如果你不想要这种行为,你应该用一个空列表而不是 null 来初始化 "retorno"。
有一个方面其他答案没有提到:为什么当你的库是空的时候没有序列化对象?!
我的意思是:您可以区分 "program runs the first time"(显然不存在序列化数据)或“之前的程序 运行;因此它完全根据序列化数据配置自身。
含义:"being empty" 也可以是库的有效状态。因此,另一种选择是不使用 "special value"(又名 "no file with data")来表示该信息……而是(反)序列化一个空列表。
我正在使用序列化为我的图书馆管理应用程序获取持久存储(我知道这不是正确的方式,但这是我的教授想要的方式)。
我在 main() 中使用以下代码;
controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros) controlador.getSerializador().abrirArchivo("libros.dat"));
我的 Serializador class 具有 abrirArchivo("FileName.dat")
功能(英文为 openFile)。
该函数如下所示:
public Object abrirArchivo(String nombreDelArchivo) {
Object retorno = null;
try {
lectorArchivos = new ObjectInputStream(new FileInputStream(
nombreDelArchivo));
retorno = lectorArchivos.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return retorno;
}
现在我正在尝试检查程序是否为任何文件获取 FileNotFoundException。如果是这样,它不应该反序列化该文件并转到下一个文件:那只是意味着我的图书馆中还没有书。
问题是,如果该行运行,它似乎将我使用 setListaLibros()
的图书列表设置为空。每当我尝试访问该列表时,我都会收到 NullPointerException。虽然该列表已经初始化为一个空列表,所以只要找不到 "libros.dat" 文件,我只需要将其保留即可。
完成这项工作的正确方法是什么?
您可以在此之前添加一行:controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros) controlador.getSerializador().abrirArchivo("libros.dat"));
检查文件是否存在。如果没有,则提示用户。这样,用户 知道 出了什么问题并可以采取相应措施。
或者,您可以更改 setListLibros
方法,其中如果传递的参数是 null
,那么您不做任何赋值。
就我个人而言,我会选择第一个选项。
作为旁注,请分解您的代码,如下所示:controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros) controlador.getSerializador().abrirArchivo("libros.dat"))
可能难以阅读和调试。
您可以像这样检查文件是否存在:
String fileName;
File f1 = new File(fileName);
if (f1.exists()) {
//Do the work
}
不知道我是否理解问题。但是,正如我在您的代码中看到的那样,当异常 FileNotFoundException 发生时,"retorno" 将保持为空。这就是您获得 setListaLibros(null) 的原因。 然后您的列表将变为空。如果你不想要这种行为,你应该用一个空列表而不是 null 来初始化 "retorno"。
有一个方面其他答案没有提到:为什么当你的库是空的时候没有序列化对象?!
我的意思是:您可以区分 "program runs the first time"(显然不存在序列化数据)或“之前的程序 运行;因此它完全根据序列化数据配置自身。
含义:"being empty" 也可以是库的有效状态。因此,另一种选择是不使用 "special value"(又名 "no file with data")来表示该信息……而是(反)序列化一个空列表。