Java缓存流-[百战系列]-[2019-8-9]

概述

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操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章