zoukankan      html  css  js  c++  java
  • Java基础(八)

    IO流

      概述与分类

                  Java中的IO流技术主要用于传输数据.典型的应用场景有:读写本地文件,上传下载文件等.按照数据传输的方向可以分为两种:

          l  输入流(Input):既让数据进入应用程序中.

          l  输出流(Output):既让数据离开应用程序.

        按照数据的种类还可以有另外一种分法:

          l  字节流:可以处理任何一种数据.

          l  字符流:只能处理纯文本数据.

        现阶段我们主要学习:字符输入流,字符输出流,来实现读写文件的功能.

           

      整理一下IO流的分类:

                    字节输入流

                    字节输出流

                    字符输入流: 读纯文本文件

                    字符输出流: 写纯文本文件

    FileWriter写文件

      一般步骤

                    使用java.io.FileWriter类可以将数据写到文本文档中,使用步骤为三步:

          1. 调用构造方法来创建一个FileWriter对象:

            public FileWrier(String filename);构造参数为文件路径名.

            备注:创建对象时,如果文件不存在,则会自动创建该文件.

          2. 调用写数据的成员方法向文件中写入数据:

            public void write(String text);参数为需要写入的字符串.

          3. 调用关闭的成员方法释放相关资源;

            public void close();

                  三步走:”创,写,关”.

                  注意事项:

          1. 千万不要忘记最后调用close方法进行关闭.

          2. 创建的时候,如果提示有可能有异常,点击Add throws…即可.

           

    覆盖与追加

                  在使用FileWriter的时候:

        1. 如果指定的文件不存在,那么会自动创建该文件.

        2. 如果指定的文件已经存在,那么将会覆盖写入.

        3. 如果不希望进行覆盖写入,而是希望进行追加,那么要用另外一种重载形式的构造方法:

          public FileWriter(String fileName,boolean append);第二个参数是true值,那么将会追加写入.

           

    换行符

                  如何才能实现换行的效果?

                  换行其实也是一种字符,叫做”换行符”.

                 

                  Windows当中的换行符是: 这叫做两个字符,一个是 ,一个是

                  macOS当中的换行符是:早期是 ,现在是

                  Linux当中的换行符是:

         

    数字与文字的转换

        其实所有数据在计算机底层都是二进制数字,所以一切数据都是数字。文件当中存放的其实并不是文字图形,而是数字序列。之所以打开文件可以看到文字图形,是因为软件对文件当中的数字进行了“翻译”。而翻译就需要一个对照词典,如:ASCll码表或Unicode码表。

        ASCll当中的字符种类比较少;而Unicode 包含了ASCll的内容,还扩展了数以万计的字符,可以涵盖全世界所有的文字。

        FileWriter提供了一种重载形式的write方法,可以省去将文字翻译成为数字的步骤,直接在文件当中写对应的数字:

        public void write(int ch):参数就是ASCll或Unicode表当中的数字,最小为0。

         

    FileWriter的write方法重载

                  FileWriter当中写数据的方法write有5种重载形式:

                  public void write(int ch);参数是单个文字对应的数字(参考ASCII或者Unicode表)

                  public void write(String str);写一个完整的字符串.

                  public void write(String str,int offset,int count);写字符串当中的一部分内容.

                  public void write(char[] array);写一个完整的字符数组.

                  public void write(char[] array,int offset,int count);写字符数组当中的一部分内容.

        

           

           

                  

    FileReader读文件

      一般步骤

          使用java.io.FileReader类可以读取文本文件当中的字符(对应的ASClI或Unicode值)。

          使用步骤为:

            1.调用构造方法来创建一个FileReader对象:

              public FileReader(String fileName):参数仍然为文件的路径名。!

              备注:如果文件不存在,不会自动创建,而会发生异常。

            2.调用读取数据的read方法获取单个字符:

              public int read():返回值为单个字符对应的ASCll或Unicode值。

              备注:每次调用都会读取下一个字符,如果没有更多,将返回-1值。

            3.调用close方法关闭流:

              public void close():释放相关资源。

            由于并不确定文件当中包含多少个字符,所以次数不确定的重复代码,应该使用while循环。当得到-1值时退出循环。

             

    读取单个字符

      调用一次输出一个字符,直到关闭流

         

      循环调用输出字符,直到关闭流

         

    读取字符数组

                  如果读取字符是一个一个地,那么效率很低.

                  为了提高效率,FileReader提供了另外一种重载形式的read方法:

                         public int read(char[] buf);一次读取整个字符数组的数据.

                  参数是一个字符数组,用来承载读取到的多个字符.

                  返回值代表的是数组当中读取到的有效个数.

         

         

        

    画图理解ol出现问题

         

    解决以上的ol出现问题写法

         

    为了减少硬编码,利用标准while循环写法

         

    读写数据的过程

         

    BufferedWriter的缓冲原理

        BufferedWriter和FileWriter差不多,也是一种用来写文件的类,属于字符输出流。

        区别在于BufferedWriter肚子里有一个长度为8192的char[]字符数组,当作缓冲区使用。

        每次在写数据的时候,实际上都是在不断地向缓冲数组当中添加字符。

        如果缓冲数组已经满了,那么将会统一地写到硬盘的文件当中。

        如果还没有写满,那么就等待下一次写入。

        如果最终关闭流的时候,数组仍然没满,那么也会将剩余的有效部分写到硬盘文件里。

    基本使用

      如何使用BufferedWriter?

    1. 首先创建一个普通的FileWriter
    2. 将这个普通的FileWriter包装成为缓冲的BufferedWriter,用构造方法.
    3. 后面BufferedWriter使用的方法和FileWriter基本一样.

      构造方法:      public BufferedWriter(FileWriter fw);  参数就是一个普通的FileWriter对象.

         

    newLine方法

           BufferedWriter额外提供了一个换行的方法.

           public void newline();将会自动根据操作系统的不同,选择写入 或者是 或者是 .

         

    BufferedReader的缓冲原理

             BufferedReader和FileReader差不多,也是用来读取文件的一种字符输入流。

    区别就在于BufferedReader肚子里也有一个8192长度的char[]字符数组,当做缓冲区使用。

        当读取数据的时候,一次性从硬盘当中读职最多8192个字符,放在数组缓冲区当中。

        在调用read方法的时候,只是从缓冲区当中拿出来字符进行使用。

        如果缓冲区当中的字符被“取空”,那么将会自动再次读取最多8192个再次放在缓冲区当中。

    基本使用

           如何使用BufferedReader?

    1. 首先创建一个普通的FileReader
    2. 将这个普通的FileReader包装成为缓冲的BufferedReader,构造方法.
    3. 使用起来和普通的FileReader基本没有区别.

       构造方法:      public BurreredReader(FileReader fr); 参数就是一个普通的FileReader对象.

         

    readLine方法

           BufferedReader额外提供了一个方法,可以读取一整行字符串.

           Public String readLine();读取一整行字符串,返回值当中不包含换行符.

       

    while循环节省代码量

         

    练习

    将集合的字符串写到文件中

           题目:

        定义一个集合用于存储多个字符串,向其中添加一些字符串,然后将集合的所有字符串内容写到文件中.要求每个字符串独占一行.

      步骤:

        1.定义一个集合,那就是创建ArrayList

        2.用来存储多个字符串,那么泛型就是<String>

        3.添加字符串到集合当中,就是调用方法:add

        4.既然需要写文件那么就用:FileWriter、BufferedWriter。

        5.谁的性能更高:Buffereduriter

        6.集合当中的每一个字符串都需要逐一处理:for循环遍历集合

        7.在循环当中将字符串写到文件里:调用write方法

        8.要求字符串独占一行,所以调用:newline方法

        9.最后不要忘记关闭流。

              

    将文件中的字符串读到集合中

      题目:

             与上一题相反,将文件中的字符串文本读取到集合当中,并且每一行文本作为集合中的一个字符串元素.

      步骤:

        1.需要读文件,那么可以使用:FileReader、BufferedReader

        2.为了性能更高,最好用谁:BufferedReader(只有BufferedReader才有)

        3.需要有一个集合来存放读取出来的字符串:ArrayList<String>

        4.读取一行:readLine

        5.将读到的字符串添加到集合当中:add

        6.上述4-5步骤是一个循环的过程,读取得到null就要停止。

        7.关闭流。

        8.遍历集合,查看所有字符串元素的内容。

         

    反转藏头情诗

           1 世界上怎么会有你这种人

      2 一点也不知道温柔体贴

      3 生气的时候凶得像条狗

      4 一天到晚就知道瞎BB

      5 你以为你是谁呀

      6 爱咋地咋地

      7 我特么就这样

           分析:

                  1.肯定需要读取文件,所以创建一个BufferedReader。

        2.定义一个集合,用来存放所有的句子:ArrayList<String>

        3.添加需要add,读取一行需要readLine

        4.要将结果写到另一个文件当中,另外创建一个BufferedWriter

        5.倒序遍历集合。for循环,但是i不是从0开始,而是从.size()-1开始。

        6.在倒序遍历集合的时候,当前字符串写到文件中:write

        7.不要忘记换行:newLine

        8.关闭流

         

    方法的参数类型解析

           方法的参数可以是什么类型?

    1. 基本类型
    2. 数组
    3. 字符串
    4. 自定义的类

      结论:所有数据类型都可以作为方法的参数类型.

    Test测试类

    public class Test {
        public static void mian(String[] args) {
            method1(100);
            System.out.println("====================");
            
            int[] arr = {10,20,30};
            method2(arr);
            System.out.println("====================");
            
            method3("How do you do?");
            System.out.println("====================");
            
            Student stu = new Student("赵丽颖",20);
            method4(stu);
        }
        
        //使用基本类型作为方法的参数,可以
        public static void method1(int num) {
            num += 20;
            System.out.println(num);    //120
        }
        
        //使用数组作为方法的参数,也可以
        public static void method2(int[] array) {
            System.out.println(array[0]);    //10
            System.out.println(array[1]);    //20
            System.out.println(array[2]);    //30
        }
        
        //使用字符串作为方法的参数,还可以
        public static void method3(String str) {
            String result = str.replace("o","*");
            System.out.println(result);        //H*w d* y*u d*?
        }
        
        //使用自定义的类作为方法的参数,照样可以
        public static void method4(Student stu) {
            //姓名:赵丽颖,年龄:20
            System.out.println("姓名: " +stu.getName()+ ",年龄:" +stu.getAge());
        }
    }

    Student

    public class Student {
    
        private int age;
    
        private String name;
    
       
    
        //无参构造
    
        public Student() {
    
        }
    
        //有参构造
    
        public Student(String name, int age) {
    
            this.name = name;
    
            this.age = age;
    
        }
    
        public int getAge() {
    
            return age;
    
        }
    
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
        public String getName() {
    
            return name;
    
        }
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
    }

    方法的返回值类型解析

           方法的返回值可以是什么类型?

    1. 基本类型
    2. 数组
    3. 字符串
    4. 自定义的类

      结论:所有数据类型都可以作为方法的返回值类型.

    测试类:

    public class Test {
    
        public static void main(String[] args) {
    
            int result = method1();
    
            System.out.println(result);       //100
    
            System.out.println("=======================");
    
           
    
            int[] result2 = method2();
    
            System.out.println(result2[0]);       //10
    
            System.out.println(result2[1]);       //20
    
            System.out.println("=======================");
    
           
    
            String result3 = method3();
    
            System.out.println(result3.replace("0", "*"));    //H*w d* y*u d*?
    
            System.out.println("=======================");
    
           
    
            Student result4 = method4();
    
            System.out.println("姓名:" +result4.getName() + ",年龄:" + result4.getAge());
    
        }
    
       
    
        //使用基本类型作为方法的返回值,可以
    
        public static int method1() {
    
            int num = 100;
    
            return num;
    
        }
    
       
    
        //使用数组类型作为方法的返回值,也可以
    
        public static int[] method2() {
    
            int[] array = {10,20};
    
            return array;
    
        }
    
       
    
        //使用字符串作为方法的返回值,可以
    
        public static String method3() {
    
            String str ="How do you do?";
    
            return str;
    
        }
    
       
    
        //使用自定义的类作为方法的返回值,仍然可以
    
        public static Student method4() {
    
            Student stu = new Student("赵丽颖",20);
    
            return stu;
    
        }
    
    }

    Student

    public class Student {
    
        private int age;
    
        private String name;
    
       
    
        //无参构造
    
        public Student() {
    
        }
    
        //有参构造
    
        public Student(String name, int age) {
    
            this.name = name;
    
            this.age = age;
    
        }
    
        public int getAge() {
    
            return age;
    
        }
    
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
        public String getName() {
    
            return name;
    
        }
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
    }

    知识总结

        

         

         

         

  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/loveyoul9/p/11483244.html
Copyright © 2011-2022 走看看