zoukankan      html  css  js  c++  java
  • io系列之字符流

    java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看。

    本篇为此系列随笔的第一篇:io系列之字符流。

    IO流 :对数据的传输流向进行操作,java中将这种操作行为本身封装为对象,以供使用。

        Input and Output

        java将io流对象都在IO包中。(java.IO.*)

       分类:

           按照数据种类分: 字节流 和 字符流,
           按照数据流向分: 输出流 和 输入流。

           字节流抽象类: InputStream OutputStream
           字符流抽象类: Reader Writer
          (java中所有这四类派生出的子类都是以他们作为后缀的。)



    一、字符流 之 文件操作:

        字符流主要用于对纯文本文件的操作,java中按照不同的操作类型根据以下两个基类定义了不同的字符流类。
        Reader     Writer

      一)、Writer: 字符输出流。

        以一个操作文件的例子进行说明: FileWriter (说明,该类对象必须指向一个文件,)


        构造方法:
            FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
            FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。
            FileWriter(FileDescriptor fd) 构造与某个文件描述符相关联的 FileWriter 对象.


            FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象.
              使用示例及注意事项:
                  如: FileWriter fw = new FileWriter("filme.txt");
                1、会在程序执行路径下创建一个filme.txt文件,该路径不因程序包名的变化而变化,只在传入的执行路径下。
                2、如果该路径下已有同名文件,那么该文件会被覆盖。

            FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
              使用示例及注意事项:
                  如: FileWriter fw = new FileWriter("filme.txt",true);
                1、如果传入的参数为true,会在程序执行路径下打开一个已有的filme.txt文件, 并在文件末尾添加数据。
                2、如果该路径下没有该文件,则新建一个该文件, 并在文件末尾添加数据。
                3、如果传入的参数为false,无论有无文件都会新建该文件(等同于上一方法)。

          注意:1、以传入文件名的方式创建一个FileWriter对象(该对象一被初始化就必须明确被操作的文件)
             2、而且该文件会被新创建到指定目录下(或因参数打开一个已有文件)。
             3、路劲描述: 如: "D:\java\myclass\winter.txt"。

             4、当然我们也可以传入一个File对象创建一个FileWriter对象。




        写入方法:void write(String str) 写入字符串。(其他数据类型可先转为字符串)
             void write(String str, int off, int len) 写入字符串一部分。(开始位与长度)
             void write(char[] cbuf, int off, int len) 写入字符数组的一部分(开始位和长度)(不传入角标默认全部)
             void write(int c) 写入单个字符。

              如: fw.write("winter is coming");//冰火又要出了,嘿嘿。

              注意:该方法只是将数据写入了流对象缓冲中,没有录入到指定文件中。

                 off表示开始其实角标, len为长度。

        刷新方法:
             void flush() 刷新该流的缓冲。(将数据从流缓冲中存入到指定文件中);

              如: fw.flush();
                 (此时数据(“winter is coming”) 被写入到文件中)。

             void close() 关闭此流,但要先刷新它。

              如: fw.close();
                 (流对象在调用了flush后该流依然存在,但是调用了close方法后,该流对象被关闭,不再存在
                  所以为了节约Windows资源,最后一定要 close ,关闭io。)

          注意: 1、几乎所有的IO操作都会抛出 IOException 异常,注意对异常的处理(try、catch或者throws)
              2、在程序调用Io结束后,一定使用 close语句结束流对象。




    二)、Reader :字符输入流。
        以一个操作文件的例子进行说明: FileReader (说明,该类对象必须指向一个文件,)


        构造方法:
            FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader
              使用该构造方法会:
                  如: FileReader fr = new FileReader("filme.txt");
                1、创建一个FileReader对象,该对象会指向 filme.txt 文件。
                2、该文件必须存在,否则抛出 FileNotFoundException 异常。

            FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader

            FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader

        取出方法:
            int read() 读取单个字符, 返回值为该字符的本地电脑码的值,默认int类型, 可使用 (char) 强转为字符形式。
                 从文件的开头, 随着该方法的不断调用,一直读到文件结尾, 之后返回 -1.

                如: int i = fr.read(), char c = (char)i;

            int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
                      将文件中的数据从文件头开始读取,并存入数组,直到文件中数据读完 或者 数组位置存满。
                      只要文件中还有数据可读,便返回读取的字符个数。如果文件中已经没有数据可读,返回-1.
                如: int i = 0; char [] c = new char[1024];
                   while((i = fr.read(c))!=-1)
                  { System.out.print(new String(c,0,i)); }


        结束方法:
            void close() 关闭该流并释放与之关联的所有资源。 此语句为必须执行语句。




    二、字符流 之 缓冲功能

        缓冲区的出现是为了增加流的效率的,所以建立缓冲区之前必须要先有流对象。(底层使用数组实现)
        缓冲区对象只是给传入的流对象加了一个缓冲区,他的所有的读、写功能其实还是在调用原来的流对象的功能(close关闭的是流对象)

      一)、BufferedWrite :

        构造方法:
            BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
                  如:FileWriter fw = new FileWriter("c.txt");
                    BufferedWriter bw = new BufferedWriter(fw);
                为流对象 fw建立了一个缓冲区对象 bw。

            BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
                  如:FileWriter fw = new FileWriter("c.txt");
                    BufferedWriter bw = new BufferedWriter(fw,1024);
                为流对象 fw建立了一个缓冲区对象 bw,缓冲长度为 1024个字符。
        写入方法:
            void write(写入的数据,格式同流对象方法) , void flush()
                与传入的流对象相同, 这些方法底层就是在调用流对象的相应方法。

        关闭方法:void close();
                与传入的流对象相同, 此方法底层就是在调用流对象的close方法,缓冲区调用了过后,流对象不用重复关闭。

        其他方法:
             void newLine() 输出一个跨平台的行分隔符。



    二)、BufferedReader:

        构造方法:
            BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流
                  如:FileReader fr = new FileReader("c.txt");
                    BufferedReader br = new BufferedReader(fr);
                为流对象 fr建立了一个缓冲区对象 br。

            BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流
                  如:FileReader fr = new FileReader("c.txt");
                    BufferedReader br = new BufferedReader(fr,1024);
                为流对象 fr建立了一个缓冲区对象 br,缓冲长度为1024个字符。


        取出方法: 基本方法有流对象的相同(因为在调用流对象方法), 但是多了一个行读取方法。

             int read() 读取单个字符, 返回值为该字符的本地电脑码的值, 可使用(char)强转为字符形式。
                      从文件的开头, 随着该方法的不断调用,一直读到文件结尾, 之后返回 -1.

                如: int i = br.read(), char c = (char)i;

            int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
                      将文件中的数据从文件头开始读取,并存入数组,知道文件中数据读完 或者 数组位置存满。
                      只要文件中还有数据可读,便返回读取的字符个数。如果文件中已经没有数据可读,返回-1.
                如: int i = 0; char [] c = new char[1024];
                   while((i = br.read(c))!=-1)
                  { System.out.print(new String(c,0,i)); }

            String readLine() 读取一个文本行。
                      返回一个字符串, 如果文档已经读完,返回 null 。
                      (本行读入方法 在文本数据获取中最为常用)
            注: 其返回的字符串中没有回车等换行终止符。


        结束方法:
            void close() 关闭该流并释放与之关联的所有资源。 此语句为必须执行语句。
                   底层调用 流对象的 close 方法。

    三)、LineNumberReader

        是 BufferedReader 的直接子类, 跟踪行号的缓冲字符输入流。
        此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。

        基本方法: 基本方法等同于其父类 BufferedReader,

          如: String readLine() 读取文本行。


        特有方法: int getLineNumber() 获得当前行号。

              void setLineNumber(int lineNumber) 设置当前行号。

  • 相关阅读:
    基于webpack的react脚手架
    关于密码的简单加密
    移动端日期控件
    JS中如何巧妙的用事件委托
    JS中关于正则的巧妙操作
    call,apply,bind
    vue常用笔记
    高性能的js第三方库——lodash、 Underscore、async、md5及moment
    Nightwatch——自动化测试(端对端e2e)
    for循环的耗时问题
  • 原文地址:https://www.cnblogs.com/soficircle/p/6713699.html
Copyright © 2011-2022 走看看