---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一概述
IO流是用来处理设备之间的数据传输的,Java对数据的操作都是通过流的方式,Java将用于操作流的对象都封装在IO包中
流按操作数据的不同分为:字符流、字节流
流按流向的不同分为:输入流、输出流
字符流其实也是按照字节的方式传输数据,但是它集成了编码表,用于操作文本数据很方便
字符流的抽象基类:Reader,Writer
字节流的抽象基类:InputStream,OutputStream
IO流中由基类派生出的子类都以其父类名作为其后缀
注意:对于读操作,要明确数据的来源,也就是从哪里读;对于写操作,要明确数据的去向,也就是往哪里写。
二字符流
基类:Reader,Writer
Reader:
public abstract class Reader
extends Object
implements Readable, Closeable
几个重要的方法:
abstract void close() 关闭资源用的,其实流在底层操作的是系统资源,所以一定要关闭
int read() 读取单个字符。注意返回值是int,如果返回-1,说明已经到了流的末尾
int read(char[] cbuf) 将字符读入数组cbuf,所以要先定义数组,数组大小一般定义1024
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
Writer:
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
重要方法:
abstract void close() 关闭此流,但要先刷新它。
abstract void flush() 刷新该流的缓冲,writer之后,只有刷新后才能写到目的源
void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。
在字符流中常用的子类有
FileReader,FileWriter
BufferedReader,BufferedWriter
注意,他们都没有无参的构造函数,因为不管读取还是写入,都要明确源。
对于FileReader和FileWriter,他们的方法都是继承而来的
BufferedReader和BufferedWriter都继承自基类,但是用用装饰设计模式对Writer和和Reader的子类进行了功能的加强。
BufferedReader中注意方法 StringreadLine();读取一行文本
BufferedWriter中注意方法void newline();写入一个分隔符
BufferedReader有一个子类叫LineNumberReader可以读取行号
装饰设计模式:当想要对已有的对象进行功能的增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强的功能,那么这个自定义的类就叫做装饰类。装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能提供更强的功能,例如BufferedReader中的readLine方法就是加强的功能。
三字节流
基类:InputStream,OutputStream
方法与字符流大同小异
对应字节流,有四个子类
FileInputStream,FileOutputStream
BufferedInputStream,BufferedOutputStream
在BufferedInputStream中要注意一个方法
int available() ,可以利用它的返回值创建大小正好的数组来存放读取到的数据,但是如果源文件太大,那么这个数组将很大,可能内存不够用
当程序读写文件时,在读写操作完毕后,就会及时的关闭输入流或输出流,这些输入流或输出流的生命周期是短暂的,不会存在于程序运行的整个生命周期中。
对于某些应用程序,需要在程序运行的整个生命周期中,从同一个数据源读入数据,或者像同一个数据汇输出数据,例如日志信息,这就需要一些始终打开的流。
在java.lang.System类中,提供了三个静态变量:
System.in:为InputStream类型,代表标准输入流,默认输入源为键盘
System.out:为PrintStream类型,代表标准输出流,默认数据汇为控制台
System.err:为PrintStream类型,代表标准错误输出流,默认数据汇是控制台
这三种流都是有JVM创建的,他们存在于程序运行的整个生命周期中,这些流始终处于打开状态,除非程序显示的关闭他们,只要程序没有关闭这些流,在程序运行的任意时刻都可以使用他们来输入或输出数据。
转换流
读取转换流:InputStreamReader字节流通向字符流的桥梁
写入转换流:OutputStreamWriter字符流通向字节流的桥梁
四File类
用来将文本或者文件夹封装成对象,方便对文件和文件夹进行操作。File对象可以作为参数传递给流的构造函数。
属性:
static String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
方法:
1.创建和删除
boolean createNewFile()
boolean mkdir()
boolean mkdirs()
boolean delete()
void deleteOnExit()
2.判断
boolean exists()
boolean isAbsolute()
boolean isDirectory()
boolean isFile()
boolean isHidden()
3.获取
File getAbsoluteFile()
String getAbsolutePath()
File getCanonicalFile()
String getCanonicalPath()
long getFreeSpace()
String getName()
String getParent()
File getParentFile()
String getPath()
boolean renameTo(File dest)
五Properties类
Properties 是 Hashtable 的子类 ,也就是说它具备Map集合的特点,而且它里面存储的键值对都是字符串
它是集合中和IO技术相结合的集合容器
该对象特点:可以用于键值对形式的配置文件。
那么在加载数据时候,需要数据有固定格式:键-值
Properties存取配置文件
String getProperty(String key)
String getProperty(String key,String defaultValue)
void list(PrintStream out)
void list(PrintWriter out)
void load(InputStream inStream)
void load(Reader reader)
Object setProperty(String key,String value)
void store(OutputStream out,String comments)
void store(Writer writer,String comments)
六IO流总结
体系:
Reader
|--InputStreamReader
|--FileReader
|--BufferedReader
|--LineNumberReader
|--CharArrayReader
|--StringReader
|--PipedReader
Writer
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
|--CharArrayWriter
|--StringWriter
|--PrintWriter
|--PipedWriter
File
InputStream
|--FilerInputStream
|--LineNumberInputStream
|--BufferedInputStream
|--DataInputStream
|--FileInputStream
|--ByteArrayInputStream
|--PipedInputStream
|--ObjectInputStream
|--SequenceInputStream
OutputStream
|--FilerOutputStream
|--PrintOutputStream
|--BufferedOutputStream
|--DataOutputStream
|--FileOutputStream
|--ByteArrayOutputStream
|--PipedOutputStream
|--ObjectOutputStream
RandomAccessFile
接口
Serializable
怎么选择流对象呢?
1.明确源和目的,数据源操作用输入流,写入数据汇用输出流
2.操作的数据是否纯文本,是则用字符流,不是则用字节流
3.是否要提高效率
4.选择具体对象
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------