由于汉字在文件中占用两个字节,如果使用字节流,可能会导致乱码现象,此时采用字符流Reader和Writer类即可避免这种现象
FileWriter类
FileWriter常见基本函数介绍
FileWriter(String fileName)
public FileWriter(String fileName) throws IOException {
super(new FileOutputStream(fileName));
}
构造一个给定文件名的FileWriter对象。
参数
fileName - String系统相关的文件名。
异常
IOException - 如果命名文件存在但是是一个目录而不是常规文件,则不存在但不能创建,或由于任何其他原因无法打开
注释
创建对象,该对象一被初始化,就必须要明确被操作的文件。如果该程序文件目录下已有同名文件,则该文件会被覆盖。
FileWriter(String fileName,boolean append)
public FileWriter(String fileName, boolean append) throws IOException {
super(new FileOutputStream(fileName, append));
}
构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。
参数
fileName - String系统相关的文件名。
append - boolean如果是 true ,那么数据将被写入文件的末尾而不是开头。
异常
IOException - 如果命名文件存在,但是是一个目录而不是常规文件,不存在但不能创建,或由于任何其他原因无法打开
注释
对已有的文件续写
write(int c)
public void write(int c) throws IOException {
se.write(c);
}
重写:
write在类别 Writer
参数
c - int指定要写入的字符
异常
IOException - 如果发生I / O错误
flush()
public void flush() throws IOException {
se.flush();
}
刷新流。
Specified by:
flush在界面 Flushable
Specified by:
flush在类别 Writer
异常
IOException - 如果发生I / O错误
close()
public void close() throws IOException {
se.close();
}
描述从类别: Writer复制
关闭流,先刷新。 一旦流已关闭,进一步的write()或flush()调用将导致抛出IOException。 关闭以前关闭的流无效。
Specified by:
close在界面 Closeable
Specified by:
close在界面 AutoCloseable
Specified by:
close在类别 Writer
异常
IOException - 如果发生I / O错误
实用案例代码:
FileWriter fileWriter=new FileWriter("test.txt");
//调用write,将字符串写进流中
//没有直接写进文件,而是写到了内存中,可以理解为其实是写到了"流"里面(流在内存中)
fileWriter.write("abcdefg");
//利用flush刷新流中的数据,将缓冲区临时存放的数据刷新(清空),即将其发送到目的地(文件)
fileWriter.flush();
//关闭流资源,但关闭之前会刷新一次内部的缓冲区的资源
//将数据刷到目的地中
fileWriter.close();
close()和flush()的区别,flush刷新后可继续使用,close刷新后会将流关闭,无法继续使用
注意:
其实,Java本身是不能往硬盘写数据的,因为根据电脑系统不一致(Windows、Linux等),Java是靠调用系统内部方式完成数据书写,Java调用系统中的那些内容来完成数据建立,这些调用都在使用系统的资源。所以用完后就要释放出来,即使用close()。所以使用完流后一定记得释放资源!!!
FileReader类
FileReader常见基本函数介绍
FileReader(String fileName)
public FileReader(String fileName) throws FileNotFoundException {
super(new FileInputStream(fileName));
}
创建一个新的 FileReader ,给定要读取的文件的名称。
参数
fileName - 要读取的文件的名称
异常
FileNotFoundException - 如果命名文件不存在,是一个目录,而不是常规文件,或者由于某些其他原因无法打开读取。
read()
public int read() throws IOException {
return sd.read();
}
读一个字符
重写:
read在类 Reader
结果
字符读取,如果已经达到流的结尾,则为-1
异常
IOException - 如果发生I / O错误
read(char[] cbuf,int offset,int length)
public int read(char cbuf[], int offset, int length) throws IOException {
return sd.read(cbuf, offset, length);
}
Specified by:
read在 Reader
参数
cbuf - 目的缓冲区
offset - 开始存储字符的偏移量
length - 要读取的最大字符数
结果
读取的字符数,如果已经达到流的结尾,则为-1
异常
IOException - 如果发生I / O错误
实用案例代码:
文件的读取方式一
/**
单字符读取:
int read( )一次读一个字符,而且会自动往下读
字符读取,如果已经达到流的结尾,则为-1
*/
// 获取单个字符
int ch =filereader.read();
System.out.println("ch :"+(char)ch);
// 获取多个字符
int ch=0;
while ((ch=fr.read())!=-1){
System.out.println((char)ch);
}
文件的读取方式二
/**
多字符读取:
通过字符数组进行读取,读取字符数,如果已经达到流的结尾,则为-1
*/
//通常将cbuf的长度定义为1024的整数倍
int num =0;
char[] buf=new char[1024];
while ((num = fr.read(buf))!=-1) {
System.out.println(new String(buf,0,num));
}
注意:
如果数组长度小于文件内数据数,read方法返回的是数组长度,即读了的数目 但如果使用 小数组 反复读,当数组总长度大于文件内数据数时,读取数据会回退. (文件内容为:abcdefg) 代码和运行结果如下
int num=fr.read(buf);
System.out.println("num:"+num+new String(buf));
int num1=fr.read(buf);
System.out.println("num1:"+num1+new String(buf));
int num2=fr.read(buf);
System.out.println("num2:"+num2+new String(buf));
异常处理方式
调用资源时,均会发生IO异常。凡是能和设备上数据发生数据关系的、能处理的,都会发生IO异常。无论是读取文件 写入文件 还是 创建文件 操作。
//建立引用,在try内初始化
FileWriter fw= null;
try {
fw = new FileWriter("test.txt");
fw.write("james");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//若初始化时创建对象失败,则导致空指针异常,此时需要判断关闭对象是否为空
if(fw!=null)
//关闭流时也会出现IO异常,所以需要再次捕捉异常
fw.close();
} catch (IOException e) {
e.printStackTrace();
}