(一)A.按操作数据分:字节流(抽象基类:InputStream,OutputStream)与字符流(抽象基类:Reader,Writer)。 B.按流向分:输入流和输出流。
(二)FileWriter的writer()方法是将字符串写入到流中,flush()方法将数据刷新到目的地,即目标文件中。操作流一定要记得调用close方法关闭资源。该方法关闭流资源前会刷新一次内部缓存区的数据。
(三)IO异常处理:
package cn.cx.io.file;
import java.io.FileWriter;
import java.io.IOException;
publicclass FileDemo02 {
publicstaticvoid main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("D:\\2015SE\\IOStudy\\demo2.txt");
fw.write("shdckshc");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fw != null) //注意:先判断再关
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(四)FileReader的read方法当读到文件末尾时返回-1。
(五)字符流的缓冲区:要结合流才可使用,在流的基础上对流的功能进行了增强。对应类:BufferedWriter,BufferedReader(readerLine方法只返回回车符之前的内容,不返回回车符;所以输出时可调用BufferedWriter的newLine方法)。 readLine原理:最终使用的还是read方法一次读一个,以 \r\n为行尾标记,读一行储存在缓冲里。
(六)装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能增强。例如自定义一个MyBufferedReader,增强read方法。
package cn.cx.io.file;
import java.io.FileReader;
import java.io.IOException;
publicclass MyBufferedReader {
private FileReader r;
public MyBufferedReader(FileReader r) {
super();
this.r = r;
}
public String myReadLine() throws IOException {
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=r.read())!=-1) {
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
returnnull;
}
publicvoid close() throws IOException {
r.close();
}
(七)关于InputStream类中read方法返回int不返回byte的原因:因为在非字符数据中数据的开头很有可能是11111111(-1)开头的,为避免-1(结束标记)的出现,可以返回int型(byte自动类型提升为int(1111-1111-1111-1111-1111-1111-1111-1111)),再&上255(0000-0000-0000-0000-0000-0000-1111-1111)就可以保证原数据的有效数据不变并避免-1。
(八)转换流(可查码表):字节流---->字符流InputStreamReader 。字符流---->字节流OutputStreamWriter
(九)流操作的基本规律:A.明确源和目的,源:输入流(InputStream Reader )目的:输出流(OutputStream Writer) B.操作数据是否为纯文本。是(字符流)
C.明确使用哪个具体的对象。通过设备区分:源设备:内存,硬盘,键盘。目的设备:内存,硬盘,控制台。如还需提高效率,找Buffered
(十)Properties是HashTable的子类,具备map集合特点。是集合中和IO技术先结合的集合容器。
(十一)ObjectInputStream与ObjectOutputStream:被操作对象需要实现Serializable接口
(十二)管道流:PipedInputStream,PipedOutputStream。结合线程使用