字符流基类

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

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

缓存流

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

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

文件流

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

  1. FileReader(String filename);
  2. FileWriter(String filename);

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

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

基本IO

  • 读取输入

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

  1. Scanner in = new Scanner(System.in);

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

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

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

  1. double x = 10000.0/3.0;
  2. 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(),但实际上没有上面的方法方便,并不经常使用。

  • 文件输入与输出

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

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

参考资料

  • 实验楼:JDK 核心 API
  • Java核心技术 卷Ⅰ基础知识 原书第8版
  • Java2实用教程 (第三版)_ 耿祥义,张跃平

Java 字符流与基本IO的更多相关文章

  1. Java 字符流实现文件读写操作(FileReader-FileWriter)

    Java 字符流实现文件读写操作(FileReader-FileWriter) 备注:字符流效率高,但是没有字节流底层 字节流地址:http://pengyan5945.iteye.com/blog/ ...

  2. java字符流操作flush()方法及其注意事项

    java字符流操作flush()方法及其注意事项   flush()方法介绍 查阅文档可以发现,IO流中每一个类都实现了Closeable接口,它们进行资源操作之后都需要执行close()方法将流关闭 ...

  3. [Java] 字符流 Writer,输出字符数据PrintWriter

    package test.stream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  4. [Java] 字符流Reader,读取字符数据

    package test.stream; import java.io.BufferedReader; import java.io.FileNotFoundException; import jav ...

  5. Java字符流和字节流对文件操作

    记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...

  6. java字符流实现文件间的内容复制

    package com.io.demo1; import java.io.FileReader; import java.io.FileWriter; public class TestFileSTr ...

  7. java 字符流 字节流

    java对文本文档进行操作(拷贝.显示)出现乱码一般来说,可以从两个方面入手. 1.文本文件本身的编码格式. 2.java代码中处理文本文件的编码格式. 这里要注意的一点是,我们可以看出copyFil ...

  8. Java 字符流读写文件

    据说,java读写文件要写很多,贼麻烦,不像c艹,几行代码就搞定.只能抄抄模板拿来用了. 输入输出流分字节流和字符流.先看看字符流的操作,字节转化为字符也可读写. 一.写入文件 1.FileWrite ...

  9. java字符流与字节流的区别是什么

    java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...

随机推荐

  1. Java reflect 反射 2

    Constructor Constructor表示一个类的构造器.即构造器的反射对象! 它是Class的一个组成部门,所以需要先得到Class,再通过Class的方法得到Constructor 1获取 ...

  2. PTA (Advanced Level) 1066 Root of AVL Tree

    Root of AVL Tree An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of ...

  3. 那些年,我们一起误解过的REST

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由sammyshen 发表于云+社区专栏 最近几年REST API越来越流行,特别是随着微服务的概念被广泛接受和应用,很多Web Ser ...

  4. 转载:BIO | NIO | AIO

    http://my.oschina.net/bluesky0leon/blog/132361 也谈BIO | NIO | AIO (Java版)   转载自:zheng-lee博客 发布时间: 201 ...

  5. JAVA泛型——基本使用

    Java1.5版本推出了泛型,虽然这层语法糖给开发人员带来了代码复用性方面的提升,但是这不过是编译器所做的一层语法糖,在真正生成的字节码中,这类信息却被擦除了.笔者发现很多几年开发经验的程序员,依然不 ...

  6. vs2015 点击cshtml 后提示 "无效指针" 的解决办法

    1. 关闭vs 2. 删除 %LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModelCache 3. 打开vs OK 解决

  7. Ubuntu 16.04安装测试MQTT Mosquitto

    环境:Ubuntu 16.04 介绍MQTT MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信.它通常用于地理跟踪车队,家庭自动化,环境传感器网络和公用事业规模数 ...

  8. 什么是SSH

    SSH不仅实现了视图.控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离,耦合度降低,系统的灵活性更好,可复用性高 官方的说法:SSH是 struts+spring+hibernate的一个 ...

  9. JS日期、月份的加减

    JS日期.月份的加减 需要注意的是返回的月份是从0开始计算的,也就是说返回的月份要比实际月份少一个月,因此要相应的加上1 // 日期,在原有日期基础上,增加days天数,默认增加1天 function ...

  10. 用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REM_addr)

    一.没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP      HTTP_VIA = 没数值或不显示      HTTP_X_FORWARDED_FOR = 没数值或不显示 二.使用 ...