-
IO流 (输入流、 输出流) 字节流、字符流 1.字符流 (1)InputStream OutputStream 都是抽象类 InputStream 抽象了应用程序读取数据方式 OutputStream 写出 (2)EOF=End 读到-1结束 (3)输入流基本方法: int b=in.read(); 读取一个字节 无符号 填充道整型的低8位 前面补0 -1是EOF in.read(byte[] buf) 直接读到字节数组buf in.read(byte[] buf,int start,int size) (4)输出流基本方法: out.write(int b) 写出一个byte到流 b的低8位 整型是32位 out.write(byte[] buf) 将buf字节数组都写入到流 out.write(byte[] buf,int start,int size) (5)FileInputeStream -->具体实现了在文件上读取数据查看全部
-
随机读取文件有一个很大的好处,例如进行文件下载时候,这个文件很大用五个程序同时去下载,每个程序去下载一部分,最终要把这个文件再拼接成一个文件就要知道每个部分的开始与结束位置(即file.getFilePointer();随机读取指针的位置)。 迅雷为例!!! RandomAccessFile : java提供的对文件内容的访问 既可以读文件 也可以写文件 支持随机访问文件 可以访问文件的任意位置 (1)java文件模型 : 在硬盘上的文件是byte byte byte 存储的 是数据的集合 (2)打开文件 有两种模式 rw 读写 r只读 RandomAccessFile raf=new RandomeAccessFile(file,"rw"); 文件指针, pointer=0; (3)写方法 raf.write(int) ----> 只写一个字节 (后8位) 同时指针指向下一个位置 准备再次写入 (4)读方法 int b=raf.read(); 读一个字节 (5)文件读写完成后一定要关闭 oracle 官方说明 raf.write(int) 写八位。 实际操作的是低八位。为了让低八位变成高八位,就要先把高八位变成低八位。 因为int i=0x7fffffff;Int有符号(最高一位表示正负), 所以 一共有4*8-1位可以用来表示数字其中最高位是0-7 raf.write(i>>>24),将i右移24位,那么i 就应该是0x0000007f 写入 7f 顺序写入的话,最先写的最然成了最左边, 就成了高位 raf.write(i>>>16),将i右移16位,那么i 就应该是0x00007fff //写入ff raf.write(i>>>8),将i右移8位,那么i 就应该是0x007fffff //写入ff raf.write(i),那么i 就应该是0x7fffffff //写入ff 所以一共写入了7fffffff,从时间上来看,7f最先写就成了最高位 byte [] buf=new byte[(int)raf.length];//表示是定义了一个长度为raf文件大小的定长字节数组 定义大小时只能填入整型int。所以最大就是Integer.MAX_VALUE查看全部
-
字符流:Reader Writer 字符的处理,一次处理一个字符,底层仍然是基本的字节序列。 InputStreamReader完成byte流解析为char,按照编码解析。 OutputStreamWriter提供char流到byte流,按照编码处理。查看全部
-
序列化过程中子父类构造函数问题 一、父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,父类实现了序列化接口,则不会递归调用其构造函数。 二、父类未实现serializable接口,子类自行实现可序列化 2、子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数。 *** 结论:【反序列化时】,向上递归调用构造函数会从【可序列化的一级父类结束】。即谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。查看全部
-
1.transient 关键字:被transient修饰的元素,该元素不会进行jvm默认的序列化 注意:在以后的网络编程中,如果有某些元素不需要传输,那就可以用transient修饰,来节省流量;有效数据序列化,无效数据就不需要序列化了,提高效率 2.被transient修饰的元素,不能进行默认的序列化,但可以自己完成这个元素的序列化 transient关键字修饰的属性默认是不能序列化的,但是可以使用writeObject自己完成这个元素的序列化。ArrayList就是用了此方法进行了优化操作。ArrayList最核心的容器Object[] elementData使用了transient修饰,但是在writeObject自己实现对elementData数组的序列化。只序列化实际有的元素,对于数组中空的元素不进行序列化。 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException private void readObject(java.io.ObjectInputStream s) throws java.io.IOException,ClassNotFoundException查看全部
-
BufferedInputSteram和BufferedOutputStream: 提供了带缓冲区的操作,一般打开文件进行写入或读取时,都会加上缓冲,提高了IO的性能。 FileOutputStream--->write()一滴一滴写 DataOutputStream--->writeXXX()相当与一瓢一瓢的写 BufferedOutputStream--->write()相当于一瓢一瓢先放入桶中,然后一整桶写 使用BufferedInputSteram和BufferedOutputStream时,要到用flush()刷新缓冲区。查看全部
-
DataOutputStream和DataInputStream: 对“流”功能的扩展,可以更加方便的读取int、long、字符等类型数据。 DataOutputStream方法: writeInt()/writeDouble()/writeUTF():采用utf-8编码写出。查看全部
-
IO——对象的序列化和反序列化 一、概念 1、对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 2、序列化流(ObjectOutputStream),字节的过滤流 —— writeObject()方法 反序列化流(ObjectInputStream) —— readObject()方法,读出来是object类 记得转换 3、序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常。 这个借口,没有任何方法,只是一个【标准】查看全部
-
5.字符流:字符流分为输出流(Reader)和输出流(Writer)。操作的是文本文件。 字符处理,一次处理一个字符 字符处理底层还是基本的字节序列 InputStreamReader:完成byte流解析为char流,按照编码解析 FileInputStream in = new FileInputStream("e:\\javaio\\imoocutf8.txt"); //获取字符输入流 InputStreamReader isr = new InputStreamReader(in,"utf-8");//默认项目的编码,操作的时候,要写文件本身的编码格式 OutputStreamWriter:提供char流到byte流,按照编码处理 FileOutputStream out = new FileOutputStream("e:\\javaio\\imoocutf81.txt"); //获取字符输出流 OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8"); FileReader/FileWriter:可以直接写文件名的路径。与InputStreamReader相比坏处:无法指定读取和写出的编码,容易出现乱码。 FileReader fr = new FileReader("e:\\javaio\\imooc.txt"); //输入流 FileWriter fw = new FileWriter("e:\\javaio\\imooc2.txt");//输出流查看全部
-
字节流: InputStream、OutputStream 输入流基本方法: int b = in.read();//读取一个字节无符号填充到int的低八位,返回值-1是指读到结束 in.read(byte[] buf);//读取数据填充到字节数组中 in.read(byte[] buf, int start, int size)// 指定开始和长度放入字节数组中 输出流基本方法: out.write(int b);//写一个byte到流,b的低八位 out.write(byte[] buf);//将buf字节数组都写入到流中 out.write(byte[] buf, int start, int size);//指定开始和长度放入字节数组中写入到流中查看全部
-
raf.getFilePointer()获取当前指针位置 raf.length()获取文件长度 raf.seek()把指针指定到某一位置查看全部
-
RandomAccessFile提供对文件的内容访问,既可以读文件,也可以写文件。 RandomAccessFile支持随机访问文件,可以访问文件的任意位置。 两种模式:rw读写 r只读 RandomAccessFile raf = new RandomAccessFile(file, "rw") raf.write(int):只写一个字节(后8位),同时指针指向下一个位置,准备再次写入。 int b = raf.read():读一个字节 文件读写完成以后要关闭。查看全部
-
java是双字节编码 utf-16be 中文两个字节 英文两个字节 GBK中文占两个字节,英文1个字节;utf-8中文占三个字节,英文占1个字节。 文本文件,就是字节序列。可以是任意编码的字节序列,如果我们是在中文机器上直接创建文本文件,那么该文本文件只认识ANSI编码。(联通、联这是一种巧合,他们正好符合了utf-8编码的规则。) Eclipes中什么样子的编码项目就只认识该编码的文字,换一种编码就会出现乱码。 当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码 String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 String s="慕课ABC"; byte[] bytes1=s.getBytes(); //转换成字节序列用的是项目默认的编码gbk for (byte b:bytes1){ //把字节转换成了int 以16进制的方式显示 system.out.println(Integer.toHexString(b & 0xff)+" "); // c4 bd bf ce 41 42 43 } byte[] bytes2=s.getBytes("gbk"); //手动定义用gbk编码 效果相同 但会有异常 中文两个字节 英文一个 byte[] bytes3-s.getBytes("utf-8"); // e6 85 95 e8 af be 中文三个字节 英文一个 //java是双字节编码 utf-16be 中文两个字节 英文两个字节 byte[] byte4=s.getBytes("utf-16be"); String str1=new String(bytes4); //会出现乱码 当你的字节序列是某种编码时,这个时候把自己序列变成字符串,也需要用这种编码方式,否则会出现乱码 String str2=new String(bytes4,"utf-16be"); //这样就不会出现乱码了查看全部
-
序列化过程中子父类构造函数问题 一、父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,父类实现了序列化接口,则不会递归调用其构造函数。 二、父类未实现serializable接口,子类自行实现可序列化 2、子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数。 *** 结论:【反序列化时】,向上递归调用构造函数会从【可序列化的一级父类结束】。即谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。查看全部
-
1.transient 关键字:被transient修饰的元素,该元素不会进行jvm默认的序列化 注意:在以后的网络编程中,如果有某些元素不需要传输,那就可以用transient修饰,来节省流量;有效数据序列化,无效数据就不需要序列化了,提高效率 2.被transient修饰的元素,不能进行默认的序列化,但可以自己完成这个元素的序列化 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException private void readObject(java.io.ObjectInputStream s) throws java.io.IOException,ClassNotFoundException查看全部
举报
0/150
提交
取消