Java I/O流之FileWriter和FileReader类

由于汉字在文件中占用两个字节,如果使用字节流,可能会导致乱码现象,此时采用字符流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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值