Reader是字符输入流的基类,用于从某个源设备读取字符
Writer是字符输出流,用于向某个目标设备写入字符字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。
在程序开发中,经常需要向文件中写入字符,可以使用Writer的一个子类FileReader。需求:在硬盘上,创建一个文件,并写入一些文字数据。
用于操作操作文件的Writer的子类FileWriter,后缀名是父类名。前缀名是该流对象的功能。操作步骤:
1.创建一个FileWriter对象。该对象一被初始化就必须明确要被操作的文件,该文件会被创建到指定目录下,如果该目录下已经有同名文件,将被覆盖FileWriter fw=new FileWriter("demo.txt");
2.调用write方法,将字符串写入到流中。fw.write();
3.刷新流对象中的缓冲中的数据,将数据刷到目的地fw.flush();
4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别,flush刷新后,流可以继续使用,close刷新后将会将流关闭。
fw.close();针对字符进行操作,而不是字节。它的间接父类是字符流Reader。FileWriter是用于写入字符文件的便捷类。
在FileReader类中未自定义方法,而是继承了其父类及间接父类中的方法。public FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新类
FileWriter(File file, boolean append) 通过file对象创建类,append为true或false表示是否在文件追加
FileWriter(FileDescriptor fd) 参数fd为文件描述符,通过文件描述符创建FileWriterFileWriter(String fileName) 参数fileName为文件路径名,通过文件路径创建FileWriter
FileWriter(String fileName, boolean append)该类是抽象类,不能被实例化
方法void mark () 在输入流中标记当前位置
boolean markSupported () 测试输入流是否支持mark()和reset()方法
int read () 从输入流读取下一字符int read (char[] cbuf) 从输入流读取若干字符数据,并存储到字符数组
abstract int read (char[] cbuf, int off, int len) 从输入流读取至多len个字符数据,并存储到字符数组boolean void ready () 判断是否准备读取输入流
void reset () 将输入流重新定位到mark()方法标记的位置long skip (long n) 跳过输入流中n个字符数据
abstract void flush() 刷新输出流,强制将缓冲区内容写入输出流
void write(char[] cbuf) 将指定字符数组的内容写入输出流abstract void write(char[] cbuf,int off,int len) 将指定字符数组从off位置开始的len个字符写入输出流
write(int c) 将指定的字符写入输出流write(String str) 将指定的字符串写入输出流
write(String str,int off,int len) 将指定字符串从off位置开始的len个字符写入输出流字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行包装,BufferedWriter用于对字符输出流进行包装。
缓冲区的出现提高了对数据的读写效率
对应类:BUfferWriter 、BufferedReader
特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。FileWriter fw=new FileWriter("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数bufferedWriter bufw=new BufferedWriter(fw);
buff.write("asdasdas");bufw.newLine();//换行符,跨平台的
3.将缓冲区刷新bufw.flush;
4.关闭缓冲区,就是在关闭缓冲区中的流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数BufferedReader bufr=new BufferedReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾String line=null;
while((line=bufr.readLine())!=null) {String s=line;}
4.关闭
bufr.close();
readLine()方法的原理:无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。
通过缓冲区复制一个文件
BufferWriter bufw=null;public BufferedReader(Reader in, int size) 创建一个使用size指定大小输入缓冲区的输入流
void mark(int readAheadLimit) 标记流中的当前位置
boolean markSupported() 判断此流是否支持mark()操作int read() 读取单个字符
int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
String readLine() 读取一个文本行boolean ready() 判断此流是否已准备好被读取
void reset() 将流重置为最新的标记
long skip(long n) 跳过字符public BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的输出流
public BufferedWriter(Writer out, int size) 创建一个使用size指定大小输出缓冲区的输出流void flush() 刷新该流的缓冲
void newLine() 写入一个行分隔符void write(char[] cbuf, int off,int len) 写入字符数组的某一部分
void write(int c) 写入单个字符void write(String s,int off,int len) 写入字符串的某一部分
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");2.调用读取流的对象的read方法
(1)int ch=fr.read();一次读一个字符,会自动往下读。(2)读出所有字符
while((ch=fr.read())!=-1){
System.out.println((char)ch);}
3.关闭流资源,fr.close();
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
2.定一个字符数组,用于存储读到字符,该rrad(char[])返回的是读到的字符个数。char[] buf=new char[1024];一般定义1024-2个字节。
int num=0;
while((num=fr.read(buf))!=-1){
System.out.println((new String(buf,0,num));}
传递一个true参数,代表不覆盖已有文件,并在已知文件的末尾处进行数据续写。
FileWriter fw=new FileWriter("demo.txt",true);换行转义字符:\r\n
try {
fw=new FileWriter("demo.txt");fw.write("sdfasd");
} catch (IOException e) {e.printStackTrace();
}finally {try {
if(fw!=null)fw.close();
} catch (IOException e) {e.printStackTrace();
}}
LineNumberReader lnr=new LineNumberReader();
获取行号:lnr.getLineNumber();
设置行号从几开始:lnr.setLineNumber(100);1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数LineNumberReader lnfr=new LineNumberReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾String line=null;
while((line=lnfr.readLine())!=null) {
String s=line;String linenum=lnfr.getLineNumber();
}
4.关闭
lnfr.close();
自定义带行号的MyLineNumber
public class MyLineBufferReader extends MyBufferedReader {