欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中io流解析及代码实例

程序员文章站 2023-12-19 14:40:16
io流 java中io流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里面用的就是...

io流

java中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流解析及代码实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

java探索之thread+io文件的加密解密代码实例

java io流相关知识代码解析

java的io流详细解读

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

上一篇:

下一篇: