【黑马程序员】----Java 基础之 IO流__字符流

来源:互联网 发布:mac没有insert怎么办 编辑:程序博客网 时间:2024/05/22 04:55


Java中的IO流,在平时也是很常用的一个类,IO流包括四个基类,InputStream,OutputStream,Reader,Writer,前两个为字节流的读写操作类,后两个是字符流的读写操作类,字符流的出现可以有效解决数据在读写过程中的编码转换问题。

下面根据毕老师的讲解,从不同角度总结IO的使用方法:

一、Reader && Writer

1、FileWriter,从字面上可以看出,这个是Writer的一个子类,看下具体用法

<span style="white-space:pre"></span>//先引用FileWriter fw = null;try {//再实例化,数据IO流,肯定需要制定操作的数据,写文件,肯定也要制定待操作的文件//注意,如果指定的文件已存在,该方法会覆盖源文件内容fw = new FileWriter("E:\\test.txt");fw.write("黑马程序员");} catch (IOException e) {e.printStackTrace();}finally{//使用完IO流,一定记得要关闭,所以放在finally代码块中处理try {//此处值得注意的是,如果fw在实例化的过程中出错,如硬盘未找到,则实例化会失败,fw对象为null//此处再执行close时会空指针异常,所以要先进行判断if(fw != null){fw.close();}} catch (IOException e) {e.printStackTrace();}}//结果: 在E盘下创建了test.txt文件,文件内容为“黑马程序员”
2、文件的追加读写

上一种文件的写入方式很直观且很便捷,但是有一个很明显的问题就是,如果文件已经存在,它会暴力的覆盖掉原内容,这时就引入了另外一个问题,文件的追加读写。仔细看FileWriter的构造函数,可以添加一个参数,是否在末尾进行数据追加,那么就简单了:

//其他步骤不变,仅添加true参数fw = new FileWriter("E:\\test.txt",true);fw.write(",我来了");//结果: test.txt文件未被覆盖,末尾追加了,我来了
3、文件的读取

3.1 FileReader , 字符读取的便捷类,先将上次写好的文件内容读取出来

FileReader fr = null;try {//创建文件读取流对象,并制定文件路径,需要确保文件存在,否则会抛文件不存在异常fr = new FileReader("E:\\test.txt");int r = 0;//注意read(),每次只读取一个字符,且是依次读取,当读到末尾时返回-1while((r=fr.read()) != -1){System.out.print((char)r);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {if(fr != null){fr.close();}} catch (IOException e) {e.printStackTrace();}}
3.2 通过字符数组读取

read(byte[] bt);  这种方法是将数据读取到byte[]数组中,返回的读取到的字符个数,读取到末尾时返回 -1 .

case: 将D盘下的一个txt文件copy到E盘下。

原理: 先读取D盘下的文件,然后再写入到E盘,使用FileReader、FileWriter

//创建ReaderFileReader fr = null;//创建WriterFileWriter fw = null;try {fr = new FileReader("E:\\test.txt");fw = new FileWriter("E:\\test1.txt");//先读取文件,存储在内存中,然后再写入文件,可以提高效率char[] buffer = new char[1024];int len = 0; //读取到的长度while((len = fr.read(buffer)) != -1){fw.write(buffer,0,len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{if(fr != null){try {//关闭流fr.close();} catch (IOException e) {e.printStackTrace();}}if(fw != null){try {//关闭流fw.close();} catch (IOException e) {e.printStackTrace();}}}
二、BufferedWriter && BufferedReader

提高效率之 字符流缓冲区。 缓冲区的出现是为了提高流的操作效率的,因此在创建缓冲区之前必须先有流对象。

 1、BufferedWriter 的用法

try {//创建写入流FileWriter fw = new FileWriter("E:\\test2.txt");//创建缓冲区,将写入流作为参数传入即可BufferedWriter bfw = new BufferedWriter(fw);bfw.write("你好,黑马");//用到缓冲区,就要刷新bfw.flush();//关闭缓冲区就关闭了流bfw.close();} catch (IOException e) {e.printStackTrace();}
注意点: 在循环写数据时,最好写一次flush一次; 跨平台换行符  newLine();

2、BufferedReader的用法

try {//创建读写流FileReader fr = new FileReader("E:\\test2.txt");//创建缓冲区BufferedReader br = new BufferedReader(fr);String back = "";//readLine会读取一行,读取到数据末尾时返回nullwhile((back = br.readLine()) != null){System.out.println(back);}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

注意点: 缓冲区一定要关闭,可以在finally代码块中进行关闭,也要进行非空判断



0 0