JavaSE基础九----<IO流 >字符流,字符缓冲流
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE基础九----<IO流 >字符流,字符缓冲流相关的知识,希望对你有一定的参考价值。
1.字符流
字符流:以字符为单位,所有以Reader和Writer结尾的类.(主要处理字符或字符串,只能读取纯文本文件,字符流处理单元为1个字符。字节流将读取到的字节数据,去指定的编码表中获取对应文字)
Reader:用于读取字符流的抽象类。
Writer:用于写入字符流的抽象类。
- InputStreamReader:是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
- OutputStreamWriter:是字符流到以字节流的桥梁:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
常用类:
字符输入流 FileReader;继承了InputStreamReader.
字符输出流 FileWriter;继承了OutputStreamWriter.
构造方法
字符输入流 FileReader
构造方法 | 注释 |
---|---|
FileReader(File file) | 创建一个新的 FileReader ,指定 File读取 |
FileReader(FileDescriptor fd) | 创建一个新的 FileReader ,给定 FileDescriptor读取 |
FileReader(String fileName) | 创建一个新的 FileReader ,给定要读取的文件的名称 |
指定要输入的文件;当文件不存在,会抛异常
字符输出流 FileWriter
构造方法 | 注释 |
---|---|
FileWriter(File file) | 给一个File对象构造一个FileWriter对象 |
FileWriter(String fileName) | 构造一个给定文件名的FileWriter对象 |
FileWriter(File file, boolean append) | 给一个File对象构造一个FileWriter对象注意:这里有个布尔值参数;append;可设置是否追加,选择追加时,每次执行后就不会删除原来的操作(即不会直接覆盖掉原来的内容) |
FileWriter(FileDescriptor fd) | 构造与文件描述符关联的FileWriter对象 |
FileWriter(String fileName, boolean append) | 构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据 |
指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件
注意:字符流只能传输纯文本文件
简单读写
- public int read( )
读取一个字符并以整数的形式返回,如果返回-1已到输入流的末尾。
读取一个文本文件:
import java.io.FileReader;
import java.io.IOException;
public class Demo01 {
//这里仅声明异常,在实际中需要捕获异常;
public static void main(String[] args) throws IOException {
//指定要输入的文件;当文件不存在,会抛异常
FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
//public int read()方法进行读取
//读取一个字符并以整数的形式返回,如果返回-1已到输入流的末尾。
int r=0;
while((r= fr.read())!=-1){
//这里使用强制类型转换转为字符输出;
System.out.println((char)r);
}
}
}
效果:
输出流写入:
- public void write(int c)
向输出流中写入一个字符数据,该字节数据为参数b的16位.
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo02 {
//这里仅声明异常,在实际中需要捕获异常;
public static void main(String[] args) throws IOException {
//指定要输入的文件;当文件不存在,会抛异常
FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
//指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件,
FileWriter fw=new FileWriter("F:/JAVAIO流练习使用的文件夹/目标文本文件.txt");
//public int read()方法进行读取
//读取一个字符并以整数的形式返回,如果返回-1已到输入流的末尾。
//public void write(int c)方法进行写入;
//向输出流中写入一个字符数据,该字节数据为参数b的16位
int r=0;
while((r= fr.read())!=-1){
fw.write(r);
}
//关闭流;释放系统资源;
fr.close();
fw.close();
}
}
高效读写
类似字节流的高效读写,在读写时,把数据存到数组中,一块一块地传输.
读取方法
-
public int read(char[ ] cbuf)
读取[一个数组长度的]字符内容并存储到一个数组中,返回实际读取的字符数,如果读取前已到输入流的末尾就返回-1. -
public void write(char[] cbuf,int off,int len)
将字符类型的数组中的从指定位置(offset)开始的,length个字符写入到输出流.
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo03 {
//这里仅声明异常,在实际中需要捕获异常;
public static void main(String[] args) throws IOException {
//指定要输入的文件;当文件不存在,会抛异常
FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
//指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件,
FileWriter fw=new FileWriter("F:/JAVAIO流练习使用的文件夹/目标文本文件.txt");
char[] c=new char[10];
int length=0;
while((length= fr.read(c))!=-1){
fw.write(c,0,length);
}
//关闭流;释放系统资源;
fr.close();
fw.close();
}
}
2.字符缓冲流
封装字符流对象的即为字符缓冲流.
常用类:
缓冲字符输入流 BufferedReader.
缓冲字符输出流 BufferedWriter.
构造方法
缓冲字符输入流 BufferedReader
构造方法 | 注释 |
---|---|
BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入流。 |
BufferedReader(Reader in, int sz) | 创建使用指定大小的输入缓冲区的缓冲字符输入流。 |
缓冲字符输出流 BufferedWriter
构造方法 | 注释 |
---|---|
BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流。 |
BufferedWriter(Writer out, int sz) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。 |
类似于字节流的缓冲区;在字符缓冲区的底层,也是默认的具有一个8192个字节长度的数组空间;也可以用构造方法指定这个缓冲区的大小.
缓冲输入流的方法
返回值 | 方法 |
---|---|
void | close( ) ;关闭流并释放与之相关联的任何系统资源 |
Stream | lines( );返回一个 Stream ,其元素是从这个 BufferedReader读取的行 |
void | mark(int readAheadLimit) 标记流中的当前位置 |
boolean | markSupported( ) ;判断这个流是否支持mark( )操作; |
int | read( ) ;读一个字符 |
int | read(char[ ] cbuf, int off, int len) ;将字符读入数组的一部分。 |
String | readLine( ) 读一行文字;当读取到末尾时,会输出null. |
boolean | ready( ) |
void | reset() 将流重置为最近的标记 |
long | skip(long n) 跳过字符 |
除了类似于字节流的一个一个读/写存到缓冲区,以及一个数组一个数组读/写存到缓冲区,还可以一行一行地存储到缓冲区(返回值是字符串类型);然后通过输出方法中的写入一串字符串的方法写到缓冲区.
缓冲输出流的方法
返回值 | 方法 |
---|---|
void | close( ) , 关闭流,先刷新 |
void | flush( ),刷新流 |
void | newLine( ) ;写一行行分隔符;可达到换行写入的操作 |
void | write(char[ ] cbuf, int off, int len) 写入字符数组的一部分 |
void | write(int c) 写一个字符 |
void | write(String s, int off, int len) 写一个字符串的一部分 |
一行一行地读写文本文件:
import java.io.*;
public class Demo01 {
//这里仅声明异常,在实际中需要捕获异常;
public static void main(String[] args) throws IOException {
//指定要输入的文件;当文件不存在,会抛异常
FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
//创建缓冲输入流对象;
BufferedReader br=new BufferedReader(fr);
//指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件,
FileWriter fw=new FileWriter("F:/JAVAIO流练习使用的文件夹/目标文本文件.txt");
//创建缓冲输出流对象;
BufferedWriter bw=new BufferedWriter(fw);
String line =null;
//设置循环,到文本末尾时停止;
//public String readLine( );一行一行地读取字符;然后存到输入缓冲区;
while((line=br.readLine())!=null){
//public void write(String str);
bw.write(line);//每次写入一串字符串;
//public void newLine();进行换行操作;
bw.newLine();
}
//刷新输出缓冲流;
bw.flush();
//关闭流;释放系统资源;
br.close();
bw.close();
}
}
没有进行换行操作时;
目标文件:
进行了换行操作:
目标文件:
以上是关于JavaSE基础九----<IO流 >字符流,字符缓冲流的主要内容,如果未能解决你的问题,请参考以下文章
JavaSE基础九---<IO流 >print打印流,对象输入输出流,对象序列化,transient关键字