系统运维系列 之其它流概述及其分类(java应用)

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统运维系列 之其它流概述及其分类(java应用)相关的知识,希望对你有一定的参考价值。

1 前言
本篇博客沿着上一篇博客中I/O流的内容,继续补充其它流的含义和应用。

2 主要内容
2.1 数据输入输出流:DataInputStream/DataOutputStream
以上两种流可以按照基本数据类型大小读写数据,如按照Long大小写出一个数字,写出时占用8字节,读取的时候也可以按照Long类型读取,一次8字节。

public static void main(String[] args) throws IOException{
	DataOutputStream dos = new DataOutputStream(new FileOutputStream("ABC.txt"));
	dos.writeInt(997);
	dos.close();
	DataInputStream dis = new DataInputStream(new FileOutputStream("ABC.txt"));
	int x = dis.readInt();
	System.out.println(x);
}

2.2 打印流:PrintWriter—>字符流/PrintStream—>字节流
该流可以很方便的将对象toString()结果输出,并且自动加上换行,而且可以使用自动刷出模式。

PrintWriter(OutputStream out,boolean autoFlush,String encoding)

举例:

public static void main(String[] args) throws IOException{
	PrintWriter pw = new PrintWriter(new FileOutputStream("ABC.txt"),true);
	//可以自动刷出
	pw.println(97);
	//以下两种写法无法自动刷出
	pw.print(97);
	pw.write(97);
}

//补充:
//System.in是InputStream的标准输入流,可以从键盘上输入读取的字节数据;
//System.out是PrintStream的标准输出流,可以向控制台中输出字符和字节。
//举例:
public static void main(String[] args) throws IOException{
	System.setIn(new FileInputStream("ABC.txt"));
	System.setOut(new PrintStream("AB.txt"));
	InputStream in = System.in;
	PrintStream ps = System.out;
	int b;
	while((b = in.read())!=-1){
		ps.write(b);
	}
	in.close();
	ps.close();
}

2.3 对象流:ObjectInputStream/ObjectOutputStream
可以将一个对象写出,或者读取一个对象到程序中,也就是执行序列化和反序列化的操作。

public static void main(String[] args) throws IOException{
	//序列化
	Person p1 = new Person("AB",23);
	Person p2 = new Person("CD",26);
	ArrayList<Person>list = new ArrayList<>();
	list.add(p1);
	list.add(p2);
	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ABC.txt"));
	oos.writeObject(list);
	oos.close();
	//反序列化
	ObjectInputStream ois = new ObjectInputStream(new FileInputStream("ABC.txt"));
	ArrayList<Person>list = (ArrayList<Person>)ois.readObject();
	for(Person p : list){
		System.out.println(p);
	}
	ois.close();
}

2.4 序列流:SequenceInputStream
可以把多个字节输入流整合成一个序列,从序列中读取数据时将从被整合的第一个流开始读取,读完一个之后继续读取第二个,以此类推。

Vector<FileInputStream> v = new Vector<>();
v.add(new FileInputStream("ABC.txt"));
v.add(new FileInputStream("DEF.txt"));
Enumeration<FileInputStream>en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);

2.5 内存输出流:ByteArrayOutputStream
该输出流可以向内存中写数据,把内存当作一个缓冲区,写出之后可以一次性取出所有数据。

public static void main(String[] args) throws IOException{
	FileInputStream fis = new FileInputStream("ABC.txt");
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	byte[]arr = new byte[1024];
	int b;
	while((b=fis.read()) != -1){
		baos.write(arr,0,b);
	}
	System.out.println(baos.toString());
	fis.close();
}

以上是关于系统运维系列 之其它流概述及其分类(java应用)的主要内容,如果未能解决你的问题,请参考以下文章

系统运维系列 之堆栈理解(java应用)

系统运维系列 之异常抛出后代码执行问题(java应用)

系统运维系列 之java控制api接口请求次数

系统运维系列 之List实现深拷贝(java应用)

系统运维系列 之实现Ftp上传下载文件(java应用)

系统运维系列 之Java中synchronized详解及应用