Java--IO流(其他流)

一、序列流(SequenceInputStream)

序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 

读完一个之后继续读第二个, 以此类推

使用方式

整合两个: SequenceInputStream(InputStream, InputStream)

整合多个: SequenceInputStream(Enumeration)

二、内存输出流(ByteArrayOutputStream)

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

使用方式

创建对象: new ByteArrayOutputStream()

写出数据: write(int), write(byte[])

获取数据: toByteArray()

三、对象操作流(ObjectOutputStream,ObjectInputStream)

该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化和反序列化的操作.

使用方式

写出: new ObjectOutputStream(OutputStream), writeObject()

读取: new ObjectInputStream(InputStream), readObject()

四、标准输入输出流

System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据

System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据

修改标准输入输出流

修改输入流: System.setIn(InputStream)

修改输出流: System.setOut(PrintStream)

五、随机访问流

RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。

支持对随机访问文件的读取和写入。

read(),write(),seek()

六、数据输入输出流

DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据

例如按Long大小写出一个数字, 写出时该数据占8字节. 读取的时候也可以按照Long类型读取, 一次读取8个字节

七、Properties

Properties 类表示了一个持久的属性集。

Properties 可保存在流中或从流中加载。

        属性列表中每个键及其对应值都是一个字符串。

package com.lin.otherio;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

