-
序列化过程中子父类构造函数问题 一、父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,父类实现了序列化接口,则不会递归调用其构造函数。 二、父类未实现serializable接口,子类自行实现可序列化 2、子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数。 *** 结论:【反序列化时】,向上递归调用构造函数会从【可序列化的一级父类结束】。即谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。查看全部
-
IO——对象的序列化和反序列化 一、概念 1、对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 2、序列化流(ObjectOutputStream),字节的过滤流 —— writeObject()方法 反序列化流(ObjectInputStream)—— readObject()方法 3、序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常。 这个借口,没有任何方法,只是一个【标准】 二、transient关键字 1、transient修饰的元素,不会进行JVM默认的序列化:如int transient age = 10;在序列化和反序列化后,age的值为默认分配的值0 2、可以自己通过重写序列化操作方式,来对transient修饰的元素进行想要的序列化。 ***方法:通过从ArrayList中拿到writeObject()和readObject()方法,进行自写完成。 · 先执行s.defaultWriteObject(); 和 s.defaultReadObject()方法 · 再对于无法默认序列化的成员,可以进行.writeObject(obj)和this.obj = s.readObject()完成序列化 3、这样做的目的是提高效率。如ArrayList里,对数组的有效对象进行序列化查看全部
-
序列化: transient 关键字:被transient修饰的元素,该元素不会进行jvm默认的序列化,但可以自己完成这个元素的序列化 注意: (1)在以后的网络编程中,如果有某些元素不需要传输,那就可以用transient修饰,来节省流量;对有效元素序列化,提高性能。 (2)可以使用writeObject自己完成这个元素的序列化。ArrayList就是用了此方法进行了优化操作。ArrayList最核心的容器Object[] elementData使用了transient修饰,但是在writeObject自己实现对elementData数组的序列化。只对数组中有效元素进行序列化。readObject与之类似。 (3)java.io.ObjectOutputStream.defaultWriteObject(); // 把jvm能默认序列化的元素进行序列化操作 java.io.ObjectOutputStream.writeInt(age);// 自己完成序列化 (4) java.io.ObjectOutputStream.defaultReadObject();// 把jvm能默认反序列化的元素进行反序列化 this.age = java.io.ObjectOutputStream.readInt(); // 自己完成age的反序列化操作查看全部
-
BufferedInputStream&BufferedOutputStream 提供了带缓存区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了IO的性能 从应用程序中把输入放入文件,相当于将一罐水倒入到另外一个罐中: FileOutputStream-->write()方法相当于一滴一滴地把水“转移”过去 DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移” BuffereOutputStream-->write()方法更方便,相当于一瓢一瓢先放入 桶中,在从桶中倒入到另外一个罐中 带buffer的缓存流一定要加flush方法刷新缓冲区才能写进去。查看全部
-
java 文件写入: 1,创建需要写入的字符串 2,创建文件句柄:File file = new File("文件路径") 3,判断文件是否存在,如果不存在就创建!:if(file.exists()) { file .createNewFile() } 4,创建读取对象:FileWriter fw = new Filewriter( file.getAbsoluteFile()); 5, 创建缓存对象 接收读取对象:BufferedWriter bf = new BufferedWriter(fw); 6, 缓存对象的写入方法,并调用声明的需要写入的字符串对象:bf.Writer(声明的需要写入的字符串对象) 7,关闭缓存写入对象: bf.close(); 8, 注意此处应有IO对象的异常需要捕获!查看全部
-
RamdomAccessFile 提供对文件内容的访问,既可以读文件,也可以写文件。<br> RamdomAccessFile 支持随机访问文件,可以访问文件的任意位置<br> <br> (1)java文件模型<br> 在硬盘上的文件是以byte byte byte形式存储的,是数据的集合<br> (2)打开文件<br> "rw":读写 "r":只读<br> RamdomAccessFile raf = new RamdomAccessFile("fileName", "rw");<br> 打开文件时,文件指针在开头位置,pointer=0<br> (3)写文件<br> raf.write()-->无论括号内的类型是int还是long等,都只写一个字节即最低的八位,同时指针指向下一个位置准备再次写入<br> (4)读方法<br> byte b = raf.read()--->读一个字节<br> <br> byte[] bytes = new byte[(int)raf.length()];<br> raf.read(bytes); // 读整个文件的内容<br> (5)raf.close() 释放资源,养成良好习惯。查看全部
-
缓冲字节流这一节希望重新录更正错误,使用缓冲字节流复制确实是最快的方式,但对于小文件10M以下的文件体现不出优势,对于百兆文件正确使用,时间可以控制到50ms内。视频中的缓冲字节流使用有错误,复制文件最快的做法是将批量读取到的字节数组使用缓冲写入到文件,在机器性能范围内字节数组越大越快。在循环写入的过程中不需要使用flush,就像cwt8805说的,缓冲输入流在关闭的时候会将所有缓冲区的数据全部写入文件,使用flush刷新缓冲就失去了缓冲的意义。最后关闭IO流和文件流应该在finally中关闭,否则IO异常时执行不到close语句,IO流仍然没有关闭。查看全部
-
建议大家在try{}catch{}finally{}中的finally中关闭流查看全部
-
文件编码: 1.gbk:一个中文字符占两个字节,一个英文字符占一个字节,是转换成字节序列时的默认编码方式。 2.utf-8:一个中文字符占三个字节,一个英文字符占一个字节 3.utf-16be:java的编码方式,一个中文和一个英文字符都是占两个字节 4.字节序列转换成字符时要采用相同的编码方式,否则会乱码 5.文本文件就是字节序列,可以是任意编码的字节序列,但是如果直接在中文机器上创建文本文件,那么该文本文件只认识ansi编码查看全部
-
111查看全部
-
Java.IO.File类表示文件或目录,只用于表示文件或目录得信息,不能用于文件的访问。 常用的API: 1.创建File对象:File file=new File(String path);注意:File.seperater();获取系统分隔符,如:”\“. 2.boolean file.exists();是否存在. 3.file.mkdir();或者file.mkdirs();创建目录或多级目录。 4.file.isDirectory()或者file.isFile()判断是否是目录或者是否是文件。 5.file.delete();删除文件或目录。 6.file.createNewFile();创建新文件。 7.file.getName()获取文件名称或目录绝对路径。 8.file.getAbsolutePath()获取绝对路径。 9.file.getParent();获取父级绝对路径。 10.file.getSize();获取文件大小。 11.file.getFormat();获取文件格式名。查看全部
-
String s="慕课ABC"; byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是项目默认的编码 for(byte b: bytes1) System.out.println(Integer.toHexString(b & 0xff)+" ");// & 0xff是为了把前面的24个0去掉只留下后八位 //toHexString这个函数是把字节(转换成了Int)以16进制的方式显示 byte[] bytes1=s.getBytes("gbk");//也可以转换成指定的编码 gbk编码: 中文占用两个字节,英文占用一个字节 utf-8编码:中文占用三个字节,英文占用一个字节 java是双字节编码,是utf-16be编码 utf-16be编码:中文占用两个字节,英文占用两个字节 当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码 String str1=new String(bytes4);//这时会使用项目默认的编码来转换,可能出现乱码 要使用字节序列的编码来进行转换 String str2=new String(bytes4,"utf-16be"); 文本文件就是字节序列,可以是任意编码的字节序列 如果我们在中文机器上直接创建文本文件,那么该文件只认识ANSI编码(例如直接在电脑中创建文本文件)查看全部
-
关于while((b=in.read(buf,o,buf.length))!=-1),b返回的是一共能读取的字节个数,读完则返回-1.查看全部
-
对象序列化反序列化查看全部
-
io流性能比较查看全部
举报
0/150
提交
取消