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;
    
        }
    
    }

    知识总结

        

         

         

         

  • 相关阅读:
    02-Maven安装配置
    01-Maven功能特点
    安装Jenkins服务
    Python操作Saltstack
    基于Python自动上传包到nexus仓库
    避免代码merge后无法构建发布(GItlabCI + Jenkins)
    SonarQube-Centos环境设置为系统服务
    SonarQube配置LDAP认证集成
    Centos7 搭建Go语言编译环境
    OpenShift-EFK日志管理
  • 原文地址:https://www.cnblogs.com/loveyoul9/p/11483244.html
Copyright © 2011-2022 走看看