Java IO之字符流概述-2
字符流
当使用字节流读取文本时,尤其是遇到中文符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储
所以Java提供一些字符流类,以字符为单位读写数据,专门处理文本文件
字符输入流 【Reader】
java.io.Reader 抽象类表示用于读取字符流的所有类的超类,可以读取字符信息到内存中,定义了字符输入流的基本共性方法
文件字符输入流 【FileReader】
把硬盘文件中的数据以字符方式读取到内存中
下图是它的构造器
!!!使用方式!!!
public class Demo01Reader {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("F:\\cccc.txt");
// 存储读取1024个字符
char[] chars = new char[1024];
int len = 0;
// 当读到文件结尾时候 len==-1
while ((len = reader.read(chars)) != -1) {
System.out.println(new String(chars, 0, len));
}
reader.close();
}
}
!!!结果是正确的!!!
字符输出流 【Writer】
java.io.Writer 抽象类表示用于写出字符流的所有类的超类,可以读取字符信息到内存中,定义了字符输入流的基本共性方法
文件字符输出流 【FileWriter】
java.io.FileWriter 类是写出字符到文件的便利类,构造时使用系统默认的字符编码和默认字节缓冲区
下图是它的构造器
字符输出流使用重点:
- 创建FileWriter对象,构造方法中绑定要写入数据的目的地
- 使用FileWriter中的方法writer,把数据写入到内存缓冲中(字符转换为字节的过程)
- 使用FileWriter中的方法flush,把内存缓冲区中数据,刷新到文件中
- 释放资源(在此之前会把内存缓冲区中的数据刷新到文件中)
使用方式
public class Demo02Writer {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("F:\\cccc.txt");
writer.write("囧囧是世界上最漂亮的女孩");
writer.close();
}
}
写出成功,并替换之前文件的内容
关闭和了刷新
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中,但是关闭的流对象,是无法继续写出数据的
如果我们即想写出数据,又项技术使用流,就需要flush方法
- flush:刷新缓冲区,流对象可以继续使用
- close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用
public class Demo02Writer {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("F:\\cccc.txt");
writer.write("囧囧是世界上最漂亮的女孩");
writer.flush();
writer.write("囧囧是世界上最漂亮的女孩-2");
writer.close();
}
}
注意:第一次调用flush() 方法会强制将缓冲区的数据写入到文件中,调用close之后遍不能继续写出数据!!!
续写和换行
类似FileOutputStream一样 有一个布尔类型的构造器
true 代表追加 false 代表不追加
!!!上代码!!!
public class Demo02Writer {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("F:\\cccc.txt", true);
writer.write("囧囧是世界上最漂亮的女孩" + "\r\n");
writer.flush();
writer.write("————囧囧是世界上最豆的女孩!" + "\r\n");
writer.close();
}
}
!!!结果为追加!!!
jdk 9 对比 jdk 7的写法
我们知道jdk7的写法 可以用 try…with…resource ,这里就不掩饰了很简单
接下来我们看一下jdk 9的新写法
!!!上代码 依旧是复制文件的例子!!!
public class Demo05FileInputStream {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("F:\\cccc.txt");
FileOutputStream fos = new FileOutputStream("F:\\dddd.txt");
// jdk 9 的新语法,支持将流放入圆括号中,省略了finally关闭流的操作
try (fis; fos) {
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("复制成功");
}
}
上一篇: Go-15 多维数组的使用
下一篇: 对象流