JavaSe基础(28)-- 字符流

字符流

  • 字符流主要用于操作文字数据
  • 数据操作原理

  • JavaSe基础(28)-- 字符流_第1张图片

Writer

  • 是所有输出字符流的父类,是一个抽象类
  • 通常使用的子类为:FileWriter

FileWriter

    public static void main(String[] args) throws IOException {

        /*1、创建一个可以往文件中写入字符数据的字符输出流对象。
          2、这个文件可能不存在啊 好吧是Z盘  所以需要抛一个 
          3、如果文件不存在,则会自动创建。
             如果文件存在,则会被覆盖。
             如果构造函数中加入true,可以实现对文件进行续写!
        */
        FileWriter fw = new FileWriter("ademo.txt");
        /*
         * 4、调用Writer对象中的write(string)方法,写入数据。
         * 5、查看发现没有
         *    其实数据写入到临时存储缓冲区中。
         * */
        fw.write("aaaa");
        /*
         * 6进行刷新,将数据直接写到目的地中。
         */
        //fw.flush();

        /*
         * 8、
         * 关闭由来
         * 当我们写入硬盘数据的时候,好比记事本一样,
         * 调用的是windows中的资源,
         * 所以要把win的资源关掉。要不然,浪费资源。
         * 8、关闭流,关闭资源。在关闭前会先调用flush刷新缓冲中的数据到目的地。
         * 所以就不用去单独调用flush
         */
        fw.close();

        /*
         * 9、还能继续写么
         */
        //fw.write("bbbb");// java.io.IOException: Stream closed

    }

Reader

  • 是所有输入字符流的父类,是一个抽象类
  • 通常使用的子类为:FileReader
  • 读取一个文本文件。将读取到的字符打印到控制台

    1、读取 一个

    public static void main(String[] args) throws IOException
    {
        //1,创建读取字符数据的流对象。
        FileReader fr = new FileReader("demo.txt"); 
    
        //2、用Reader中的read方法读取字符。
        int ch = fr.read();
        System.out.println((char)ch);
        int ch1 = fr.read();
        System.out.println(ch1);
    
        //4、当不存在的时候   返回为-1
        int ch2 = fr.read();
        System.out.println(ch2);
    
        //3、关闭资源
        fr.close();
    
    }
    

    改写

    public static void main(String[] args) throws IOException
    {
        /*1,创建读取字符数据的流对象。
         * 在创建读取流对象时,必须要明确被读取的文件。
         * 一定要确定该文件是存在的。 
         * 用一个读取流关联一个已存在文件。 
         * demo.txt 中有只ab两个字符
         */
        FileReader fr = new FileReader("demo.txt"); 
    
        //2、由于读取的数据不断在变化  所以定义一个变量用于接收读取的数据。
        int ch = 0;
        while((ch=fr.read())!=-1){
            System.out.println((char)ch);
        }
    
        //3、关闭资源
        fr.close();
    }
    
    2、读取一组
    
    public static void main(String[] args) throws IOException
    {
        /*  
         * demo.txt 中有只abcd四个字符
         */
        FileReader fr = new FileReader("demo.txt"); 
    
        /*
         * 2、使用read(char[])读取文本文件数据。
         * 先创建字符数组。
    
         */
        char[] buf = new char[2];
    
        int num = fr.read(buf);//将读取到的字符存储到数组中。返回字符数
        System.out.println(num+":"+new String(buf,0,num));//数组变成字符串
    
        int num1 = fr.read(buf);//将读取到的字符存储到数组中。
        System.out.println(num1+":"+new String(buf,0,num1));
    
        int num2 = fr.read(buf);//不存在 返回的是-1  会出现和之前的重复数据
        System.out.println(num2+":"+new String(buf));
    
        //3、关闭资源
        fr.close();
    }
    

    改写

        public static void main(String[] args) throws IOException
        {
            /*  
             * demo.txt 中有只ab两个字符
             */
            FileReader fr = new FileReader("demo.txt"); 
    
            /*
             * 2、使用read(char[])读取文本文件数据。
             * 先创建字符数组。
             * 从0开始读取 到一共的个数 有多少读取多少 
             *      cbuf - 目标缓冲区
             *      off - 开始存储字符处的偏移量
             *      len - 要读取的最多字符数
             */     
    
            char[] buf = new char[1024]; //一般是1024的整数倍即可
            int len = 0;
            while((len=fr.read(buf))!=-1){
                System.out.println(new String(buf,0,len));
            }
    
            //3、关闭资源
            fr.close();
        }
    

练习:将c盘的一个文本文件复制到d盘

    public class CopyTextTest{

        private static final int BUFFER_SIZE = 1024;

        /**
         * @param args
         */
        public static void main(String[] args) {

            FileReader fr = null;
            FileWriter fw = null;
            try {
                fr = new FileReader("IO流_2.txt");
                fw = new FileWriter("copytest_2.txt");

                //创建一个临时容器,用于缓存读取到的字符。
                char[] buf = new char[BUFFER_SIZE];//这就是缓冲区。 

                //定义一个变量记录读取到的字符数,(其实就是往数组里装的字符个数 )
                int len = 0;

                while((len=fr.read(buf))!=-1){
                    fw.write(buf, 0, len);
                }

            } catch (Exception e) {
    //          System.out.println("读写失败");
                throw new RuntimeException("读写失败");
            }finally{
                if(fw!=null)
                    try {
                        fw.close();
                    } catch (IOException e) {

                        e.printStackTrace();
                    }
                if(fr!=null)
                    try {
                        fr.close();
                    } catch (IOException e) {

                        e.printStackTrace();
                    }
            }
        }

    }

你可能感兴趣的:(JavaSe基础(28)-- 字符流)