I/O流:主要操作文件内容,结合前面所学的File类,我们可以读取和写出文件,也可以修改文件的字符集编码...
处理流:
处理流就相当于外衣,每件衣服的作用不同,每个处理流的作用也不同,处理流可以实现多嵌套,即可以有多个处理流,每个处理流的功能不同!
学习大纲:
今天就可以撒花了,I/O流的学习,你有没有很愉快?!
RandomAccessFile流(不写它的名字是因为太广义,我们后面浅称它为:随机读取文件流),步骤还是类似的步骤,但是RandomAccessFile流是有别与之前学习的6种流,随机通道文件流他是直接继承自Object类,并没有实现四大流基类的任意一种类型!!!
随机读取文件流的构造器:
RandomAccessFile(Filefile, Stringmode) 创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。RandomAccessFile(Stringname, Stringmode) 创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。它提供了四中访问模式(mode):rrwrwdrws,常用前两种。r访问模式:只能读取文件内容,文件只读;rw访问模式:可读取/可写出,但是不能实现写出后直接使用该对象读取。
随机读取文件流案例:
publicstaticvoidrandomAccessFileTest(Stringpath){ RandomAccessFileout=null; RandomAccessFileinput=null; try { out=newRandomAccessFile(path,"rw"); input=newRandomAccessFile(path,"r"); out.writeUTF("小红"); out.writeInt(28); out.writeBoolean(true); Stringname=input.readUTF(); System.out.println(name); } catch (IOExceptione) { e.printStackTrace(); } finally { if(out!=null) { try { out.close(); } catch (IOExceptione) { e.printStackTrace(); } } if (input!=null) { try { input.close(); } catch (IOExceptione) { e.printStackTrace(); } } } }
使用指针并实现插入不覆盖效果:
RandomAccessFile随机读取文件流1.包含了一个自由指针,可以读取任意位置的内容;2.它写入文件是从文件开头写出的,所以会出现对源文件的覆盖,要是实现插入不覆盖需要引入前面所学的内容seek(longpos) 设置文件指针偏移,从该文件的开头测量,发生下一次读取或写入。pos-从文件开头测量的偏移位置,用于设置文件指针。
/*** 使用指针并实现插入不覆盖效果* 思路:* 1.引入自由指针,但注意会实现原文件的覆盖* 2.将指定位置后面的内容保存起来,使用数组(麻烦且不确定内容多少) -> 字符串缓冲区!可以是实现内容的动态扩容* 3.指定内容插入后,将缓冲区的内容写入*/publicstaticvoidrandomAccessFileTest02(Stringpath){ RandomAccessFileraf=null; try { raf=newRandomAccessFile(path,"rw"); raf.seek(3);//1.通过指针指定插入位置,保存后续内容//2.设置缓冲区大小,不论后续内容有多少,都不会超过文件的长度StringBuildersb=newStringBuilder((int) raf.length()); //3.将内容读取到缓冲区中bytebuffer[] =newbyte[10]; intlen; while ((len=raf.read(buffer)) !=-1){ for (inti=0; i<len; i++){ sb.append((char) buffer[i]); } } raf.seek(3);//4.回调指针,写出内容raf.writeChars("TOM"); raf.write(sb.toString().getBytes());//5.将字符缓冲区中的内容转换为字节存储到原文件中 } catch (IOExceptione) { e.printStackTrace(); } finally { if (raf!=null) { try { raf.close(); } catch (IOExceptione) { e.printStackTrace(); } } } }/*** 使用指针并实现插入不覆盖效果* 思路:* 1.引入自由指针,但注意会实现原文件的覆盖* 2.将指定位置后面的内容保存起来,使用数组(麻烦且不确定内容多少) -> 字符串缓冲区!可以是实现内容的动态扩容* 3.指定内容插入后,将缓冲区的内容写入*/publicstaticvoidrandomAccessFileTest02(Stringpath){ RandomAccessFileraf=null; try { raf=newRandomAccessFile(path,"rw"); raf.seek(3);//1.通过指针指定插入位置,保存后续内容//2.设置缓冲区大小,不论后续内容有多少,都不会超过文件的长度StringBuildersb=newStringBuilder((int) raf.length()); //3.将内容读取到缓冲区中bytebuffer[] =newbyte[10]; intlen; while ((len=raf.read(buffer)) !=-1){ for (inti=0; i<len; i++){ sb.append((char) buffer[i]); } } raf.seek(3);//4.回调指针,写出内容raf.writeChars("TOM"); raf.write(sb.toString().getBytes());//5.将字符缓冲区中的内容转换为字节存储到原文件中 } catch (IOExceptione) { e.printStackTrace(); } finally { if (raf!=null) { try { raf.close(); } catch (IOExceptione) { e.printStackTrace(); } } } }
后续RandomAccessFile,随机读取文件流,可以应用在具有断点下载,并保存断点位置,如果后续再下载的话保证按照上次断点的位置。
我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能, 下载工具就有类似的应用,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上 一次的地方下载,从而实现断点下载或上传的功能。

