时间:2021-05-20
IO流
Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里面用的就是字节流
下面这张图是Java中IO流的总体框架:
字节流
Java中字节流一般都是以stream结尾的,输入的字节流叫InputStream,输出字节流叫OutputStream;InputStream和OutputStream是表示自己输入/输出的所有类的超类,是抽象类(abstract)
常用的字节流有:
1.FileInputStream/FileOutputStream2.BufferedInputStream/BufferedOutputStream3.SequenceInputStream(序列流)4.ObjectInputStream/ObjectOutputStream(对象的输入输出流)5.PrintStream(打印流)字符流
Java中输入字符流是以Reader结尾的,输出字符流是以Writer结尾的,比如我们常见的FileReader和FileWriter就是个字符流,Reader和Witer是输入/输出字符流的超类,也是抽象类
常用的字符流有:
1.FileReader/FileWriter2.BufferedReader/BufferedWriter3.InputStremReader/OutputStreamWriter(转换流)转换流
转换流就是将字节流转换为字符流的类,有两种:
·InputStreamReader·OutputStreamWriterInputStreamReader是个字符流(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 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流解析及代码实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
Java探索之Thread+IO文件的加密解密代码实例
Java IO流相关知识代码解析
java的IO流详细解读
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java中IO流字节流实例详解IO流(输入流、输出流),又分为字节流、字符流。 流是磁盘或其它外围设备中存储的数据的源点或终点。 输入流:程序从输入流读取数
java实现微信服务器下载图片到自己服务器此功能的实现需要注意java中IO流的操作及网路开发,实现代码:/***@authorwhy**/publicclas
java从控制台接收一个数字的实例详解功能:从控制台接收一个数实现代码:importjava.io.*;//引入一个IO流的包publicclasshellow
java文件锁的简单实现java文件锁的功能,隐私文件及安全性的提升,实现起来不难,这里贴下实现代码:实例代码:importjava.io.File;impor
Java中IO流RandomAccessFile类实例详解RandomAccessFilejava提供的对文件内容的访问,既可以读文件,也可以写文件。支持随机访