将Java中的内容直接存储为二进制文件
来源:互联网 发布:淘宝指南针是正品吗 编辑:程序博客网 时间:2024/05/16 09:41
目前有这个需求,需要将java跑好的结果持久化,但是如果一个个输出为文本文件又不太好办,因为里面东西太多太杂,所以最好的办法是直接输出为二进制文件,把数据连同存储数据的类一起存进去,就行python中的pickle类所做的一样。
在网上转了一圈,大部分是讲如何输出为文本文件的,所以在经过查询和调试以后,给出我自己的方法。
要实现这个功能主要有两点,一是FileOutputStream和ObjectOutputStream的搭配使用,一是Serializable接口的实现。
1.FileOutputStream和ObjectOutputStream的搭配使用
File file = new File(".\\test.dat") ; // 建立文件try{ TestClass tc = new TestClass(5,"akldsj") ; if (!file.exists()) file.createNewFile() ; FileOutputStream fos = new FileOutputStream(file) ; ObjectOutputStream oos = new ObjectOutputStream(fos) ; oos.writeObject(tc); System.out.println("文件已存入"); oos.close(); fos.close();}catch (IOException e){ e.printStackTrace();}
其中TestClass对象tc就是我们要存入的内容。
同理,如果要取出来,则需要FileInputStream和ObjectInputStream的配合
try{ FileInputStream fis = new FileInputStream(file) ; ObjectInputStream ois = new ObjectInputStream(fis) ; TestClass tc = (TestClass)ois.readObject() ; System.out.println(tc); ois.close(); fis.close();}catch (IOException e){ e.printStackTrace();}catch (ClassNotFoundException e){ e.printStackTrace();}
2.Serializable接口的实现
对于自定义类,如果直接使用上述代码是会报错的,所以需要自己定义的类实现Serializable接口,否则会报java.io.NotSerializableException错误
跑去这个接口的定义里发现似乎并没有要自己实现的方法。但是这边要注意有一个很容易忽略的地方,就是serialVersionUID
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)
serialVersionUID有两种显示的生成方式:
一个是默认的1L,比如:
private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
这边采用前一种方法。
class TestClass implements Serializable{ private static final long serialVersionUID = 1L ; private int a ; private String b ; TestClass(int a, String b){ this.a = a ; this.b = b ; } public String toString(){ return String.valueOf(a) + b ; }}
最后得到程序的运行结果是
文件已存入5akldsj
可以看到文件存入后又读出成功,且可以直接使用
- 将Java中的内容直接存储为二进制文件
- JAVA 将数据库中的内容转化为HTML
- 直接下载数据库中的二进制文件
- 如何显示二进制文件中的内容
- 将文件中的内容转化为数组
- oracle存储过程直接将查询结果保存为XML
- PasteAsFile-将剪切板中的内容直接粘贴成文件
- J2ME中使用缓存将屏幕内容存储为Image
- J2ME中使用缓存将屏幕内容存储为图片格式
- J2ME中使用缓存将屏幕内容存储为Image
- 使用python将Sqlite中的数据直接输出为CVS
- 将结构体写入为二进制文件(C++)
- 将txt文件转化为二进制文件
- 将文本文件内容存储在DataSet中的方法总结
- 将文本文件的内容存储在DataSet中的方法总结
- 在 Ubuntu 下直接将二进制文件制作成 rpm 包
- 在 Ubuntu 下直接将二进制文件制作成 rpm 包
- 如何将MSHFlexGrid控件中的内容导出为Excel
- Quartz2D(一)
- Android学习历程--Launcher整体加载流程总结
- Cannot set property ‘innerHTML’ of null 错误原因
- tomcat实现多端口、多域名访问
- ListView使用中的问题
- 将Java中的内容直接存储为二进制文件
- HTML中CSS 添加左缩进和表格边框说明(去掉左右下边框)
- POJ 1258 城市的道路建设
- LeetCode108. Convert Sorted Array to Binary Search Tree
- TR使用css的border不显示问题
- 客户端通过C# 代码直接从服务器下载文件到本地
- Android之WebView使用小技巧
- 百度地图Api error code(locType)为162的问题
- Matlab机器学习之SVM工具箱