前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高级API——【第二章】 输入输出流

高级API——【第二章】 输入输出流

作者头像
用户10196776
发布2022-11-22 14:31:10
1940
发布2022-11-22 14:31:10
举报
文章被收录于专栏:SpringBoot+MyBatis前端

1初识JavaIO

IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。

Java 中是通过流处理IO 的,那么什么是流?

流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。 当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。

一般来说关于流的特性有下面几点:

先进先出:最先写入输出流的数据最先被输入流读取到。 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外) 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

2.IO流分类

IO流主要的分类方式有以下3种:

  1. 按数据流的方向:输入流、输出流
  2. 按处理数据单位:字节流、字符流
  3. 按功能:节点流、处理流

1、输入流与输出流

输入与输出是相对于应用程序而言的,比如文件读写,读取文件是输入流,写文件是输出流,这点很容易搞反。

2、字节流与字符流

字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为8+8位的字符或者8+8+*的字符。

为什么要有字符流?

Java中字符是采用Unicode标准,Unicode 编码中,一个英文为一个字节,一个中文为两个字节。

而在UTF-8编码中,一个中文字符是3个字节。例如下面图中,“云深不知处”5个中文对应的是15个字节:-28-70-111-26-73-79-28-72-115-25-97-91-27-92-124

那么问题来了,如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。为了更方便地处理中文这些字符,Java就推出了字符流。

代码案例如下:

代码语言:javascript
复制
public class Test {
	public static void main(String[] args) throws Exception {
		/*
		 * IO流:流数据的,传输数据
		 * 	按照方向分类:
		 * 		输入流:InputStream
		 * 				FileInputStream
		 * 		输出流:OutputStream
		 * 				FileOutputStream
		 * 
		 * 	按照类型分类:
		 * 		字节流:所有的流 都属于字节流
		 * 		字符流:字节流中包含字符流
		 * 
		 * 	按照功能分类:
		 * 		节点流:所有的流都又叫做节点流
		 * 		过滤流:给流增强功能的
		 * 
		 * 	使用流步骤:
		 * 		1、创建流
		 * 		2、[包装过滤流]
		 * 		3、操作流:读取/写出
		 * 		4、关闭流
		 * 	
		 * 	水流:
		 * 	电流:
		 * 	人流:
		 */
		
		//创建一个输入流
//		FileInputStream fis = new FileInputStream("d://T416/T416.txt");
//		File file = new File("d://T277/T277.txt");
//		FileInputStream fis = new FileInputStream(file);
//		
//		//读取数据,读取一个数据字节
//		int i = fis.read();
//		while(i!=-1) {
//			System.out.print((char)i);
//			i = fis.read();
//		}
//		//关闭流
//		fis.close();
		
		//输出流
//		String str = "mingtianyeshigehaorizi";
//		FileOutputStream fos = new FileOutputStream("d://T416/T416.txt");
//		byte[] b = str.getBytes();
//		fos.write(b);
//		fos.close();
//		System.out.println("写出完成");
		
//		System.out.println("============对象序列化===========");
//		Student stu = new Student(1, "哇噻", 18);
//		//创建输出流
//		FileOutputStream fos = new FileOutputStream("d://T416/T416.txt");
//		//包装过滤流
//		ObjectOutputStream oos = new ObjectOutputStream(fos);
//		oos.writeObject(stu);
//		//关闭流
//		oos.close();
//		fos.close();
//		System.out.println("备份完成");
//		
//		System.out.println("=============反对象序列化(读取对象的数据文件)==============");
//		FileInputStream fis = new FileInputStream("d://T416/T416.txt");
//		//包装过滤流
//		ObjectInputStream ois = new ObjectInputStream(fis);
//		//读取数据
//		Object obj = ois.readObject();
//		ois.close();
//		fis.close();
//		Student s = (Student)obj;
//		System.out.println("读取到:"+s);
		
		System.out.println("================序列化对象(集合版)==================");
		ArrayList<Student> slist = new ArrayList<>();
		for(int i=1;i<=100;i++) {
			slist.add(new Student(i, "张"+i, i));
		}
		
		//创建输出流
		FileOutputStream fos = new FileOutputStream("d://T416/T416.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(slist);
		oos.close();
		fos.close();
		System.out.println("备份完成");
		
		//创建输入流
		FileInputStream fis = new FileInputStream("d://T416/T416.txt");
		//包装过滤流
		ObjectInputStream abc = new ObjectInputStream(fis);
		//读取数据
		Object obj = abc.readObject();
		abc.close();
		fis.close();
		//强转数据类型
		ArrayList<Student> list = (ArrayList<Student>)obj;
		for (Student s : list) {
			//调用dao的添加方法
			System.out.println(s);
		}
		
		
	}

}

今天就分享到这里啦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1初识JavaIO
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档