Java中io流解析及代码实例
io流
java中io流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里面用的就是字节流
下面这张图是java中io流的总体框架:
字节流
java中字节流一般都是以stream结尾的,输入的字节流叫inputstream,输出字节流叫outputstream;inputstream和outputstream是表示自己输入/输出的所有类的超类,是抽象类(abstract)
常用的字节流有:
1.fileinputstream/fileoutputstream 2.bufferedinputstream/bufferedoutputstream 3.sequenceinputstream(序列流) 4.objectinputstream/objectoutputstream(对象的输入输出流) 5.printstream(打印流)
字符流
java中输入字符流是以reader结尾的,输出字符流是以writer结尾的,比如我们常见的filereader和filewriter就是个字符流,reader和witer是输入/输出字符流的超类,也是抽象类
常用的字符流有:
1.filereader/filewriter 2.bufferedreader/bufferedwriter 3.inputstremreader/outputstreamwriter(转换流)
转换流
转换流就是将字节流转换为字符流的类,有两种:
·inputstreamreader ·outputstreamwriter
inputstreamreader是个字符流(reader),需要包装一个字节流(inputstream);
outputstreamwriter是个字符流(writer),需要包装一个字节流(outputstream)
包装(decorate)
包装的作用的就是在原始的对象的基础上增加新的功能,比如bufferedreader包装一个reader,实际就是对reader功能的增强;原始的reader只能按照一个字符一个字符的读取,经过包装之后形成的bufferedreader就具有了新的功能:直接读取一行(readline)的功能,直观上说这就是所谓的decorate.
在设计模式上这就是典型的装饰模式,其特点是:
1.装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互 2.装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能
对应到我们上来就是,bufferedreader和reader都是个reader,通过包装之后bufferedreader功能增强,但是依然可以当做reader来用(oo的父类引用可以指向子类)
例子
字节流的例子
将mp3文件切割成多份数,然后重新组合起来
package cn.xdian.test; import java.io.file; import java.io.fileinputstream; import java.io.fileoutputstream; import java.io.ioexception; import java.io.sequenceinputstream; import java.util.enumeration; import java.util.vector; public class demo2 { public static void main(string[] args) throws ioexception { cutfile(); //切割mp3文件 mergeflile(); //合并mp3文件 } //合并mp3 public static void mergeflile() throws ioexception{ file dir = new file("/home/gavinzhou/music_test"); //找到文件夹下所有的mp3文件 vector<fileinputstream> vector = new vector<fileinputstream>(); file[] files = dir.listfiles(); for (file file : files){ if(file.getname().endswith(".mp3")){ vector.add(new fileinputstream(file)); } } //通过vector获取迭代器 enumeration<fileinputstream> e = vector.elements(); //创建序列流 sequenceinputstream inputstream = new sequenceinputstream(e); //输出流 fileoutputstream fileoutputstream = new fileoutputstream("/home/gavinzhou/conbine.mp3"); //读取分割的mp3文件 byte[] buf = new byte[1024]; int length = 0 ; while((length = inputstream.read(buf))!=-1){ fileoutputstream.write(buf,0,length); } //关闭流 fileoutputstream.close(); inputstream.close(); } //切割mp3 public static void cutfile() throws ioexception{ file file = new file("/home/gavinzhou/test.mp3"); file dir = new file("/home/gavinzhou/music_test"); //输入字节流 fileinputstream fileinputstream = new fileinputstream(file); //读取文件 byte[] buf = new byte[1024*1024]; int length = 0; for (int i = 0 ; (length = fileinputstream.read(buf))!=-1 ; i++){ fileoutputstream fileoutputstream = new fileoutputstream(new file(dir,"part"+i+".mp3")); fileoutputstream.write(buf,0,length); fileoutputstream.close(); } //关闭流 fileinputstream.close(); } }
字符流的例子
拷贝文件a变为文件b
package cn.xidian.test; import java.io.bufferedreader; import java.io.bufferedwriter; import java.io.file; import java.io.filereader; import java.io.filewriter; import java.io.ioexception; public class demo1 { public static void main(string[] args) throws ioexception { file sourcefile = new file("/home/gavinzhou/a.txt"); file desfile = new file("/home/gavinzhou/b.txt"); //创建输入流 bufferedreader input = new bufferedreader(new filereader(sourcefile)); //创建输出流 bufferedwriter output = new bufferedwriter(new filewriter(desfile)); //读取源文件,写入到新的文件 string line = null; while((line = input.readline()) != null){ output.write(line); output.newline(); } //关闭输入输出流 input.close(); output.close(); } }
打印流的例子
package cn.xidian.test; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.io.printstream; /* 打印流可以打印任意类型的数据,打印数据之前都会先把数据转换成字符串再进行打印 */ class animal{ string name; string color; public animal(string name,string color){ this.name = name; this.color = color; } @override public string tostring() { return "名字:"+this.name+ " 颜色:"+ this.color; } } public class demo6 { public static void main(string[] args) throws ioexception { /* file file = new file("/home/gavinzhou/a.txt"); //创建打印流 printstream printstream = new printstream(file); //打印任何信息到文件中 printstream.println(97); printstream.println(3.14); printstream.println('a'); printstream.println(true); animal a = new animal("老鼠", "黑色"); printstream.println(a); //更改标准的输入输出 system.setout(printstream); //标准输出是到屏幕上 system.out.println("test......."); */ //收集异常的日志信息。 file logfile = new file("/home/gavinzhou/test.log"); printstream logprintstream = new printstream( new fileoutputstream(logfile,true) ); try{ int c = 4/0; //引起异常 system.out.println("c="+c); int[] arr = null; system.out.println(arr.length); } catch(exception e){ e.printstacktrace(logprintstream); //输出到文件而不是屏幕上 } } }
总结
以上就是本文关于java中io流解析及代码实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!