zoukankan      html  css  js  c++  java
  • day21 Java学习(IO(字符流))

    IO流(字符流FileReader)

        字符流:

               * 字符流是可以直接读写字符的IO流。

               * 字符流读取字符,就要先读取到字节数据,然后转为字符,如果要写出字符,需要把字符转为字节再写出。

        什么情况下使用字符流:

               * 字符流也可以拷贝文件,但不推荐使用,因为读取时会把字节转为字符,写出时还要把字符转回字节。

                * 程序需要读一段文本,或者需要写出一段文本的时候可以使用字符流

                * 读取的时候是按照字符的大小读取的,不会出现半个中文。

                * 写出的时候可以直接将字符串写出,不用转为字节数组。

          注意事项:

                * 不可以拷贝非纯文本的文件。(文件会乱码)

    IO流(字符流FileWriter)

               * FileWriter类的write()方法可以自动把字符转为字节写出。

      

    public static void main(String[] args) throws IOException  {
            // TODO 自动生成的方法存根
            FileWriter fw=new FileWriter("eee.txt");  //创建文件
            fw.write("六一快乐");                        //write():把字符转为字节.
            fw.close();                               //释放资源
        }
    wirte()

    IO流(字符流拷贝)

    public static void main(String[] args) throws IOException {
            FileReader fr = new FileReader("test.txt");  
            FileWriter fw = new FileWriter("eeecc.txt"); 
            int b;
            while ((b = fr.read()) != -1) {
                fw.write(b);
            }
            fr.close();
            fw.close();    //必须关闭,如果不关流,就会将内容写到缓冲区,关流会将缓冲区内容刷新,再关闭。
        }
    例子

    IO流(自定义字符数组拷贝)

    public static void main(String[] args) throws IOException {
            FileReader list = new FileReader("test.txt");
            FileWriter list2 = new FileWriter("copy.txt");
            char[] arr = new char[1024];
            int len;
            while ((len = list.read(arr)) != -1) {
                list2.write(arr, 0, len);
            }
            list.close();
            list2.close();
        }
    例子

    IO流(readLine( )和newLine( )方法)

       * BufferedReader的readLine( )方法可以读取一行字符(不包含换行符号)。

       * BufferedWriter的newLine( )可以输出一个跨平台的换行符号 “ "。

    public static void main(String[] args) throws IOException {
           /*
            * newLine()和
    的区别:
            * newLine()是跨平台的方法。
            * 
    只支持windows系统。
            */
            BufferedReader br=new BufferedReader(new FileReader("ccc.txt"));
            BufferedWriter bw=new BufferedWriter(new FileWriter("aa.txt"));
            String line;
            while ((line=br.readLine())!=null) {
                bw.write(line);
                bw.newLine();                //写出回车换行符 (效果跟
    是一样的)
                
            }
            br.close();
            bw.close();
        }
    例子
    public static void main(String[] args) throws IOException {
        //需求:将文本反转
        //注意事项:流对象尽量晚开早关
        //1.创建输入输出流对象
        BufferedReader br=new BufferedReader(new FileReader("ccc.txt"));
    
        //2.创建集合对象
        List<String> list =new ArrayList<>();
        String line;
        //3.将数据传到集合中
        while ((line=br.readLine())!=null) {
            list.add(line);
        }
        //4.关流
        br.close();
        
        //5.倒着遍历集合将数据写到文件上
        BufferedWriter bw=new BufferedWriter(new FileWriter("aass.txt"));
        for(int i=list.size()-1;i>=0;i--) {
        
        bw.write(list.get(i));
        bw.newLine();
        }
    
        bw.close();
        }
    将文本反转

     IO流(装饰设计模式)

        * 装饰设计模式的好处是:

                   * 耦合性不强,被装饰的类的变化与装饰类的变化无关。

    public static void main(String[] args) {
            // 
            heima dd=new heima(new Student());
            dd.code();
        }
    
    }
    
    interface  Coder {
    public void code();
    }
    
    class Student implements Coder {
    
        @Override
        public void code() {
            System.out.println("javas");
            System.out.println("javasd");
        }
    
    }
    //装饰设计模式
    class heima implements Coder{
        //1.获取被装饰类的引用
       private Student s;          //获取学生引用
    //2.在构造方法中传入被装饰类的引用
    public heima(Student s) {
        this.s=s;
    }
    
        // 3.对原有的功能进行升级
        @Override
    public void code() {
            // TODO 自动生成的方法存根
            s.code();
            System.out.println("大数据");
            System.out.println("...");
        }
        
    装饰类模式

     IO流(使用指定的码表读写字符)

        * FileReader 是使用默认码表读取文件,如果需要使用指定码表读取,那么可以使用InputStreamReader(字节流,编码表)

        * FileWriter 是使用默认码表读取文件,如果需要使用指定码表写出,那么可以使用OutputStreamReader(字节流,编码表)

       

    public static void main(String[] args) throws IOException {
            
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ccc.txt"), "UTF-8"));
    
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("aa.txt"), "GBK"));
            int ch;
            while ((ch = br.read()) != -1) {
                bw.write(ch);
            }
            br.close();
            bw.close();
    
        }
    码表读写字符
        public static void main(String[] args) throws IOException {
            // 创建带缓冲的流对象
            BufferedReader br = new BufferedReader(new FileReader("aass.txt"));
            // 创建双列集合
            TreeMap<Character, Integer> list = new TreeMap<>();
    
            // 读到的字符存储在双列集合中
            int line;
            while ((line = br.read()) != -1) {
                char info = (char) line;
                if (!list.containsKey(info)) {
                    list.put(info, 1);
                } else {
                    list.put(info, list.get(info) + 1);
                }
            }
            //关闭输入流
            br.close();
            // 创建输出流对象
            BufferedWriter bw = new BufferedWriter(new FileWriter("kkk.txt"));
            //6.遍历集合将集合中的内容写入到kkk.txt中
            for (Character key : list.keySet()) {
                switch (key) {
                case '	':
                    bw.write("\t" + "=" + list.get(key));
                    break;
                case '
    ':
                    bw.write("\n" + "=" + list.get(key));
                    break;
                case '
    ':
                    bw.write("\r" + "=" + list.get(key));
                    break;
                default:
                    bw.write(key + "=" + list.get(key));   //写出键和值
                    break;
                }
    
                bw.newLine(); 
            }
            bw.close();
        }
    IO流获取字符出现次数
    public static void main(String[] args) throws IOException {
            // 创建带缓冲区的输入流对象,使用readLine()可保证数据的原样性。
            BufferedReader br = new BufferedReader(new FileReader("aa.txt"));
            String line = br.readLine();
            // 将读到的字符串转换成int数
            int num = Integer.parseInt(line);
            // 对其进行判断,>0就将其--写回去。
            if (num > 0) {
                System.out.println("你还有" + num-- + "次机会");
                FileWriter fw = new FileWriter("aa.txt");
                fw.write(num + "");
                fw.close();
            } else {
                System.out.println("没次数了");
            }
            // 关流
            br.close();
        }
    试用版软件次数例子

    File类(递归)

       * 递归 :方法自己调用自己。

       * 递归的弊端:不能调用过多,容易导致栈内存溢出。

       * 递归的好处:不用指定循环次数。

       * 构造方法不能使用递归调用。

       * 递归调用返回值:不一定(可以有,也可以没有)

        

        * FileReader 是使用默认码表读取文件,如果需要使用指定码表读取,那么可以使用InputStreamReader(字节流,编码表)

  • 相关阅读:
    HDU 5583 Kingdom of Black and White 水题
    HDU 5578 Friendship of Frog 水题
    Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
    hdu 5594 ZYB's Prime 最大流
    hdu 5593 ZYB's Tree 树形dp
    hdu 5592 ZYB's Game 树状数组
    hdu 5591 ZYB's Game 博弈论
    HDU 5590 ZYB's Biology 水题
    cdoj 1256 昊昊爱运动 预处理/前缀和
    cdoj 1255 斓少摘苹果 贪心
  • 原文地址:https://www.cnblogs.com/feng0001/p/10958272.html
Copyright © 2011-2022 走看看