1:数据操作流(操作基本类型数据的流)(理解)
(1)数据操作流:
可以读写基本类型的数据。
(2)流对象名称
数据输入流:DataInputStream
DataInputStream(InputStream in)
数据输出流:DataOutputStream
DataOutputStream(OutputStream out)
2:内存操作流(理解)
(1)内存操作流:
用于处理临时存储信息的,程序结束,数据就从内存中消失。
(2)以下:
字节数组:
ByteArrayInputStream
ByteArrayOutputStream
字符数组:
CharArrayReader
CharArrayWriter
字符串:
StringReader
StringWriter
注意:释放资源
通过查看源码我们知道这里什么都没做,所以根本不需要close()。
3:打印流(掌握)
(1)打印流:
字节打印流---PrintStream
字符打印流---PrintWriter
(2)特点:
1:只有写数据的,没有读取数据。只操作目的地,不操作数据源。
2:可以操作任意类型的数据。
3:如果启用了自动刷新(构造方法中第二参数为true,即开启自动刷新)。
在调用println()方法的时候,能够换行并刷新
println() --->
其实等价于于:
{ bw.write();
bw.newLine();
bw.flush(); }
4:可以直接操作文件
问题:哪些流可以直接操作文件呢?
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
- PrintStream
- PrintWriter
看API,如果其构造方法能够同时接收File和String类型的参数,一般都是可以直接操作文件的。
流:
基本流:就是能够直接读写文件的。
高级流:在基本流基础上提供了一些其他的功能。
(3)复制文本文件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);
String line = null;
while((line=br.readLine())!=null) {
pw.println(line);
}
pw.close();
br.close();
4:标准输入输出流(理解)
(1)输入输出流:
System类下面有这样的两个字段
in 标准输入流
out 标准输出流
System类中的两个成员变量:
public static final InputStream in “标准”输入流。
public static final PrintStream out “标准”输出流。
InputStream is = System.in;
PrintStream ps = System.out;
(2)三种键盘录入方式
1:main方法的args接收参数
2:System.in通过字符缓冲流包装标准输入流实现
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
3:Scanner
Scanner sc = new Scanner(System.in);
(3)输出语句的原理和如何使用字符流输出数据
A:原理
System.out.println("helloworld");
PrintStream ps = System.out;
ps.println("helloworld");
B:把System.out用字符缓冲流包装一下使用
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
5:随机访问流(理解)
(1)随机访问流:
可以按照文件指针的位置写数据和读数据。
RandomAccessFile类不属于流,是Object类的子类。
但它融合了InputStream和OutputStream的功能。
支持对文件的随机访问读取和写入。
(2)特点:
public RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的模式。
模式有四种,我们最常用的一种叫"rw",这种方式表示我既可以写数据,也可以读取数据。
6:合并流(理解)
(1)合并流:
把多个输入流的数据写到一个输出流中。
(2)构造方法:
A:SequenceInputStream(InputStream s1, InputStream s2)
B:SequenceInputStream(Enumeration<? extends InputStream> e)
7:序列化流(理解)
(1)序列化流:
可以把对象写入文本文件或者在网络中传输。
序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。 对象 -- 流数据(ObjectOutputStream)
反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据 -- 对象(ObjectInputStream)
(2)如何实现序列化呢?
让被序列化的对象所属类实现序列化接口。
该接口是一个标记接口。没有功能需要实现。
(3)注意问题:
把数据写到文件后,在去修改类会产生一个问题。
如何解决该问题呢?
在类文件中,给出一个固定的序列化id值。
而且,这样也可以解决黄色警告线问题。
(4)面试题:
- 什么时候序列化?
- 如何实现序列化?
- 什么是反序列化?
transient关键字:被标记的属性不能被序列化。
8:Properties(理解)
(1)Properties
1.Properties:属性集合类。是一个可以和IO流相结合使用的集合类。
2.Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
3.是Hashtable的子类,说明是一个Map集合。
(2)特有功能
A:public Object setProperty(String key,String value)添加元素
B:public String getProperty(String key)获取元素
C:public Set<String> stringPropertyNames()获取所有的键的集合
(3)和IO流结合的方法
//把键值对形式的文本文件内容加载到集合中
public void load(Reader reader)
public void load(InputStream inStream)
//把集合中的数据存储到文本文件中
public void store(Writer writer,String comments)
public void store(OutputStream out,String comments)
(4)案例:
A:根据给定的文件判断是否有键为"lisi"的,如果有就修改其值为100
B:写一个程序实现控制猜数字小游戏程序不能玩超过5次
9:NIO(了解)
(1)New IO:
JDK4出现的NIO,对以前的IO操作进行了优化,提供了效率。但是大部分我们看到的还是以前的IO
(2)JDK7的NIO的使用
Path:路径
Paths:通过静态方法返回一个路径
Files:提供了常见的功能
复制文本文件
把集合中的数据写到文本文件