-
序列化时父类构造函数:<br> 1.子类在反序列化时,父类实现了序列化接口,怎不会递归调用其构造函数<br> 而父类实现了serializable接口,子类继承就可序列化<br> 2.子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数<br> 父类未实现serializable接口,子类自行实现可序列化<br> 结论:当父类实现了serializable接口,子类可以被序列化,当对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,则其父类的构造函数会被调用,反之父类的构造函数不会被调用。归结为有序列化接口的构造函数不会被调用查看全部
-
引用: 序列化: 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的反序列化操作查看全部
-
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里,对数组的有效对象进行序列化查看全部
-
BufferedReader br = new BufferReader(new InputStreamReader (new FileInputStream("E:\\java\\a.txt")));//文件读取缓冲区 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter (new FileOutputStream("E:\\java\\c.txt")));//文件输入缓冲区 bw.newLine();//读取一行 PrintWriter pw = new PrintWriter("E:\\java\\c.txt");//替代BufferedWriter pw.println();//读取一行 PrintWriter pw1 = new PrintWriter(OutputStreamWriter,boolean autoFlush);//可以进行自动刷新操作查看全部
-
FileReader,FileWriter可以直接读文本文件,但是乱码问题无法解决。所以采用FileInputStream和InputStreamReader组合能解决前者问题。查看全部
-
字符流: 1)编码问题 2)认识文本和文本文件 java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码) 文件是byte byte。。。。的数据序列 文件文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为 byte的存储结果 3)字符流常用的类--》一般处理文本文件 reader(输出流),writer(输入流) 字符的处理:一次处理一个字符 字符的底层是基本的字节序列 字符流在java中的基本实现: InputStreamReader 完成byte流解析为char流,按照编码解析 OutputStreamWrite 提供char流到byte流,按照编码处理 代码: //对文件进行读操作 FileInputStream in=new FileInputStream("文件路径"); //默认按gbk编码,也可以指定编码方式,如果文件与默认不一致就要指定编码方式与文件编码方式一致 InputStreamReader isr=new InputStreamReader(in); //方法一单字节读取 int c; while((c=isr.read())!=-1){ System.out.print((char)c); } //方法二:批量读取 char[] buffer=new char[8*1024]; //批量读取存到buffer字符数组中 while((c=isr.read(buffer,0,buffer.length)!=-1){ String s=new String(buffer,0,C); System.out.print(s);}查看全部
-
BufferedInputStream&BufferedOutputStream 提供了带缓存区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了IO的性能 从应用程序中把输入放入文件,相当于将一罐水倒入到另外一个罐中: FileOutputStream-->write()方法相当于一滴一滴地把水“转移”过去 DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移” BuffereOutputStream-->write()方法更方便,相当于一瓢一瓢先放入 桶中,在从桶中倒入到另外一个池中查看全部
-
InputStreamReader //文件读取转换器<br> OutputStreamWriter //文件写入转换器<br> char[] ch = new char[10*1024];//对文件进行先存储<br> String s = new String(ch,0,c);//把读取到的文件转化成字符串 在转换流中,在操作文件时需要把文件的编码格式编程自身的编码格式,否则是系统默认的UTF-8的编码格式查看全部
-
DataOutputStream/DataInputStream 对流功能的扩展,可以更加方便的读取,int long 字符等类型数据 writeInt/Double/UTF() 代码:DataOutputStream String file="demo/dos.dat"; DataOutputStream dos=new DataOutputStream( new FileOutputStream(file)); dos.writeInt(10); //采用utf-8写出 dos.writeUTF("中国"); //采用utf-16be编码写出 dos.writeChars("中国"); 代码:DataIntputStream DataInputStream dis=new DataInputStream( new FileInputStream(file)); int/long/Double/String i=dis.readInt/Long/Double/UTF();查看全部
-
输入、输出是相对于字节流或者字符流而言的:<br> 1:输入,是将字节或者字符从文件中输入到流中<br> 2:输出,是将字节或者字符从流中输出到文件中<br> <br> 我们可以将文件想象程容器,将文件的内容(字节或者字符)想象程水,我们这里学习的JAVA对象就像是管道一样,并且能够控制从水池里获取水形成输入流,也可以将水注入到水池中形成输出流。 如果文件不存在,则创建;如果存在,则删除后再创建,但是换一种构造方法加一个true就可以变成在文件后追加内容了 单字节输出每次输出一个字符的低八位。输出一个int类型字符需要移位输出四次查看全部
-
1、byte 类型 8 位,int 类型 32 位,为了避免数据转换错误,通过 & 0xff 将高 24 位清零 2、long time = System.currentTimeMillis() 当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量) 3、is.read() 单字节适合读取 小 文件 is.read(byte[] bytes,int star,int size) 字节数组适合读取 大 文件 读取文件最常用的是批量读取int bytes = fis.read(buf, 0 , buf.length); FileInputStream文件输入 单字节输入即不用数组。 /** * 批量读取,对大文件而言效率高,也是我们最常用的读文件的方式 * @Inparam fileName * @throws IOException */ public static void printHexByByteArray(String fileName)throws IOException{ FileInputStream in = new FileInputStream(fileName); byte[] buf = new byte[8 * 1024]; /*从in中批量读取字节,放入到buf这个字节数组中, * 从第0个位置开始放,最多放buf.length个 * 返回的是读到的字节的个数 */ int bytes = in.read(buf,0,buf.length);//一次性读完,说明字节数组足够大 int j = 1; for(int i = 0; i < bytes;i++){ System.out.print(Integer.toHexString(buf[i] & 0xff)+" "); if(j++%10==0){ System.out.println(); } }查看全部
-
IO流 1.字节流 1)InputStream、OutputStream 抽象应用程序读写数据的方式 2)EOF = End 读到-1就读到结尾 3)输入流 int b in.read();读取一个字节 in.read(byte[] buf) 读取数据填充到字节数组 in.read(byte[] buf,int start,int size) 4)输出流 out.write(int b) out.write(byte[] buf) out.write(byte[] buf,int start,int size) 5)FileInputStream 具体实现了在文件上的读取操作查看全部
-
RandomAccessFile 可以随机访问文件<br> RandomAccessFile raf = new RandomAccessFile(File file , "rw");//其中rw表示读写操作,r表示只读操作<br> <br> raf.seek(0); // 在读取文件时要先把指针移动到开头<br> Arrays.toString();// 输出字节数组 raf.writeInt(); //可以读取int型<br> raf.write();// 可读取字符串或者中文字节;<br> raf.getFilePointer();// 获取指针所在位置 Arrays.toString();/按数组形式输出查看全部
-
Stirng[] file = dir.list(); //返回字符串数组(直接子目录的名称)不包含子目录的内容 File [] file = dir.listFiles();// 返回子目录中的内容 如果判断file是目录则继续调用前面的文件方法判断方法进行递归操作查看全部
-
字节编码注意事项: a.文本文件本身就是“字节编码”,并且可以是任意编码的字节序列。 b.中文机器上“直接创建”的文本文件,只认ansi编码。 c.gbk编码中文2个字节,英文1个字节 d.Java本身是双字节编码:utf-16be,(中、英文都是2个字节)。 e.utf-8编码中文3个字节,英文2个字节。 注: a.将字节转换成int并以16进制显示: Integer.toHexString(b & 0xff) b.设置字节编码: getBytes("utf-8"); c.将字节码转换成字符串: String s = new String(byte1,"utf-8");查看全部
举报
0/150
提交
取消