• 第十周作业课程总结


    一、Java字符流的使用:

    字符输入/输出流、字符文件和字符缓冲区的输入/输出流
    
    • java 中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作。

    1、字符输入流:

    • Reader 类是所有字符流输入类的父类,该类定义了许多方法,这些方法对所有子类都是有效的。
    Reader 类的常用子类如下:
    CharArrayReader 类:将字符数组转换为字符输入流,从中读取字符。
    StringReader 类:将字符串转换为字符输入流,从中读取字符。
    BufferedReader 类:为其他字符输入流提供读缓冲区。
    PipedReader 类:连接到一个 PipedWriter。
    InputStreamReader 类:将字节输入流转换为字符输入流,可以指定字符编码。
    
    • InputStream 类相同,在 Reader 类中也包含 close()mark()skip()reset() 等方法.

    • Reader类中的read()方法

    方法名及返回值类型 说明
    int read() 从输入流中读取一个字符,并把它转换为 0~65535 的整数。如果返回 -1, 则表示已经到了输入流的末尾。为了提高 I/O 操作的效率,建议尽量使 用下面两种 read()方法
    int read(char[] cbuf) 从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。 该方法返回读取的字符数,如果返回 -1,则表示已经到了输入流的末尾
    int read(char[] cbuf,int off,int len) 从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。其中,off 指定在字符数组中开始保存数据的起始下标,len 指定读 取的字符数。该方法返回实际读取的字符数,如果返回 -1,则表示已经 到了输入流的末尾

    2、字符输出流

    • 与 Reader类相反,Writer 类是所有字符输出流的父类,该类中有许多方法,这些方法对继承该类的所有子类都是有效的。
    Writer 类的常用子类如下。
    CharArrayWriter 类:向内存缓冲区的字符数组写数据。
    StringWriter 类:向内存缓冲区的字符串(StringBuffer)写数据。
    BufferedWriter 类:为其他字符输出流提供写缓冲区。
    PipedWriter 类:连接到一个 PipedReader。
    OutputStreamReader 类:将字节输出流转换为字符输出流,可以指定字符编码。
    
    • OutputStream类相同,Writer 类也包含 close()flush() 等方法,这些方法可以参考 OutputStream 类的方法。

    • Writer类中的write()方法和append()方法

    方法名及返回值类型 说明
    void write(int c) 向输出流中写入一个字符
    void write(char[] cbuf) 把参数 cbuf 指定的字符数组中的所有字符写到输出流中
    void write(char[] cbuf,int off,int len) 把参数 cbuf 指定的字符数组中的若干字符写到输出流中。其中,off 指定字符数组中的起始下标,len 表示元素个数
    void write(String str) 向输出流中写入一个字符串
    void write(String str, int off,int len) 向输出流中写入一个字符串中的部分字符。其中,off 指定字符串中的起始偏移量,len 表示字符个数
    append(char c) 将参数 c 指定的字符添加到输出流中
    append(charSequence esq) 将参数 esq 指定的字符序列添加到输出流中
    append(charSequence esq,int start,int end) 将参数 esq 指定的字符序列的子序列添加到输出流中。其中,start 指定子序列的第一个字符的索引,end 指定子序列中最后一个字符后面的字符的索引,也就是说子序列的内容包含 start 索引处的字符,但不包括 end索引处的字符
    • 注意:Writer 类所有的方法在出错的情况下都会引发 IOException 异常。关闭一个流后,再对其进行任何操作都会产生错误。

    3、字符文件输入流

    • 为了读取方便,Java 提供了用来读取字符文件的便捷类——FileReader。该类的构造方法有如下两种重载形式。
    FileReader(File file):在给定要读取数据的文件的情况下创建一个新的 FileReader 对象。其中,file 表示要从中读取数据的文件。
    FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader 对象。其中,fileName 表示要从中读取数据的文件的名称,表示的是一个文件的完整路径。
    
    • 在用该类的构造方法创建FileReader读取对象时,默认的字符编码及字节缓冲区大小都是由系统设定的。要自己指定这些值,可以在FilelnputStream上构造一个 InputStreamReader

    • 注意:在创建 FileReader 对象时可能会引发一个 FileNotFoundException 异常,因此需要使用 try catch 语句捕获该异常。

    • 字符流和字节流的操作步骤相同,都是首先创建输入流或输出流对象,即建立连接管道,建立完成后进行读或写操作,最后关闭输入/输出流通道。
      例 1
      要将 E:myjavaHelloJava.java 文件中的内容读取并输出到控制台,使用 FileReader 类的实现代码如下:

    package ch13;
    import java.io.FileReader;
    import java.io.IOException;
    public class Test12
    {
        public static void main(String[] args)
        {
            FileReader fr=null;
            try
            {
                fr=new FileReader("E:/java/HelloJava.java");    //创建FileReader对象
                int i=0;
                System.out.println("E:\java\HelloJava.java文件内容如下:");
                while((i=fr.read())!=-1)
                {    //循环读取
                    System.out.print((char) i);    //将读取的内容强制转换为char类型
                }
            }
            catch(Exception e)
            {
                System.out.print(e);
            }
            finally
            {
                try
                {
                    fr.close();    //关闭对象
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 如上述代码,首先创建了 FileReader 字符输入流对象 fr,该对象指向 E:javaHelloJava.java 文件,然后定义变量 i 来接收调用 read() 方法的返回值,即读取的字符。在while循环中,每次读取一个字符赋给整型变量 i,直到读取到文件末尾时退出循环(当输入流读取到文件末 尾时,会返回值 -1)。

    4、字符文件输出流

    • Java 提供了写入字符文件的便捷类——FileWriter,该类的构造方法有如下 4 种重载形式。
    FileWriter(File file):在指定 File 对象的情况下构造一个 FileWriter 对象。其中,file 表示要写入数据的 File 对象。
    FileWriter(File file,boolean append):在指定 File 对象的情况下构造一个 FileWriter 对象,如果 append 的值为 true,则将字节写入文件末尾,而不是写入文件开始处。
    FileWriter(String fileName):在指定文件名的情况下构造一个 FileWriter 对象。其中,fileName 表示要写入字符的文件名,表示的是完整路径。
    FileWriter(String fileName,boolean append):在指定文件名以及要写入文件的位置的情况下构造 FileWriter 对象。其中,append 是一个 boolean 值,如果为 true,则将数据写入文件末尾,而不是文件开始处。
    
    • 在创建 FileWriter 对象时,默认字符编码和默认字节缓冲区大小都是由系统设定的。要自己指定这些值,可以在 FileOutputStream 上构造一个 OutputStream Writer 对象。

    • FileWriter 类的创建不依赖于文件存在与否,如果关联文件不存在,则会自动生成一个新的文件。在创建文件之前,FileWriter 将在创建对象时打开它作为输出。如果试图打开一个只读文件,将引发一个 IOException 异常。

    • :在创建FileWriter对象时可能会引发 IOException SecurityException 异常,因此需要使用 try catch 语句捕获该异常。
      例 2
      编写一个程序,将用户输入的 4 个字符串保存到 E:myjavaook.txt 文件中。在这里使用FileWriter类中的 write() 方法循环向指定文件中写入数据,实现代码如下:

    package ch13;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Scanner;
    public class Test13
    {
        public static void main(String[] args)
        {
            Scanner input=new Scanner(System.in);
            FileWriter fw=null;
            try
            {
                fw=new FileWriter("E:\java\book.txt");    //创建FileWriter对象
                for(int i=0;i<4;i++)
                {
                    System.out.println("请输入第"+(i+1)+"个字符串:");
                    String name=input.next();    //读取输入的名称
                    fw.write(name+"
    ");    //循环写入文件
                }
                System.out.println("录入完成!");
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
            finally
            {
                try
                {
                    fw.close();    //关闭对象
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 如上述代码,首先创建了一个指向 E:javaook.txt 文件的字符文件输出流对象 fw,然后使用for循环录入 4 个字符串,并调用 write() 方法将字符串写入到指定的文件中。最后在 finally 语句中关闭字符文件输出流。

    • 运行该程序,根据提示输入 4 个字符串,如下所示。接着打开 E:javaook.txt 文件,将看到写入的内容.

    请输入第1个字符串:
    热点要闻
    请输入第2个字符串:
    个性推荐
    请输入第3个字符串:
    热搜新闻词
    请输入第4个字符串:
    本地看点
    录入完成!
    

    5、字符缓冲区输入流

    • BufferedReader 类主要用于辅助其他字符输入流,它带有缓冲区,可以先将一批数据读到内存缓冲区。接下来的读操作就可以直接从缓冲区中获取数据,而不需要每次都从数据源读取数据并进行字符编码转换,这样就可以提高数据的读取效率。
    BufferedReader 类的构造方法有如下两种重载形式。
    BufferedReader(Reader in):创建一个 BufferedReader 来修饰参数 in 指定的字符输入流。
    BufferedReader(Reader in,int size):创建一个 BufferedReader 来修饰参数 in 指定的字符输入流,参数 size 则用于指定缓冲区的大小,单位为字符。
    
    • 除了可以为字符输入流提供缓冲区以外,BufferedReader 还提供了 readLine() 方法,该方法返回包含该行内容的字符串,但该字符串中不包含任何终止符,如果已到达流末尾,则返回 null。readLine() 方法表示每次读取一行文本内容,当遇到换行( )回车( )或回车后直接跟着换行标记符即可认为某行已终止。
      例 3
      使用 BufferedReader 类中的 readLine() 方法逐行读取 E:javaBook.txt 文件中的内容,并将读取的内容在控制台中打印输出,代码如下:
    package ch13;
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    public class Test13
    {
        public static void main(String[] args)
        {
            FileReader fr=null;
            BufferedReader br=null;
            try
            {
                fr=new FileReader("E:\java\book.txt");    //创建 FileReader 对象
                br=new BufferedReader(fr);    //创建 BufferedReader 对象
                System.out.println("E:\java\book.txt 文件中的内容如下:");
                String strLine="";
                while((strLine=br.readLine())!=null)
                {    //循环读取每行数据
                    System.out.println(strLine);
                }
            }
            catch(FileNotFoundException e1)
            {
                e1.printStackTrace();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    fr.close();    //关闭 FileReader 对象
                    br.close();
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 如上述代码,首先分别创建了名称为 fr 的 FileReader 对象和名称为 br 的 BufferedReader 对象,然后调用 BufferedReader 对象的 readLine() 方法逐行读取文件中的内容。如果读取的文件内容为 Null,即表明已经读取到文件尾部,此时退出循环不再进行读取操作。最后将字符文件输入流和带缓冲的字符输入流关闭。

    • 运行该程序,输出结果如下所示:

    E:javaook.txt 文件中的内容如下:
    热点要闻
    个性推荐
    热搜新闻词
    本地看点
    

    6、字符缓冲区输出流

    • BufferedWriter 类主要用于辅助其他字符输出流,它同样带有缓冲区,可以先将一批数据写入缓冲区,当缓冲区满了以后,再将缓冲区的数据一次性写到字符输出流,其目的是为了提高数据的写效率。
    BufferedWriter 类的构造方法有如下两种重载形式。
    BuflferedWriter(Writer out):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流。
    BufferedWriter(Writer out,int size):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流,参数 size 则用于指定缓冲区的大小,单位为字符。
    
    • 该类除了可以给字符输出流提供缓冲区之外,还提供了一个新的方法——newLine(),该方法用于写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行( )符。

    • 提示:BufferedWriter 类的使用与 FileWriter 类相同,这里不再重述。

    二、Java字节流的使用:

    字节输入/输出流、文件输入/输出流、字节数组输入/输出流
    

    1、字节输入流:

    • InputStream 类及其子类的对象表示一个字节输入流。
    InputStream 类的常用子类如下。
    ByteArrayInputStream 类:将字节数组转换为字节输入流,从中读取字节。
    FileInputStream 类:从文件中读取数据。
    PipedInputStream 类:连接到一个 PipedOutputStream(管道输出流)。
    SequenceInputStream 类:将多个字节输入流串联成一个字节输入流。
    ObjectInputStream 类:将对象反序列化。
    
    • 使用 InputStream 类的方法可以从流中读取一个或一批字节。
    方法名及返回值类型 说明
    int read() 从输入流中读取一个 8 位的字节,并把它转换为 0~255 的整数,最后返 回整数。如果返回 -1,则表示已经到了输入流的末尾。为了提高 I/O 操作的效率,建议尽量使用 read() 方法的另外两种形式
    int read(byte[] b) 从输入流中读取若干字节,并把它们保存到参数 b 指定的字节数组中。 该方法返回读取的字节数。如果返回 -1,则表示已经到了输入流的末尾
    int read(byte[] b, int off, int len) 从输入流中读取若干字节,并把它们保存到参数b指定的字节数组中。其中,off 指定在字节数组中开始保存数据的起始下标;len 指定读取的字节数。该方法返回实际读取的字节数。如果返回 -1,则表示已经到了输入流的末尾
    void close() 关闭输入流。在读操作完成后,应该关闭输入流,系统将会释放与这个输入流相关的资源。注意,InputStream 类本身的 close() 方法不执行任何 操作,但是它的许多子类重写了 close() 方法
    int available() 返回可以从输入流中读取的字节数
    long skip(long n) 从输入流中跳过参数n指定数目的字节。该方法返回跳过的字节数
    void mark(int readLimit) 在输入流的当前位置开始设置标记,参数 readLimit 则指定了最多被设置 标记的字节数
    boolean markSupported() 判断当前输入流是否允许设置标记,是则返回 true,否则返回 false
    void reset() 将输入流的指针返回到设置标记的起始处

    2、字节输出流

    • OutputStream 类及其子类的对象表示一个字节输出流。OutputStream 类的常用子类如下。
    ByteArrayOutputStream 类:向内存缓冲区的字节数组中写数据。
    FileOutputStream 类:向文件中写数据。
    PipedOutputStream 类:连接到一个 PipedlntputStream(管道输入流)。
    ObjectOutputStream 类:将对象序列化。
    
    • 利用 OutputStream 类的方法可以从流中写入一个或一批字节。

    3、字节数组输入流

    • ByteArrayInputStream 类可以从内存的字节数组中读取数据,该类有如下两种构造方法重载形式。
    ByteArrayInputStream(byte[] buf):创建一个字节数组输入流,字节数组类型的数据源由参数 buf 指定。
    ByteArrayInputStream(byte[] buf,int offse,int length):创建一个字节数组输入流,其中,参数 buf 指定字节数组类型的数据源,offset 指定在数组中开始读取数据的起始下标位置,length 指定读取的元素个数。
    

    4、字节数组输出流

    • ByteArrayOutputStream 类可以向内存的字节数组中写入数据,该类的构造方法有如下两种重载形式。
    ByteArrayOutputStream():创建一个字节数组输出流,输出流缓冲区的初始容量大小为 32 字节。
    ByteArrayOutputStream(int size):创建一个字节数组输出流,输出流缓冲区的初始容量大小由参数 size 指定。
    
    • ByteArrayOutputStream 类中除了有前面介绍的字节输出流中的常用方法以外,还有如下两个方法。
    intsize():返回缓冲区中的当前字节数。
    byte[] toByteArray():以字节数组的形式返回输出流中的当前内容。
    

    5、文件输入流

    • FileInputStream 是 Java 流中比较常用的一种,它表示从文件系统的某个文件中获取输入字节。通过使用 FileInputStream 可以访问文件中的一个字节、一批字节或整个文件。
      在创建 FileInputStream 类的对象时,如果找不到指定的文件将拋出 FileNotFoundException 异常,该异常必须捕获或声明拋出。

    • FileInputStream 常用的构造方法主要有如下两种重载形式。

    FileInputStream(File file):通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
    FileInputStream(String name):通过打开一个到实际文件的链接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
    
    • 下面的示例演示了 FileInputStream() 两个构造方法的使用。
    try
    {
        //以File对象作为参数创建FileInputStream对象
        FileInputStream fis1=new FiieInputStream(new File("F:/mxl.txt"));
        //以字符串值作为参数创建FilelnputStream对象
        FileInputStream fis2=new FileInputStream("F:/mxl.txt");
    }
    catch(FileNotFoundException e)
    {
        System.out.println("指定的文件找不到!");
    }
    
    • 例 、假设有一个 E:myjavaHelloJava.java 文件,下面使用 FileInputStream 类读取并输出该文件的内容。具体代码如下:
    package ch13;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    public class Test10
    {
        public static void main(String[] args)
        {
            File f=new File("E:/myjava/HelloJava.java");
            FileInputStream fis=null;
            try
            {
                //因为File没有读写的能力,所以需要有个InputStream
                fis=new FileInputStream(f);
                //定义一个字节数组
                byte[] bytes=new byte[1024];
                int n=0;    //得到实际读取到的字节数
                System.out.println("E:\myjava\HelloJava.java文件内容如下:");
                //循环读取
                while((n=fis.read(bytes))!=-1)
                {
                    String s=new String(bytes,0,n);    //将数组中从下标0到n的内容给s
                    System.out.println(s);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    fis.close();
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    

    如上述代码,在 FileInputDemo 类的 main() 方法中首先创建了一个 File 对象 f,该对象指向 E:myjavaHelloJava.java 文件。接着使用 FileInputStream 类的构造方法创建了一个 FileInputStream 对象 fis,并声明一个长度为 1024 的 byte 类型的数组,然后使用 FileInputStream 类中的 read() 方法将 HelloJava.java 文件中的数据读取到字节数组 bytes 中,并输出该数据。最后在 finally 语句中关闭 FileInputStream 输入流。

    • ,如下所示的是运行程序后的输出内容。
    D:myjavaHelloJava.java文件内容如下:
    /*
    *第一个Java程序
    */
    public class HelloJava{
        //这里是程序入口
        public static void main(String[] args){
            //输出字符串
            System.out.println("你好 Java");
        }
    }
    

    三、Java RandomAccessFile类:

    动态读取文件内容
    
    • 所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾。动态读取需要用到 Java 中的 RandomAccessFile 类,该类中有一个文件指针用于标识当前流的读写位置,这个指针可以向前或者向后移动。

    • RandomAccessFile 类的构造方法有如下两种重载形式。

    RandomAccessFile(File file,String mode):访问参数 file 指定的文件,访问形式由参数 mode 指定,mode 参数有两个常用的可选值r和rw,其中r表示只读,rw表示读写。
    RandomAccessFile(String name,String mode):访问参数 name 指定的文件,mode 参数的含义同上。
    
    • RandomAccessFile类中还提供了一系列读取和写入数据的方法,表 1 列举了其中一些 常用方法。
      RandomAccessFile类的常用方法
    方法名及返回值类型 说明
    boolean readBoolean() 从文件中读取一个 boolean 值
    byte readByte() 从文件中读取一个带符号位的字节
    char readChar() 从文件中读取一个字符
    int readlnt() 从文件中读取一个带符号位的整数
    long readLong() 从文件中读取一个带符号位的 long 值
    String readLine() 从文件中读取下一行文本
    void seek(long pos) 指定从文件起始位置开始的指针偏移量
    void writeBoolean(boolean v) 以字节的形式向文件中写入一个 boolean 值
    void writeByte(int v) 以单字节的形式向文件中写入一个 byte 值
    void writeChar(int v) 以双字节的形式向文件中写入一个 char 值
    void writelnt(int v) 以4字节的形式向文件中写入一个整数
    writeLong(long v) 以8字节的形式向文件中写入一个 long 值
    void writeBytes(String s) 以字节序列的形式向文件中写入一个字符串
    void skipBytes(int n) 以当前文件指针位置为起始点,跳过 n 字节

    四、Java流的概念:

    1、输入流

    • Java 流功能相关的类都封装在 java.io 包中,而且每个数据流都是一个对象。所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类。

    2、输出流

    • 在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类。

  • 相关阅读:
    树莓派设置CPU运行的核心数为3,保留核心4号
    node+egg中mongdb的一些知识点
    如何提高前端的技能和快速涨薪?
    【安全认证】我的CISSP达成之路
    前端gitLab ci/cd搭建
    flutter调试
    js rgb hex hsv色值转换
    Error waiting for a debug connection: The log reader stopped unexpectedly
    Flutter滑动列表实现
    前端异常监控
  • 原文地址:https://www.cnblogs.com/youlanghua/p/11779553.html
Copyright © 2020-2023  润新知