一、对文件的写操作
1. FileWriter对象
FileWriter fw = new FileWriter("XXX");
只要对文件进行IO操作,就会有IOException异常。
创建一个FileWriter对象,该对象一初始化,必须要明确要操作的文件。
而且如果在该目录下如果存在与指定文件同名的文件,那么同名文件将被覆盖。
在用FileWriter对象写文件的时候,数据是被写到了缓冲中,所以要flush()。
当我们调用flush()方法时,FileWriter对象没有被关闭,我们可以继续向其中写数据。
调用FileWriter对象的close()方法前,会默认的自动调用flush()方法,但是调用close()方法后,将不能再进行写操作。
2. 对IO操作的异常的处理方式
在try外创建引用,在try内进行初始化,对FileWriter对象的关闭要在finally中执行,并且要加入不等于空的判断,防止文件找不到异常。
3. 利用FileWriter进行文件的续写
查阅JDK后我们发现在FileWriter的构造函数FileWriter(String fileName, boolean append)
对文件的续写给予了支持。
在文件续写时要注意的一个问题是:在Windows下的换行 \r\n 在linux下为\n
二、对文件的读操作
4. FileReader对象
FileReader fr = new FileReader("XXX");
fr.read();一个字符一个字符的读取即读取单个字符,每次返回的是一个字符,但是整形的,需要我们强制的转换成char。
fr.read(c);------read(char[] cbuf) 将读到的字符放入数组
fr.read(c,0,len);------read(char[] cbuf, int off, int len)
将字符读入数组的某一部分
读到文件的末尾会返回-1
5. 文件的拷贝(简写)
FileWriter fw = new FileWriter("xxx");
FileReader fr = new FileReader("xxxx");
char[] buf = new char[1024];
int len = 0 ;
while ((len = fr.read(buf))) {
fw.write(buf,0,len);
}
fw.close();
fr.close();
6. BufferWriter---BufferedReader
缓冲区的出现是为了提高流的操作效率,在缓冲区创建之前必须有流对象
BufferedWriter(Writer out)
BufferedWriter(Writer out, int sz)
BufferedWriter中多了一个newLine()的方法。
BufferedReader中出现了一个新的方法,readLine(),一次读一行的方法包含改行内容的字符串,不包含任何行终止符,如果已到达流的末尾,则返回null.
BufferedReader(Reader in)
BufferedReader(Reader in, int sz)
文件拷贝实现-----(一)
BufferedWriter bufw = new BufferedWriter(new FileWriter("D:\\a.txt"));
BufferedReader bufr = new BufferedReader(new FileReader("d:\\copy.txt"));
String str = null;
while ((str = bufr.readLine()) != null) {
bufw.write(str);
bufw.newLine();
bufw.flush();
}
文件拷贝实现-----(二)
FileWriter fw = new FileWriter("A.txt");
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("aaaaaaaccc");
bufw.flush();
7. readLine()方法的实现原理
8. 装饰设计模式的应用
当已有类的方法不能满足我们的需求的时候,我们可以采用装饰设计模式来对我们已有的对象进行增强,这里要注意是对对象的增强,如何对对象进行增强呢?我们可以定义一个新的类,然后在这个类中通过构造方法中传入原来的对象,基于已有的功能,并提供加强功能,那么自定义的类称为装饰类。在IO操作中,BufferedWriter 就是采用了装饰设计模式。
9.
FileInputStream
FileOutputStream
采用字节的方式对文件进行操作,在对图片、声音、视频等文件操作的时候就必须采用字节的方式对文件进行读取。其操作与字符流的操作基本一致,只是中间存放数据的数组发生了变化,由原来的字符数组变成了字节数组。
FileInputStream fi = new FileInputStream("D:\\1.jpg");
FileOutputStream fo = new FileOutputStream("D:\\2.jpg");
byte[] b = new byte[1024];
int len = 0;
while ((len=fi.read(b))!=-1)
{
fo.write(b,0,len);
}
10.
BufferedInputStream(InputStream in)
BufferedOutputStream(OutputStream out)
实现缓冲的输入输出流,与字符缓冲的输入输出流类似,都是在底层实现了数组,所以我们在使用的时候也不需要字节手动去创建字节数组,直接用就可以。
FileInputStream fi = new FileInputStream("D:\\1.jpg");
FileOutputStream fo = new FileOutputStream("D:\\2.jpg");
BufferedOutputStream bufo = new BufferedOutputStream(fo);
BufferedInputStream bufi = new BufferedInputStream(fi);
int len = 0;
while ((len=bufi.read())!=-1)
{
bufo.write(len);
}