JAVA基础整合——IO流技术

IO流技术

什么是IO流???I 表示input输入(读),O 表示output输出(写)。这里的输入输出表示JAVA程序和外部磁盘文件或者服务器之间的数据交互。输入表示外部文件往JAVA程序输入,输出表示JAVA程序向外输出。

1.流的分类

  1. 从流的方向分为:输入流和输出流
  2. 从流中传输的数据的单位来分:字节流和字符流
  3. 流的构造来说分为基本流和包装流

2.我们需要掌握的流

这里我针对字节流和字符流画了一个图,标红的是我们需要掌握其原理的。

  • 字节流如下:

在这里插入图片描述

  • 字符流如下:

在这里插入图片描述

  • 这里我把图上几个掌握的流列出来:
    FileInputStream,FileOutputStream (这俩为基本流)
    BufferedInputStream,BufferedOutputStream
    ObjectInputerStream,ObjectOutputStream
    FileReader,FileWriter(这俩为基本流)
    InputStreamReader,OutputStreamWriter(转换流,也是字符流)
    BufferedReader,BufferedWriter
    规律:
       1.名字中带有input或者reader都是用来做输入(读),凡是名字中带有output或者Writer都是用来输出(写)。
       2.类名中带有Stream都是字节流,带有reader或者writer都是字符流。
       3.包装流是不能直接使用的,需要以基本流作为基础进行包装之后才能进行使用。

3.字节流

3.1 FileInputStream 和FileOutputStream

这两个流属于字节流,以字节为单位获取一个文件的内容。
文件流使用过后一定要进行手动的关闭,所有的流对象统一实现了Closeable的接口。为了保证流的关闭代码一定执行,我们将关闭的代码写在finally块中。
案例:使用字节输入输出流完成一个图片文件的复制操作(时间不要太长)。

public static void main(String[] args)   {
		FileInputStream fis =null;
		FileOutputStream fio = null;
		try {
			 fis = new FileInputStream("D:\\zzz\\test.png");
			 fio = new FileOutputStream("D:\\bbb\\test.png");
			 byte[] buffer = new byte[1024];
			int r;
			while((r=fis.read())!=-1) {
				fio.write(buffer,0,r);
			}
			fio.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(fis!=null) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(fio!=null) {
				try {
					fio.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}
  • 提出一个装饰器模式概念:对原有类的功能进行某些方面的增强。例如BufferedInputStream类中其实定义了一个InputStream类型的属性,并且要求构造的时候传入一个基本流,在用户调用流对象的read方法是其实还是调用基本流的reaad方法,只是在读取文件的过程中进行缓冲的增强,提升了文件读取效率。

3.2 BufferedInputStream 和 BufferedOutputStream

  • 带有缓冲的字节输入输出流,是一种包装流。
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("d:\\zz.txt"))
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("D:\\a.txt"))
int r;
while((r=bis.read())!=-1) {
	bos.wriite(r);
}
//异常没有处理

3.3 ObjectInputerStream 和 ObjectOutputStream

  • 对象输入输出流:将一个JAVA对象转成一个字节序列的过程称为“对象的序列化”,目的是实现对象在磁盘上的保存或者网络的传输。在JAVA中是通过对象的输入和输出流来实现对象的序列化和反序列化操作的。
    1.序列化: 将JAVA对象转成字节序列,要进行输出操作时序列化JAVA对象。
    2.反序列化: 将字节序列还原为一个JAVA对象,要进行字节序列的输入。

注意: 需要被序列化的类一定要实现Serializable接口,这个接口为一个空接口,这个接口的作用主要时用来进行标记的。在实现了Serializable接口的同时建议在当前类中提供一个常量:
private static final long serialVersionUID = -3308982073920623004L;表示序
列化的版本号
如果我们不希望对象的某个属性参与序列化和反序列化的过程,可以使用transient关键字对该属性进行修饰。

//序列化(输出,写)
Person person=new Person("张三",18,"male");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\person.data"));
oos.writeObject(person);
oos.flush();

//反序列化(输入,读)
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\person.data"));
//ois.readObject是一个Object类型需要向下转型为子类类型Person
Person person =(Person)ois.readObject();
//异常没有处理

4.字符流

当我们在读取一个文本信息的时候采用字节的方式读取显然是不太合适的,因为有些字符在存储的时候不是占一个字节的空间,因此Java中为了更加方便读取文本信息内容为我们提供了一个流:字符输入输出流。

4.1 FileReader 和 FileWriter

这两个为基本流。

FileReader reader=new FileReader("D:\\aaa.txt");
//缓冲数组
char[] arr = new char[3];
reader.read(arr);
System.out.println(new String(arr));

4.2 BufferedReader 和BufferedWriter

  • 自带缓冲区的字符输入输出流,属于包装流BufferedReader不仅可以提交读取的效率,同时也非常方便,该流对象提供给我们一个以行为单位进行文本文件的读取readLine()
BufferedReader reader=new BufferedReader(new FileReader("D:\\TestFileOutputStream.java"));
StringBuffer sb=new StringBuffer("");
String line=null;
while((line=reader.readLine())!=null) {
	//一行一行的读取文本文件的内容
 	sb.append(line + "\r\n");
}
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\test.txt"));
String[] arr=new String[] {"你好","晚上吃什么","吃完去干什么"}; 
for (String s : arr) {
   bw.write(s); 
   bw.newLine();//创建一个新的行 
  }
  bw.flush();

4.3 InputStreamReader 和 OutputStreamWriter

  • 这两个是一个包装流,也是一个转换流。
    小芝士: 一切乱码的根源在于信息编码与解码的格式不一致。

  • 字符流在构建的时候是无法指定编码和解码的方式,只有字节流在创建的过程中才能指定字符集。

BufferedReader br=new BufferedReader(new InputStreamReader(new
FileInputStream("D:\TestFileOutputStream.java"),"utf-8"));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值