zoukankan      html  css  js  c++  java
  • Java 字符流与基本IO

    字符流基类

    java.io包中专门用于字符流处理的类,是以 ReaderWriter 为基础派生的一系列类。字符流以字符为单位,根据码表映射字符,一次可能读多个字节,只能处理字符类型的数据。Reader 是所有的输入字符流的父类,它是一个抽象类。Writer 是所有的输出字符流的父类,它也是一个抽象类。二者包含的方法与 InputStream 和 OutputStream 类似,具体可以查看:JDK 1.6 在线中文手册

    InputStreamReader 和 OutputStreamWriter 是 java.io 包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介:从字节输入流读入字节,并按编码规范转换为字符;往字节输出流写字符时先将字符按编码规范转换为字节。使用这两者进行字符处理时,在构造方法中应指定一定的平台规范,以便把以字节方式表示的流转换为特定平台上的字符表示。

    Java I/O流

    缓存流

    同样的,为了提高字符流处理的效率,java.io 中也提供了缓冲流 BufferedReader 和 BufferedWrite。其构造方法与 BufferedInputStream 和 BufferedOutPutStream 相类似。另外,除了 read() 和 write() 方法外,缓存流还提供了整行字符处理方法:

    1. public String readLine():BufferedReader 的方法,从输入流中读取一行字符,行结束标志 、 或者两者一起(这是由具体系统而定的)
    2. public void newLine():BufferedWriter 的方法,向输出流中写入一个行结束标志,它不是简单地换行符 或 ,而是系统定义的行隔离标志(line separator)。

    文件流

    与 FileInputStream 、FileOutputStream 字节流相对应的是 FileReader、FileWriter 字符流,其分别是 Reader 和 Writer 的子类,构造方法分别如下:

    FileReader(String filename);
    FileWriter(String filename);
    

    字节流不能直接操作 Unicode 字符,所以 Java 提供了字符流。由于汉字在文件中占用两个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,因为,在 Unicode 字符中,一个汉字被看作一个字符。

    FileReader 流顺序的读取文件,只要不关闭流,每次调用 read 方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。有的时候需要整行读取,比如一个学生名单文件,每个姓名占一行,想要读取名字的话就必须读取一行,但是 FileReader 类没有提供这种方法,可以使用上面的缓存流中介绍的两个方法。类似地,可以将 BuffeerWriter 流和 FileWriter 流连接在一起,然后使用 BufferWriter 流将数据写到目的地。

    基本IO

    • 读取输入

    Java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。读取“标准输入流”System.in(即通过控制台进行输入),首先需要构造一个 Scanner 对象,并与“标准输入流”System.in关联。

    Scanner in = new Scanner(System.in);
    

    然后就可以使用Scanner类的各种方法实现输入操作了,下面是常用的一些方法:

    | 方法 | 描述 |
    |------|------|
    | String nextLine() | 读取输入的下一行内容 |
    | String next() | 读取输入的下一个单词(以空格作为分隔符) |
    | int nextInt() | 读取并转换下一个表示整数的字符序列 |
    | double nextDouble() | 读取并转换下一个表示浮点数的字符序列 |
    | boolean hasNext() | 检测输入中是否还有其他单词 |
    | boolean hasNextInt() | 检测是否还有表示整数的下一个字符序列 |
    | boolean hasNextDouble() | 检测是否还有表示浮点数的下一个字符序列 |
    >**注:**在读取前我们一般需要用相应的 has 方法判断是否还有输入的数据。next方法会自动去掉有效字符之前的空格。Scanner 类定义在java.util包中,在程序的最开始应添加上一行:
    >```java
    >import java.util.*;
    >```
    
    • 格式化输出

    print方法将以对应数据类型所允许的最大非零数字位数打印输出,如:

    double x = 10000.0/3.0;
    System.out.print(x);
    

    会打印:3333.3333333333335。

    Java SE 5.0沿用了C语言库函数中的printf方法,格式说明符的语法图如下:

    参数索引、美元符号及t与日期和时间的格式化输出有关,具体可以查看:Java.util 包 Data类:日期格式化
    用于printf的标志:

    用于printf的转换字符:

    println方法就是输出并终止行。这些方法都由类PrintStream定义,System.out是该类对象的一个引用。PrintStream继承了OutoutStream类,并且实现了方法write(),但实际上没有上面的方法方便,并不经常使用。

    • 文件输入与输出

    //构造一个从给定未见读取数据的Scanner
    Scanner(File f);
    //构造一个给定字符串读取数据的Scanner
    Scanner(String data);  
    //构造一个将数据写入给定文件的PrintWriter
    PrintWriter(File f);
    //构造一个将数据写入文件的PrintWriter。
    PrintWriter(String fileName);
    //用给定文件名,构造一个描述文件的File对象。注意这个文件当前不必存在。
    File(String fileName);
    

    如果用一个不存在的文件构造一个Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常。成功创建了Scanner对象后,就可以使用上面介绍的常用方法来从文件读取,而PrintWriter也可以使用print、printf和println来写入文件。还有需要注意的是,Scanner构造方法直接写字符串的文件名的话,它会直接把这个字符串当做输入,而不是从文件读取。

    参考资料

    • 实验楼:JDK 核心 API
    • Java核心技术 卷Ⅰ基础知识 原书第8版
    • Java2实用教程 (第三版)_ 耿祥义,张跃平
  • 相关阅读:
    UVa 11991 Easy Problem from Rujia Liu?
    UVa 11995 I Can Guess the Data Structure!
    LA 3485 (积分 辛普森自适应法) Bridge
    LA 5009 (三分法求极值) Error Curves
    软帝学院:一万字的Java基础知识总结大全(实用)
    学java可以做些什么
    从零开始学习java一般需要多长时间?
    学习java需要英语很好吗?
    java的8种基本数据类型
    什么是java变量,java变量是什么
  • 原文地址:https://www.cnblogs.com/mingyueanyao/p/7290573.html
Copyright © 2011-2022 走看看