Java 流操作的接口
类 |
说明 |
File |
操作文件的类 |
RandomAccessFile |
随机地读取一个文件中指定位置的数据 |
InputStream |
字节输入流 |
OutputStream |
字节输出流 |
Reader |
字符输入流 |
Writer |
字符输出流 |
Java IO流关系图
File类
在整个IO包中,唯一与文件本身有关的类就是File类。使用File类可以进行创建或删除文件等常用操作
流的概念
Java中流,简单的说就是字节(byte),可以把它看作是很多很多字节(byte)汇在一起形成的东西,起个名字就叫流,像水滴形成河流一样
IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
按处理方式来分:
字节流:按8位传输 InputStream OutputStream
字符流:按16位传输 Reader Writer
按功能来分:
节点流:与文件、网络打交道的流,操作数据的来源
处理流(包装流):操作节点流
如何区分:
输入流:以InputStream、Reader结尾的流 FileInputStreamBufferedReader
输出流:以OutputStream、Writer结尾的流 FileOutputStreamPrintWriter
字节流:以InputStream、OutputStream结尾的流
字符流:以Reader、Writer结尾的流
节点流:看构造器,参数为数据来源,参数是String或File之类的
new FileInputStream("test.txt"); new FileOutputStream(new File("test.txt"))
处理流:构造器的参数为其它流(采用装饰模式)
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File()),"UTF-8")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File()),"UTF-8"))
选择流时: 首先确定是输入还是输出; 其次确定是字节流还是字符流;然后确定是节点流还是处理流。
因为所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按直接的方式存储的,而字符是只有在内存中才会形成,所以开发中,字节流使用较为广泛
根据数据类型选择输入/输出流:
byte、byte[]:InputStream / OutputStream
int、byte、char、double、String:DataInputStream / DataOutputStream
char:StringReader / Writer
Object:ObjectInputStream / ObjectOutputStream
若考虑性能会在前试着加Buffered
InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据
ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)
OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
PipedOutputStream 是向与其它线程共用的管道中写入数据,ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。
字节--字符转换流
OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象
常用流:
DataInputStream&DataOutputStream 用于读写基本类型数据,如int、float、long、double和boolean等。此外,DataInputStream的readUTF()方法还能读取采用UTF-8字符编码的字符串。
BufferedInputStream&BufferedOutputStream 因为利用了缓冲区,所以常用于提高读写数据的效率。
BufferedInputStream先把一批数据读入到缓冲区,接下来read方法只需要从缓冲区内获得数据,减少了物理性读取数据的次数。
可以使用BufferedInputStream(InputStream in, int size) 中的size来指定缓冲区的大小
ObjectOutputStream&ObjectInputStream
对象的序列化是指把对象写到一个输出流中,
对象的反序列化是指从一个输入流中读取一个对象。
Java语言要求只有实现了java.io.Serializable接口的类的对象才能序列化和反序列化
Reader/Writer
当需要程序读写文本文件,而且文本文件采用特定的字符编码集时,应采用Reader/Writer。
InputStreamReader & OutputStreamWriter 桥梁流
把字节流转换成字符流
在桥转换的时候可以指定编解码方式
new BufferedReader(new InputStreamReader(new FileInputStream("abc.txt"), "utf8"));
BufferedReader
readLine()方法可以一次读入一行字符,以字符串形式返回。
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("index.html"),"utf-8")); String content=""; StringBuilder sb = new StringBuilder(); while((content=br.readLine())!=null){ sb.append(content); }
PrintWriter 输出格式化的数据,所有的写数据的方法以print开头。
print (int i)
print (long l)
print (float f)
print (String s)
每个print() 方法都有一个println()方法对应
对象序列化
1:定义:把对象作为一个整体,在I/O流中传播
2:语法:
(1)实现了Serializeble接口的对象才能可序列化。这个接口里没有任何方法,没有方法的接口称为标记接口。
例如:class Student implements Serializeble{}
(2)如果一个序列化后的对象里面有一个属性是个对象属性,那么这个对象属性也需要实现序列化。
例如:class Student implements Serializeble{
Teacher t;//必须序列化
}
class Teacher implements Serializeble{}
(3)包名、类名、属性可以被序列化
方法、构造器不会序列化
所有的静态属性都不会被序列化
用transient关键字修饰的属性是临时属性,临时属性不参与序列化。
(4)当父类实现Serializeble接口,子类自动实现。对象序列化会创建对象,不调用构造,但子类实现Serializeble接口,
父类没有实现实现Serializeble接口,父类在反序列化时会调用构造。
3:使用注意:
a.用readObject读文件的时候,当文件结束的时候会抛出EOFException,当我们捕获这个异常的时候,程序就结束了。
Object o = null;
while((o =ois.readObject()) != null) {
}
b.如果需要向一个文件中追加对象,首先要把文件中原有的对象读出来,再把原有对象和新追加的对象一起写入到文件。
c. serialVersionUID是静态常量,表示当前对象的版本号,在接受传输的数据时会自动检查该值,保证版本的相同。
java.util.Properties属性类
文件名以.properties结尾的文件称为属性文件
文件的内容是:名字=值 的形式
常用方法:
public void load(InputStream inStream)throws IOException
public void store(OutputStream out,String comments)throws IOException
public String getProperty(String key)
public String getProperty(String key,String defaultValue)
public Object setProperty(String key,String value)
参考 http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html
http://xiaorenxinong.iteye.com/blog/411175
IO流思维导图下载