IO学习笔记(一)

一、对文件的写操作

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);
}


上一篇:new IO学习笔记(二)之字节存放顺序


下一篇:new IO学习笔记(一)