zoukankan      html  css  js  c++  java
  • java基础知识回顾之javaIO类FileWriter和FileReader

    FileWriter类的构造方法定义如下:

    1.public FileWriter(File file)throws IOException

    字符流的操作比字节流操作好在一点,就是可以直接输出字符串了,不用再像之前那样进行转换操作了。

     

    复制代码
    package com.lp.ecjtu;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class FileWriterDemo {
    
        /**
         * 字符流,创建一个FileWriter对象,该对象一被初始化,就必须明确操作的文件,将
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            //而且该文件被创建到指定目录下,如果该目录下面已经有同名的文件,将被覆盖
            FileWriter fw = new FileWriter("Demo.txt");
            //调用write方法,将字符串写入到流当中去,也就是缓冲区中
            fw.write("abcefg");
            //刷新流对象中的缓冲中的数据
            //将数据刷到指定的文件当中去
            fw.flush();
            //fw.close();//如果用close,则流关闭,后面的写入流将不会被执行
            fw.write("3423");
            fw.flush();
        }
    
    }
    复制代码

    输出结果:

    在Demo.txt文件中写入了:abcefg3423

    2.public FileWriter(File file,boolean append)throws IOException 用FileWriter的另一种构造方法,传递一个true参数,代表不覆盖已有的文件。并在已有文件进行续写
    复制代码
    package com.lp.ecjtu;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * 对已有文件的续写
     * @author Administrator
     *
     */
    public class FileWriterDemoApend {
    
        /**
         * 创建一个FileWriter对象,该对象一被初始化,就必须明确操作的文件
         * @param args
         * @throws IOException 
         * @throws IOException 
         */
        public static void main(String[] args){
            FileWriter fw = null;
            try{
                //用FileWriter的另一种构造方法,传递一个true参数,代表不覆盖已有的文件。并在已有文件进行续写
                fw = new FileWriter("Demo.txt",true);
                //调用write方法,将字符串写入到流当中去,也就是缓冲区中
                fw.write("234334\r\n谢谢");
                
            }catch (IOException e) {
                e.printStackTrace();
            }finally{
                    try {
                        if(fw != null){
                            fw.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    }
    复制代码

    输出结果:在文件中续写字符串:

    结果变为

    abcefg3423234334

    谢谢

    FileReader的构造方法定义如下:

    public FileReader(File file)throws FileNotFoundException

    FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader

     

    例子:一个字符一个字符读取文件:

     

    复制代码
    package com.lp.ecjtu;
    
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReaderDemo {
    
        /**
         * 怎样去捕获IO异常,标准的捕获异常方式
         * 下面的1,2,3都会抛出异常,可能发生的异常有下面三个:
         * 1.java.io.FileNotFoundException //关联的文件不存在
         * 2.java.lang.NullPointerException //FileReader可能没有new
         * 3.IOException //操作IO流的时候抛出的异常
         */
        public static void main(String[] args) {
            //创建一个文件读取流对象,和指定的名称的文件相关联
            //要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException
            FileReader fr = null;
            try {
                    fr = new FileReader("Demo.txt");
                
                 //一次读取一个字符,而且会自动往下读
                /* int char1 = fr.read();
                System.out.println("char1="+(char)char1);//char1=a
                int char2 = fr.read();
                System.out.println("char2="+(char)char2);//char2=b
                int char3 = fr.read();
                System.out.println("char3="+(char)char3);//char3=c
                int char4 = fr.read();
                System.out.println("char4="+(char)char4);//char4=e
                int char5 = fr.read();
                System.out.println("char5="+(char)char5);
                int char6 = fr.read();
                System.out.println("char6="+(char)char6);
                int char7 = fr.read();
                System.out.println("char7="+char7);*/
                //如果达到流的末尾,则返回-1,-1为数据的分割符
                int ch = 0;
                while((ch=fr.read())!= -1){
                    System.out.print((char)ch);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(fr != null){
                    try {
                        fr.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
            }
        }
    
    }
    复制代码

     

    输出结果:

    abcefg3423234334
    谢谢

    以字符数组的形式读取:

    使用:

    public int read(char[] cbuf)
             throws IOException
    复制代码
    package com.lp.ecjtu;
    
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReaderDemo2 {
    
        /**
         * @param args
         */
        public static void main(String[] args) throws IOException{
            //创建一个文件读取流对象,和指定的名称的文件相关联
            //要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException
            FileReader fr = new FileReader("Demo2.txt");
            
            //定义一个字符数组,用于存储读到的字符
            //char[] ch = new char[1024];
            //返回读到的字符个数
            //每次读3字符个放到字符数组缓冲区当中,一次性存储3个放到数组当中,然后在一次性读取出来
            char[] ch = new char[3];
            int num = fr.read(ch);
            System.out.println("num="+num+"----"+new String(ch));
            int num1 = fr.read(ch);
            System.out.println("num1="+num1+"----"+new String(ch));
            int num2 = fr.read(ch);
            System.out.println("num2="+num2+"----"+new String(ch));
            int num3 = fr.read(ch);
            System.out.println("num3="+num3+"----"+new String(ch));
            
            int nu = 0;
            while((nu=fr.read(ch)) !=-1){
                System.out.println(new String(ch,0,nu));
            }
            
            fr.close();
        }
    
    }
    复制代码

    输出:demo2中存储的字符为:abcdefg

    num=3----abc
    num1=3----def
    num2=1----gef
    num3=-1----gef

    以字符数组的的形式循环读取java文件

    复制代码
    package com.lp.ecjtu;
    
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReaderJava {
    
        /**
         * @param args
         * 读取一个java文件,并且打印到控制台上
         */
        public static void main(String[] args) throws IOException{
            //创建一个文件读取流对象,和指定的名称的文件相关联
            //要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException
            FileReader fr = new FileReader("FileReaderDemo.java");
            
            //定义一个字符数组,用于存储读到的字符
            char[] ch = new char[1024];
            //返回读到的字符个数
            int num= 0;
            while((num=fr.read(ch)) !=-1){
                System.out.print(new String(ch,0,num));
            }
            
            fr.close();
        }
    
    }
    复制代码

    文件的复制:将一个盘的文件复制到另一个盘:

    复制代码
    package com.lp.ecjtu;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class CopyTest {
    
        /**将C盘一个文本文件复制到D盘
         * @param args
         * 原理:其实就是将C盘下的文件数据存储到D盘的文件当中
         * 步骤:
         * 1.在D盘创建一个文件,用于存储C盘文件的数据
         * 2.定义读取流和C盘文件相关联
         * 3.通过不断的读写完成数据的存储
         * 4.关闭资源
         * @throws IOException 
         */
        
        public static void copy1() throws IOException{
            //创建要写出到哪个文件,也就是目的地:为硬盘文件
            FileWriter fw = new FileWriter("testjava.txt");
            //与要拷贝的文件关联,也就是读取要拷贝的文件 源:为硬盘文件
            FileReader fr = new FileReader("FileReaderDemo.java");
            int ch=0;
            //从c盘  读一个,就往D盘复制一个
            while((ch = fr.read())!= -1){
                fw.write(ch);
            }
            fw.close();
            fr.close();
        }
        /**
         * 写入数组缓存中,一次读出,一次性写入
         * @param args
         * @throws IOException
         */
        public static void copy2(){
            FileWriter fw = null;
            FileReader fr = null;
            
            try {
                fw = new FileWriter("test2.txt");
                fr = new FileReader("FileReaderDemo.java"); 
                char[] buf = new char[1024];
                int len = 0;//表示buf数组的长度
                while((len = fr.read(buf))!=-1){
                    fw.write(buf,0,len);
                    System.out.println(buf);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                try {
                    if(fw != null){
                        fw.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    if(fr != null){
                        fr.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
        public static void main(String[] args) throws IOException {
            copy1();
            copy2();
        }
    
    }
    复制代码

    总结:copy1的效率低于copy2,因为copy2一次性把数组复制到数组缓冲区,然后在写入流中。

  • 相关阅读:
    Java下载文件,中文名乱码(attachment;filename=中文文件名)
    Spring Boot打jar包,排除lombok等scope=provided的依赖
    VirtualBox+WinDbg+Win7调试环境配置
    【编译原理】FIRST集、FOLLOW集算法原理和实现
    epoll EPOLLL、EPOLLET模式与阻塞、非阻塞
    【编译原理】提取左部公因子算法
    编译和阅读WRK源码
    WRK 源码编译使用
    Windows加载器与模块初始化
    关于Win7 x64下过TP保护(应用层)
  • 原文地址:https://www.cnblogs.com/hanease/p/15717320.html
Copyright © 2011-2022 走看看