概述
1.转换流
1.1 InputStreamReader类的使用
1.2 OutputStreamWriter类的使用
2.缓冲流
2.1 BufferedInputStream类的使用
2.2 BufferedOutputStream类的使用
2.3 BufferedReader类的使用
2.4 BufferedWriter类的使用
3.内存流
4.标准输入输出流
5.对象流
6.RandomAccessFile类
7.Properties类
转换流
作用: 1.实现字节流到字符流的转换 2.解决中文乱码问题 3.只有转换流才能指定读取和写入的字符集
1.1 InputStreamReader类
字节字符转换输入流,将字节流转换为字符输入流*
//注意:当一个流的存在的意义是为了实例化另外一个流,则这个流不需要手动进行关闭 //使用指定字符集进行实例化转换流 //字符集一般使用字符串直接传参,不区分大小写,但是,如果字符集书写有误的话,则会抛出 java.io.UnsupportedEncodingException InputStreamReader reader = new InputStreamReader(new FileInputStream(new File("file/input1.txt")),"UTF‐8");
1.2 OutputStreamWriter类
字符转换输出流,将内存中的字符转成字节保存到硬盘中
File file = new File("file/output1.txt");
//2.实例化转换输出流 //如果不想覆盖源文件中的内容时,则在传参的时候,设置一个参数为true
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file,true), "utf‐8");
//3.写入
writer.write("家客户放假啊刚回家");
//4.刷新
writer.flush();
//5.关闭
writer.close();
缓冲流
作用: 主要是为了增强基础流的功能而存在的,提高了流的工作效率 [读写效率]
2.1 BufferedInputStream类
//实例化一个File对象 File file = new
File("file/test22.txt");
//实例化一个缓冲字节输入流的对象
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
//读取
byte[] arr = new byte[1024];
int len = 0;
while((len = input.read(arr)) != ‐1) {
String string = new String(arr, 0, len);
System.out.println(string);
}
input.close();
2.2 BufferedOutputStream类
//实例化FIle对象
File file = new File("test33.txt");
//实例化换种字节输出流
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file));
//写
output.write("你好的halle".getBytes());
//刷新
output.flush();
//关闭
output.close();
2.3 BufferedReader类
//实例化FIle对象
File file = new File("test33.txt");
//实例化缓冲字符流的对象
BufferedReader reader = new BufferedReader(new FileReader(file));
//方式一:read循环读取
//读取
char[] arr = new char[8];
int len = 0;
while((len = reader.read(arr)) != ‐1) {
String string = new String(arr, 0, len);
}
//方式二:readLine循环读取
String result = "";
while((result = reader.readLine()) != null) {
System.out.println("第一行:" + result); }
reader.close();
2.4 BufferedWriter类
// 实例化FIle对象
File file = new File("test33.txt");
//实例化缓冲字符输出流
BufferedWriter writer = new BufferedWriter(new FileWriter(file,true));
// 写
writer.write("今天天气还可以");
// 作用:主要就是为了换行
writer.newLine();
// 刷新
writer.flush();
//关闭
writer.close();
内存流
输入和输出都是从文件中来的,当然,也可以将输出输入的位置设置在内存上,这就需要ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream:将内容写入到内存中,是Inputstream的子类
ByteArrayOutputStream:将内存中数据输出,是OutputStream的子类
注意:内存操作流的操作对象,一定是以内存为主准,不要以硬盘为准。
标准输入输出流
Java的标志输入/输出分别通过System.in和System.out实现,默认情况下分别代表是键盘和显示器
可以将默认打印到控制台的输出,重定向到文件中
//注意:默认打印到控制台,但是,如果采用setOut方法进行重定向之后,将输出到指定的文件中
PrintStream print = new PrintStream(new FileOutputStream(new File("test33.txt")));
//将标准输出重定向到print的输出流
System.setOut(print);
//下面的输出不会显示到控制台,而是会保存到test33.txt文件中
System.out.println("hello world");
可以将由控制台的输入,该为从指定文件中获取内容
FileInputStream inputStream = new FileInputStream(new File("test33.txt"));
//setIn
System.setIn(inputStream);
//默认情况下是从控制台进行获取内容
//但是如果使用setIn方法设置了重定向之后,将从指定文件中获取内容
Scanner sc = new Scanner(System.in);
String string = sc.next();
System.out.println(string);
对象流
流中流动的数据是对象
将一个对象写入到本地文件中,被称为对象的序列化
将一个本地文件中的对象读取出来,被称为对象的反序列化
使用对象流
ObjectInputStream: 对象输出流
ObjectOutputStream:对象输入流
注意
一个对象流只能操作一个对象,如果试图采用一个对象流操作多个对象的话,会出现EOFException【文件意 外达到了文件末尾】
如果向将多个对象序列化到本地,可以借助于集合,【思路:将多个对象添加到集合中,将集合的对象写入到 本地文件中,再次读出来,获取到的仍然是集合对象,遍历集合】
在要序列化类中添加字段,保证序列化和反序列化是同一个类
private static final long serialVersionUID = 100L;
要实现 implements Serializable 接口
注意:在使用对象流的时候,用于初始化对象流的参数只能是字节流(将对象转换为二进制的形式,然后再把二进制写入 文件)
对象中那些字段可以不序列化:
1.transient 修饰的字段
2.静态的字段
RandomAccessFile类
RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记 录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。
//把文件指针位置设置到文件起始处
file.seek(0);
//将文件指针跳过3个字节,本例中即跳过了一个boolean值和short值。
file.skipBytes(3);
Properties类
是Map接口的一个实现类,并且是Hastable的子类
Properties集合中元素也是以键值对的形式存在的
Properties特点:
1 存储属性名和属性值
2 属性名和属性值都是字符串
3 和流有关系
4 没有泛型
//1.实例化一个Properties的对象
Properties pro = new Properties();
pro.load(new BufferedInputStream(new FileInputStream(new File("file/userlist.properties"))));
System.out.println(pro);
//2.向集合中添加一对键值对
//调用 Hashtable 的方法 put。
pro.setProperty("address", "china");
面试题
1.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法
属于处理流中的缓冲流.
可以将读取的内容存在内存里面,提高了流的工作效率 [读写效率]
有readLine()方法 read()方法
2.怎么样把输出字节流转换成输出字符流,说出它的步骤
使用 转换处理流OutputStreamWriter
可以将字符流转为字节流
New OutputStreamWriter(new FileOutputStream(File file));
3.流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果 有多个流互相调用传入是怎么关闭的?
流一旦打开就必须关闭,使用close方法
放入finally语句块中,因为finally 语句一定会执行
调用的处理流就关闭处理流
多个流互相调用只关闭最外层的流
4.什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作
对象序列化,将对象以二进制的形式保存在硬盘上
反序列化;将二进制的文件转化为对象读取
实现serializable接口
不想让字段放在硬盘上就加transient
5.在实现序列化接口是时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用
是版本号
要保持版本号的一致 来进行序列化.
为了防止序列化出错
6.什么是内存流?有什么作用
输出输入的位置设置在内存上
内存操作流的操作对象,一定是以内存为主准
读写操作更快,避免了与硬盘的IO操作