黑马程序员-java IO笔记(2)

来源:互联网 发布:p2p按天返利的理财源码 编辑:程序博客网 时间:2024/05/20 09:46

------- android培训java培训、期待与您交流!-------


上一篇笔记已经介绍了IO的概况,本片笔记就介绍一下IO体系中的一些其他类

1.合并流

 合并流就是将多个输入流合并到一个输入流里面,可以将多个文件合并成一个文件。
SequenceInputStream是InputStream的一个子类,
构造方法:
SequenceInputStream(Enumeration<? extends InputStream> e)
SequenceInputStream(InputStream s1, InputStream s2)

第二个是直接传入两个InputStream,然后合并成一个流,第一个构造方法接受一个Enumeration,Enumeration是Vector容器中专用的一个迭代器。所以在使用时要么使用Vector来存储InputStream,要么就new一个Enumeration的子类,重写其内部方法才可以使用。下面的代码来合并几个音乐文件,经测试,正常播放!:
//Vector用来装InputStreamVector<FileInputStream> v = new Vector<FileInputStream>();v.add(new FileInputStream("E:/BaiduMusic/Songs/mean - taylor swift.mp3"));v.add(new FileInputStream("E:/BaiduMusic/Songs/you belong with me - taylor swift.mp3"));v.add(new FileInputStream("E:/BaiduMusic/Songs/safe & sound - taylor swift.mp3"));//把Vector的Enumeration作为参数传入SequenceInputStream,就会得到一个合并流。BufferedInputStream bis = new BufferedInputStream( new SequenceInputStream(v.elements()));//设置目的地BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:/sequence.mp3"));int b = 0;//读取并写入到本地while((b = bis.read()) != -1) {bos.write(b);}bis.close();bos.close();
SequenceInputStream并没有一个对应的分割文件的类,要分割文件,必须手动的读取并切割文件。

2.打印流

 打印流就是:PrintStream 和 PrintWriter。PrintStream用来打印byte,PrintWriter用来打印字符。

PrintStream在OutputStream基础之上提供了增强的功能,即可以方便地输出各种类型的数据(而不仅限于byte型)的格式化表示形式。PrintStream的方法从不抛出IOException

PrintWriter提供了PrintStream的所有打印方法,其方法也从不抛出IOException。

与PrintStream的区别:作为处理流使用时,PrintStream只能封装OutputStream类型的字节流,而PrintWriter既可以封装OutputStream类型的字节流,还能够封装Writer类型的字符输出流并增强其功能。PrintStream调用println方法有自动flush功能;PrintWriter只有在设置了autoFlush为true时才能自动刷新:
//设置自动刷新PrintWriter ps = new PrintWriter(new FileOutputStream("d:/abcde.txt"), true);//调用println时会自动刷新缓冲区的ps.println("黑马deee");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s;while( (s = br.readLine()) != null) {ps.println(s);}br.close();ps.close();

PrintWriter和PrintStream对于使用print系列方法的场合,二者基本没什么区别。

3.RandomAccessFile

RandomAccessFile类用来随机访问文件,自身具备读写的方法。随机访问文件的意思就是可以访问文件内部任意一个位置,也可以在任意一个位置写入数据,并不需要从头开始。
直接集成Object,对随机访问文件的读取和写入。
该类不算是IO体系中的子类,而是字节集成自Object,但是它是IO包中的成员,因为它具备读和写功能,内部封装了一个数组,而且通过指针对数组中的元素进行才做。可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。
其实完成读写的原理就是内部封装了字节输入流和输出流。操作数据必然是流。

RandomAccessFile只能操作文件。而且操作文件还有模式,r,只读rw读写,rws,rwd。只能取这四种值。否则报IllegalArgumentException.
如果模式为只读r,不会创建文件,回去读取一个已存在的文件,如果该文件不存在,则会报FileNotFoundExceptioin,如果模式为rw,那么要操作的文件不存在会创建,如果存在不会覆盖。
RandomAccessFile简单实例:
/** * 写入方法 * @throws IOException */public static void write() throws IOException{//创建一个RandomAccessFile类的实例RandomAccessFile raf = new RandomAccessFile("d:/random.txt", "rw");//往文件内部写数据raf.write("李四".getBytes());raf.writeInt(97);raf.write("王五".getBytes());raf.writeInt(99);raf.close();}/** * 写入方法 * @throws IOException */public static void write2() throws IOException{RandomAccessFile raf = new RandomAccessFile("d:/random.txt", "rw");//调整指针到制定位置raf.seek(8*3);//从制定位置开始写数据raf.write("周7".getBytes());raf.writeInt(99);raf.close();}/** * 读取方法 * @throws IOException */public static void read() throws IOException{RandomAccessFile raf = new RandomAccessFile("d:/random.txt", "r");//调整指针位置raf.seek(8*1);//从指定位置读取数据byte[] buf = new byte[4];raf.read(buf);String name = new String(buf);int age = raf.readInt();System.out.println(name + ":" + age);raf.close();}

4.内存操作流

内存操作流顾名思义所要操作的源和目的都是在内存中,主要有:
进行字节操作:ByteArrayInputStream/ByteArrayOutputStream
进行字符操作:CharArrayReader/CharArrayWriter

ByteArrayInputSteam:在构造的时候,需要接受数据源,而且数据源是一个字节数组。
ByteArrayOutputStream:在构造的时候不用定义数据目的,因为,该对象中已经内部封装了一个可变长度的字节数组,这就是数据目的地。因为,这两个流对象,都操作的是数组,并没有使用系统资源,所以不用进行close关闭。

其实内存操作刘就是用流的读写思想来操作数组。简单事例:
String s = "heima";//将字符串s读入ByteArray流中ByteArrayInputStream bai = new ByteArrayInputStream(s.getBytes());//建立一个ByteArray输出流对象,其内部维护了一个缓冲数组,所以在此不需要传入参数ByteArrayOutputStream bao = new ByteArrayOutputStream();//读取输入流中的内容到输出流,并打印。int len = 0;while((len = bai.read()) != -1) {bao.write(len);char c = Character.toUpperCase((char)len);System.out.print(c);}




0 0
原创粉丝点击