一、数据流 (Java 数据类型)
DataOutputStream:
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
DataInputStream:
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
二、内存操作流(临时存储的 程序结束就消失) -->注意读入流的构造方法
操作字节数组
ByteArrayInputStream
ByteArrayOutputStream
操作字符数组
CharArrayReader
CharArrayWrite
操作字符串
StringReader
StringWriter
不需要close;
三、打印流(只有写数据 没有读取数据)
字节流打印流 PrintStream
PrintStream(OutputStream out, boolean autoFlush)
创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush, String encoding)
创建新的打印流。
字符打印流 PrintWriter -->调用print println、printf、write 或 format
PrintWriter(OutputStream out, boolean autoFlush)
通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter(Writer out, boolean autoFlush)
创建新 PrintWriter。
打印流特点
只能操作目的地,不能操作数据。
可以操作任意类型的数据。
如果启动了自动刷新,能够自动刷新。 --> 不需要flush
构造方法既可以操作字节流又可以操作字符流
可以直接操作文件的流
四、标准输入输出流
System类中的字段:in,out。
public static final InputStream in 标准输入流
public static final PrintStream out 标准输出流
System.out.println(); == PrintStream.println();
它们各代表了系统标准的输入和输出设备。
默认输入设备是键盘,输出设备是显示器。
System.in的类型是InputStream.
System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类.
五、RandomAccessFile概述
RandomAccessFile类不属于流,是Object类的子类。
但它融合了InputStream和OutputStream的功能。
支持对随机访问文件的读取和写入。
public RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的格式
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
六、合并流
SequenceInputStream概述 (只提供读没有写)
SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。
SequenceInputStream的构造方法
SequenceInputStream(InputStream s1, InputStream s2)
SequenceInputStream(Enumeration<? extends InputStream> e)
把多个文件的内容写入到一个文本文件
七、序列化流
序列化流:将对象按照流一样的方式存入文本文件或者网络中传输。对象 -- 流数据
ObjectOutputStream
ObjectOutputStream 将 Java 对象写入 OutputStream。
反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据 -- 对象
ObjectInputStream
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化
序列化操作问题
为什么要实现序列化?
如何实现序列化?
序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?
使用transient关键字声明不需要序列化的成员变量
八、Properties集合
Properties作为Map集合的使用
Properties的特殊功能
public Object setProperty(String key,String value)
public String getProperty(String key)
public Set<String> stringPropertyNames()
Properties和IO流的结合使用 --> 文件中的内容要以键值对形式存在 --> PropertiesDemo2.java
public void load(Reader reader):将文件中的数据读取到集合中
public void store(Writer writer,String comments):把集合中的数据存储到文件
九、NIO其实就是新IO的意思。 --> java.nio包
JDK4出现NIO。新IO和传统的IO有相同的目的,都是用于进行输入输出的,
但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,
将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,
这种方式效率比旧IO要高很多,但是目前好多地方我们看到的还是旧IO的引用,所以我们仍以旧IO为主,
知道NIO即可。
JDK7的IO改进(写一个案例)
Path
Paths
Files
最后面试题、
哪些流对象是可以直接操作文本文件的呢?
FileInputStream
FileOutputStream
FileReader
FileWriter
PrintStream
PrintWriter
看API,查流对象的构造方法,如果同时有File类型和String类型的参数,一般来说就是可以直接操作文件的。
流:
* 基本流:就是能够直接读写文件的
* 高级流:在基本流基础上提供了一些其他的功能