1初识JavaIO
IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。
Java 中是通过流处理IO 的,那么什么是流?
流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。 当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
一般来说关于流的特性有下面几点:
先进先出:最先写入输出流的数据最先被输入流读取到。 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外) 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
2.IO流分类
IO流主要的分类方式有以下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);
}
}
}
今天就分享到这里啦!