public class OtherIO {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		/*
		 * 一、序列流(SequenceInputStream)
			  序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 
			  读完一个之后继续读第二个, 以此类推.
			使用方式
			  整合两个: SequenceInputStream(InputStream, InputStream)
			  整合多个: SequenceInputStream(Enumeration)
		   二、内存输出流(ByteArrayOutputStream)
			  该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
			使用方式
				创建对象: new ByteArrayOutputStream()
				写出数据: write(int), write(byte[])
				获取数据: toByteArray()
		   三、对象操作流(ObjectOutputStream,ObjectInputStream)
		      该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化和反序列化的操作.
			使用方式
				写出: new ObjectOutputStream(OutputStream), writeObject()
				读取: new ObjectInputStream(InputStream), readObject()
		   四、标准输入输出流
				System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
				System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
 			  修改标准输入输出流
				修改输入流: System.setIn(InputStream)
				修改输出流: System.setOut(PrintStream)
		   五、随机访问流
		      RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
			  支持对随机访问文件的读取和写入。
			  read(),write(),seek()
		   六、数据输入输出流
				DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据
				例如按Long大小写出一个数字, 写出时该数据占8字节. 读取的时候也可以按照Long类型读取, 一次读取8个字节
		   七、Properties
				Properties 类表示了一个持久的属性集。
				Properties 可保存在流中或从流中加载。
				属性列表中每个键及其对应值都是一个字符串。
		 * */
		sequenceStream();//SequenceInputStream序列流(仅有两个输入流)
		sequenceStreamMore();//SequenceInputStream序列流(多个输入流)
		memoryStream();//内存输出流
		objectOutStream();//对象操作流
		objectInStream();//对象操作流
		objectStream();//对象操作流
		printStream();//打印流
//		systemIn();
//		systemInAndOut();
//		keyBorder();//键盘录入
		randomStream();//随机访问流(既读又可写)
		dataStream();
		properties1();
		properties2();
	}

	private static void properties2() throws IOException, IOException {
		System.out.println("================Properties配置文件================");
		Properties p = new Properties();
		p.load(new FileInputStream("config.properties"));
		p.setProperty("tel", "18898568956");
		p.store(new FileOutputStream("config.properties"), null);
		System.out.println(p);
	}

	private static void properties1() {
		System.out.println("================Properties================");
		Properties p = new Properties();
//		p.put("abc", 123);
//		System.out.println(p);
		p.setProperty("name", "三");
		p.setProperty("tel", "13233888956");
		Enumeration<String> e = (Enumeration<String>) p.propertyNames();
		while(e.hasMoreElements()){
			String key = e.nextElement();
			System.out.println(key + "--" + p.getProperty(key));
		}
	}

	private static void dataStream() throws IOException {
		DataOutputStream dos = new DataOutputStream(new FileOutputStream("a.txt"));
		dos.writeInt(997);
		dos.writeInt(998);
		dos.writeInt(999);
		dos.close();
		
		DataInputStream dis = new DataInputStream(new FileInputStream("a.txt"));
		System.out.println(dis.readInt() + " " + dis.readInt() + " " + dis.readInt() + " ");
	}

	private static void randomStream() throws IOException {
		System.out.println("================随机访问流================");
		RandomAccessFile ra = new RandomAccessFile("a.txt", "rw");
		ra.write(97);
		System.out.println(ra.read());
		ra.seek(10);
		ra.write(98);
		ra.close();
	}

	private static void keyBorder() throws IOException {
		System.out.println("================键盘录入================");
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String line = bf.readLine();
		System.out.println(line);
		bf.close();
	}

	private static void systemInAndOut() throws IOException {
		System.out.println("================标准输入输出================");
		System.setIn(new FileInputStream("a.txt"));
		System.setOut(new PrintStream("b.txt"));
		
		InputStream is = System.in;
		PrintStream ps = System.out;
		int b;
		while((b = is.read()) != -1){
			ps.write(b);
		}
		is.close();
		ps.close();
	}

	private static void systemIn() throws IOException {
		System.out.println("================标准输入流================");
		InputStream is = System.in;
		int x = is.read();
		System.out.println(x);
		is.close();
	}

	private static void printStream() throws FileNotFoundException {
		System.out.println("================打印流================");
		PrintStream ps = System.out;//打印字节流
		ps.println(97);					//其实底层用的是Integer.toString(x),将x转换为数字字符串打印
		ps.println("xxx");
		ps.println(new Person("张三", 23));
		Person p = null;
		ps.println(p);					//如果是null,就返回null,如果不是null,就调用对象的toString()
		
		PrintWriter pw = new PrintWriter(new FileOutputStream("g.txt"), true);//打印字符流
		pw.write(97);
		pw.print("大家好");
		pw.println("你好");				//自动刷出,只针对的是println方法
		pw.close();
	}

	private static void objectStream() throws IOException, IOException, ClassNotFoundException {
		System.out.println("================对象操作流================");
		Person p1 = new Person("张三",18);
		Person p2 = new Person("李四",16);
		Person p3 = new Person("王五",18);
		Person p4 = new Person("赵六",16);
		ArrayList<Person> list = new ArrayList<>();
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));
		oos.writeObject(list);
		oos.close();
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));
		ArrayList<Person> pList = (ArrayList)ois.readObject();
		for (Person person : pList) {
			System.out.println(person);
		}
	}

	private static void objectInStream() throws IOException, ClassNotFoundException {
		System.out.println("================对象操作流读取================");
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c.txt"));
		Person p1 = (Person)ois.readObject();
		Person p2 = (Person)ois.readObject();
//		Person p3 = (Person)ois.readObject();//java.io.EOFException 文件读取到末尾了出现
		System.out.println(p1);
		System.out.println(p2);
	}

	private static void objectOutStream() throws IOException {
		Person p1 = new Person("张三",18);
		Person p2 = new Person("李四",16);
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c.txt"));
		oos.writeObject(p1);
		oos.writeObject(p2);
		oos.close();
	}

	private static void memoryStream() throws IOException {
		System.out.println("================内存输出流================");
		FileInputStream fi2 = new FileInputStream("b.txt");
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		int b;
		while((b = fi2.read()) != -1){
			bos.write(b);
		}
//		byte[] by = bos.toByteArray();
//		System.out.println(new String(by));
		System.out.println(bos);
		fi2.close();
	}

	public static void sequenceStreamMore() throws FileNotFoundException, IOException {
		System.out.println("================序列流多个输入流================");
		FileInputStream fi1 = new FileInputStream("a.txt");
		FileInputStream fi2 = new FileInputStream("b.txt");
		FileInputStream fi3 = new FileInputStream("c.txt");
		
		Vector<FileInputStream> v = new Vector<>();
		v.add(fi1);
		v.add(fi2);
		v.add(fi3);
		
		Enumeration<FileInputStream> en = v.elements();
		SequenceInputStream sis = new SequenceInputStream(en);
		FileOutputStream fo = new FileOutputStream("bc.txt");
		int b;
		while((b = sis.read()) != -1){
			fo.write(b);
		}
		sis.close();
		fo.close();
	}

	public static void sequenceStream() throws FileNotFoundException, IOException {
		System.out.println("================序列流两个输入流================");
		FileInputStream fi1 = new FileInputStream("b.txt");
		FileInputStream fi2 = new FileInputStream("c.txt");
		SequenceInputStream si = new SequenceInputStream(fi1, fi2);
		FileOutputStream fo = new FileOutputStream("bc.txt");
		int b;
		while((b = si.read()) != -1){
			fo.write(b);
		}
		si.close();
		fo.close();
	}
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值