Java IO流学习总结

本文详细介绍了Java中的IO流概念,包括字符流与字节流的区别,以及如何利用FileInputStream和FileOutputStream进行文件复制,展示了如何将文件内容读取为字符串,并提供了字符流读写文件的实例,最后还介绍了对象序列化与反序列化的具体实现。
摘要由CSDN通过智能技术生成

Java中IO流学习总结

一.IO流中的结构

io流图片

  • 字符流:顾名思义,该流只能处理字符,但处理字符速度很快
  • 字节流:可以处理所有以bit为单位储存的文件,也就是说可以处理所有的文件,但是在处理字符上的速度不如字符流

二.IO流的具体使用

  • 从各种输入流到各种输出流
    注:其实在各个不同的类型中,输入流到输出流的套路基本都一样。
    那就拿最简单的FileOutputStream来举例子吧
    从FileOutputStream到FileIntputStream其实就是复制一个文件的过程,将文件读取到FileIntputStream中,后输出到FileOutputStream也就是相当于输出到了硬盘的文件中。
    我们可以以两个桶为例,一个桶为FileIntputStream,另一个桶为FileOutputStream,如果要把一个桶里的水转移到另一个桶中,我们首先需要一个水瓢,一次次的舀水才能完成我们的需求。
    废话不多说,直接上代码:
public static void main(String[] args) throws IOException {
		File fil1 = new File("D:/111.pdf");
		File fil2 = new File("D:/222.pdf");
		//将流的创建写到 try 中,可以自动关闭流
		try (
		//一个叫输入流的桶,装满了一桶叫做D:/111.pdf文件的水
        FileInputStream fi = new FileInputStream(fil1); 
		//一个叫输出流的空桶,想装满叫做"D:/222.pdf"文件的水
		FileOutputStream fs = new FileOutputStream(fil2);
				) {
			//叫做buf的水瓢
			byte[] buf = new byte[512];
			//用来测量每次水瓢装了多少水
			int len = -1;
			//一次次的用水瓢在输入流的桶里舀水,并用len测了舀了多少水,当len等于-1意味着水舀光了,该结束舀水了。
			while((len = fi.read(buf)) != -1){
				//一次次把水瓢里的水放到了输出流的桶里
				fs.write(buf, 0, len);
			}
			fs.flush();
		} catch (Exception e) {
		}
	}

其实这种方法可以针对于很多的输入流和输出流。

  • 从输入流到字符串
    其实这个和上一种很类似,只不过换了种实现方式。
    直接上代码:
	File file = new File("D:/123.txt");
	//同样是叫做输入流的桶
	FileInputStream fis = new FileInputStream(file);
	//把输出流的桶换成了StringBuffer用来储存字符串
	//其实也可以直接用String,但是StringBuffer速度更快。
	StringBuffer sb = new StringBuffer();
	//水瓢没变
	byte[] buf = new byte[256];
	//测水瓢舀了多少水没变
	int len = -1;
	while ((len = fis.read(buf)) != -1){
		//和上面的原理基本一样,只不过换了个水瓢而已
		//new String(buf, 0, buf.length)是将 buf 里面的内容转换为字符串
		sb.append(new String(buf, 0, buf.length));
	}
	System.out.println(sb.toString());
  • 使用字符流向文件中写入字符串或者在文件中读取字符串
    其实和前面的字节流读写思路一样,只是限制了文件只能为字符类型的

复制文本文件并输出


public static void main(String[] args) throws Exception {
		//复制源文件
		File file = new File("D:/123.txt");
		//复制结果文件
		File file2 = new File("D:/456.txt");
		//用于输出到控制台
		StringBuffer sb = new StringBuffer();
		//检测结果文件是否存在如果不存在便创建一个
		if(!file2.exists()){
			file2.createNewFile();
		}
		//设置字符读入流用于向文件(file)中读数据
		FileReader fr = new FileReader(file);
		//设置字符读出流用于向文件(file2)中写数据
		FileWriter fw = new FileWriter(file2);
		//每次读和写的容器,可以理解为传送的媒介
		char[] ch = new char[256];
		int len = -1;
		while((len = fr.read(ch)) != -1){
			//将容器里的东西写入到新文件中
			//将容器里的东西添加到strngBuffer中,用于输出
			fw.write(ch, 0, ch.length);
			sb.append(new String(ch, 0, ch.length));
		}
		fw.flush();
		//这次没有将流的创建写入到try中,所以需要手动关闭
		fw.close();
		fr.close();
		//输出文本文件
		System.out.println(sb.toString());
	}

  • 对对象进行序列化及反序列化
    使用工具:ObjectOutputStream,ObjectInputStream
    介绍:将对象以文件的形式保存在硬盘中,使之能更方便的传输。
    条件:必须实现Serializable接口(实现了这个接口,但并不需要重写任何方法)

代码:


class DemoObject implements Serializable{
	int date = 23; 
}

public class IoTest {
	public static void main(String[] args) throws Exception {
		//建立对象输出流准备向文件中写入对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:/123.obj")));
		//向文件中写入新建立的对象
		oos.writeObject(new DemoObject());
		//输出流记得要flush
		oos.flush();
		//建立对象输入流准备在文件中读出刚写入的对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("D:/123.obj")));
		//建立一个新对象用于保存刚刚读出的对象
		DemoObject newObject = (DemoObject)ois.readObject();
		//输出这个对象
		System.out.println(newObject.date);
	}
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值