Java之IO流(其他流)

3 篇文章 0 订阅
3 篇文章 0 订阅

其他流

ByteArrayOutputStream:内存操作输出流

  • 构造方法
public ByteArrayOutputStream(){}:构造一个默认的缓冲大小的输出流对象
  • 成员方法
public byte[] toByteArray():将内存操作输出流中流对象---数组格式

ByteArrayInputStream:内存操作输入流

  • 构造方法
public ByteArrayInputStream(byte[] buf):使用指定的字节数组作为缓冲区,构造

示例

public class ByteArrayStreamDemo {
	//创建ByteArrayOutputStream
	private static ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
	
	public static void main(String[] args) throws IOException {
		write(baos) ;
		read() ;
	}
	
	//将内存操作流
	private static void read() throws IOException {
		//public ByteArrayInputStream(byte[] buf)
		//public byte[] toByteArray()
		byte[] bytes = baos.toByteArray() ;
		ByteArrayInputStream bais = new ByteArrayInputStream(bytes) ;
		//读取数据
		//一次读取一个字节/一个字节数组
		int by = 0 ;
		while((by=bais.read())!=-1) {
			//展示
			System.out.print((char)by);
		}

		bais.close();
		
	}

	//创建内存操作输出流,写入临时数据
	private static void write(ByteArrayOutputStream baos) throws IOException {	

		//成员变量已经创建
		//写入数据
		for(int x = 0 ; x < 10 ;  x ++) {
			baos.write(("hello"+x).getBytes());
			//字节流换行
			//写入\r\n
			baos.write("\r\n".getBytes());
		}
		//关闭资源
//		baos.close();临时变量---随着方法完毕就消失了
	}
}

PrintWriter:字符打印流
PrintWriter:能够操作文件(目标文件) – 字符输出流一种

  • 构造方法:
//第二个参数为true:表示开启自动刷新功能
public PrintWriter(Writer out,boolean autoFlush)
public PrintWriter(String fileName):可以操作具体文件路径
  • 成员方法
public void println(XXX x):可以换行
  • 示例
public class PrintWriterDemo {
	
	public static void main(String[] args) throws IOException {
		//创建字符打印流对象
		PrintWriter pw = new PrintWriter("pw.txt") ;
		
		//打印数据并可以换行
		pw.println("hello");
		pw.println("world");
		pw.println("java");
		
		//刷新
		pw.flush();
		//关闭资源
		pw.close();
	}
}

合并流:SequenceInputStream

  • 构造方法
//合并两个文件
public SequenceInputStream(InputStream s1,InputStream s2)
//两个以上的文件复制
public SequenceInputStream(Enumeration<? extends InputStream> e)
  • 示例
    将两个文件合并复制到目标文件中
public class SequenceStramDemo {
	
	public static void main(String[] args)  throws IOException{
		InputStream s1 = new FileInputStream("Demo.java") ;
		InputStream s2 = new FileInputStream("OutputStreamWriterDemo.java") ;
		
		//创建合并流对象
		SequenceInputStream sis = new SequenceInputStream(s1, s2) ;
		
		//封装目标文件
		FileOutputStream fos = new FileOutputStream("Copy.java") ;
		
		//读写复制
//		一次读取一个字节数组
		byte[] bytes = new byte[1024] ;
		int len = 0 ;
		while((len=sis.read(bytes))!=-1) {
			fos.write(bytes,0,len);
		}
		//关闭资源
		fos.close();
		sis.close();
		
	}
}

两个文件以上的复制
步骤:

  • 创建 Vector集合对象
  • 给添加多个InputStream对象
  • Vector集合中:elements()---->Enumeration
  • 读写复制
public static void main(String[] args) throws IOException{
	
	//public SequenceInputStream(Enumeration<? extends InputStream> e)
	//创建Vector集合对象
	Vector<InputStream> v = new Vector<InputStream>() ;
	//创建三个InputStream对象
	InputStream s1 = new FileInputStream("OutputStreamWriterDemo.java") ;
	InputStream s2 = new FileInputStream("Test.java") ;
	InputStream s3 = new FileInputStream("Copy.java") ;
	//添加到集合中
	v.add(s1) ;
	v.add(s2) ;
	v.add(s3) ;
	
	//获取类似于迭代器elements()-----iterator()
	Enumeration<InputStream> en = v.elements() ;
	//创建合并流对象
	SequenceInputStream sis = new SequenceInputStream(en) ;
	
	//封装目标文件
	FileOutputStream fos = new FileOutputStream("d:\\CopyFileDemo.java") ;
	
	//一次读取一个字节数组
	byte[] bytes  = new byte[1024] ;
	int len = 0 ;
	while((len=sis.read(bytes))!=-1){
		//写
		fos.write(bytes, 0, len);
	}		
	//关闭
	fos.close();
	sis.close();
	
}

ObjectOutputStream
序列化:需要将网络中的数据/一些对象转成 “流数据”

  • 构造方法
public ObjectOutputStream(OutputStream out)
  • 成员方法:
public final void writeObject(Object obj):将指定的对象写入到序列化流中

ObjectInputStream
反序列化:将流数据----还原成Java对象/网络数据

  • 构造方法
public ObjectInputStream(InputStream in)
  • 成员方法
 public final Object readObject():将流数据---还原成对象
  • 示例
public class ObjectStreamDemo {
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		//序列化
//		write() ;
		
		//反序列化
		read() ;
	}
	
	//将流数据---还原成对象
	private static void read() throws IOException, ClassNotFoundException {
		//public ObjectInputStream(InputStream in)
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt")) ;
		//* public final Object readObject()
		Object obj	 = ois.readObject() ;
		System.out.println(obj);
		
		//关闭
		ois.close();
	}

	private static void write() throws IOException, IOException {
		//public ObjectOutputStream(OutputStream out)
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;
		
		
		//写数据
		Person p = new Person("张钰",23) ;
		//public final void writeObject(Object obj)
		oos.writeObject(p);
		
		//释放资源
		oos.close();
	}
}

Properties

  • Properties 类表示了一个持久的属性集 ,没有泛型(属性列表中的键和值都是String)
  • 它继承自Hashtable<K,V> implements Map<K,V>

特有功能

 public Object setProperty(String key, String value):添加键和值
 public Set<String> stringPropertyNames():获取属性列表中的所有的键的集合
 public String getProperty(String key):通过键获取值
 public void load(Reader reader):将一些配置文件中的数据加载到属性集合类中

示例
在当前项目下user.txt文件 ,如果当前文件中lisi这个键,将它的值改为78,然后重新将值写入到user.txt文件(既要用到load(Reader r),还要用到store(Writer w,String comments))

public class PropertiesTest {
	
	public static void main(String[] args) throws IOException {
	//	myStore() ;
	
		myLoad() ;
	}
	
	//将某个文件中的内容加载到属性集合列表中
	private static void myLoad() throws IOException {
		//创建属性集合类对象
		Properties prop = new Properties() ;
		Reader r = new FileReader("user.txt") ;
		prop.load(r);
		//关闭资源
		r.close();
		System.out.println(prop);
	}

	//需要将属性列表中的数据保存到某个文件:当前项目下的name.txt中
	private static void myStore() throws IOException {
		//创建属性集合类对象
		Properties prop = new Properties() ;
		//添加数据
		prop.setProperty("张三", "30") ;
		prop.setProperty("李四", "40") ;
		prop.setProperty("王五", "50") ;
		
		//public void store(Writer writer, String comments)
		prop.store(new FileWriter("names.txt"), "name's list");
		
		System.out.println(prop);
		
		
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值