-
2222222222222222222222222查看全部
-
1111111111111111111查看全部
-
单字节读取不适合读取大文件查看全部
-
批量字节读取的方式,比单字节读取的方式。在读取大文件时用的时间少很多。查看全部
-
5查看全部
-
transient writeobject readobject //有效元素的序列化,免除不必要的序列化,提高效率查看全部
-
网络中传输,对象要进行序列化操作查看全部
-
int b=in.reaf() //读取一个无符号字节填充到int的低八位, in.read(byte[] buf)// 把in中文件直接读取到byte字符数组中 in.read(byte[] buf,int start, int end)直接读取到byte行数组中的从start位到end位查看全部
-
字节和字符的区别:IO流输入输出的基本单位查看全部
-
序列化中子类和父类构造函数的调用问题 1.一个类实现了序列化接口,那么其子类都可以进行序列化 2.在new一个子类时,父类的构造函数也会被调用 3.例子: (1)父类A实现了Serialize,子类A2->A1->A 对A2反序列化时,其父类A1和A的构造函数不会被调用 (2)父类B,子类B1实现了Serialize,且->B,B2->B1 对B2反序列化时,其父类B1的构造函数不会被调用,但B的构造函数将被调用 (3)父类C,子类C1->C,子类C2实现了Serialize,且C2->C1->C 对C2反序列化时,其父类C1和C的构造函数均被调用查看全部
-
transient关键字声明以及ArrayList源码分析 1.transient关键字 如果一个类实现了Serializable接口,那么它内部的所有元素都会被序列化和反序列化。 transient关键字声明某个元素的作用在于,可以自由的序列化和反序列化这个元素。 2.transient关键字声明的元素如何序列化和反序列化? (1)使用transient关键字声明的元素如果想自己序列化,则该类中需要使用writeObject()签名 private void writeObject(ObjectOutputStream s) throws IOException{ s.defaultWriteObject(); //把jvm能默认序列化的元素进行序列化操作 s.writeInt(stuAge); //将stuAge写入ObjectOutputStream流中,自己完成stuAge的序列化 //这里需要注意,因为这里的stuAge是一个int,所以使用writeInt()。若是一个Object,则用writeObject() } (2)使用transient关键字声明的元素如果想自己反序列化,则该类中需要使用readObject()签名 private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException{ s.defaultReadObject(); //把JVM能默认反序列化的元素进行反序列化 this.stuAge = s.readInt(); //自己完成stuAge的反序列化 } 3.使用transient进行声明的好处在于,如果某个对象在网络中传输,有些元素不想被序列化,或者想自己序列化。从而提高了性能。 分析ArrayList源码中序列化和反序列化的部分,它只对有效元素就行了序列化(如图)。反序列化也是这样。查看全部
-
对象的序列化和反序列化 1.主要内容(如图) 2.对象的序列化:ObjectOutputStream ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("demo\\serial.dat")); //ObjectOutputStream的构造函数的参数是OutputStream流,这里创建了一个文件,也可以是一个网络的流 Student stu = new Student("10001", "xzhang76", 27); oos.writeObject(stu); //将Student对象序列化后放入ObjectOutputStream流中,相当于放入创建的文件中 3.对象的反序列化:ObjectInputStream ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileSerial)); //将ObjectInputStream流中的对象反序列化出来,这里是一个文件,也可以是网络的流 Student stu = (Student) ois.readObject(); //反序列化之后保存在Student对象中 System.out.println(stu); 4.需要注意: (1)使用完后关闭close() (2)比较重要,例子中都是来自本地文件创建出来的OutputStream和InputStream,但注意常用的流都是通过网络获取的。 (3)最重要,要将某个类进行序列化和反序列化,这个类必须实现Serializable接口 public class Student implements Serializable{查看全部
-
字符流操作查看全部
-
bytes的结果应该为length整倍数或-1?查看全部
-
字符流的过滤器 1.三个比较重要的类: BufferedReader、BufferedWriter、PrintWriter 2.构造函数 原型new BufferedReader(Reader reader);所以参数是一个Reader对象,可以使用如下两种方式。效果相同 (1) BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile))); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destFile))); (2) BufferedReader br1 = new BufferedReader(new FileReader(srcFile)); BufferedWriter bw1 = new BufferedWriter(new FileWriter(destFile)); 3.从BufferedReader对象中读出一行并放到BufferedWriter对象中 String line; while((line = br1.readLine()) != null){ //一次读取一行,但不能识别换行 bw1.write(line); bw1.newLine(); //单独写出换行 bw1.flush(); } 需要注意:readLine()每次读出一行,但不包括换行,所以写入BufferedWriter时需要换行。 4.使用PrintWriter PrintWriter pw = new PrintWriter(destFile); //构造函数 另一种构造:new PrintWriter(new FileOutputStream(destFile), true); //这里的true是指是否自动flush() while((line = br1.readLine()) != null){ pw.println(line); pw.flush(); //如果使用第二种构造,这里不需要flush() } 注意:使用PrintWriter不需要在意换行,自动会换行。查看全部
举报
0/150
提交
取消