19、FileWriter打开清空文件,RandomAccessFile的write方法

来源:互联网 发布:网络社会的崛起 编辑:程序博客网 时间:2024/05/17 02:16

学IO中,写了一个往txt的目标字符串后面插入一个字符串的小练习如下:

import java.io.*;public class InsertContent {public static void main(String[] args) {//在目标字符串之后插入String target = "DSAAC28";File file = new File("text.txt");//定位目标字符串的起始位置int postotal = 0;//定位目标字符串在当前StringBuffer中的位置int postemp = -1;try(try(FileReader fR = new FileReader(file)<span style="white-space:pre"></span>    //;FileWriter fW = new FileWriter(file)))//***********************************************************{char[] buff = new char[32];StringBuffer strbuff = new StringBuffer();int hasRead = 0;do {strbuff.delete(0, strbuff.length());if((hasRead = fR.read(buff)) > 0)strbuff.append(buff, 0, hasRead);postotal += hasRead;} while ((postemp = strbuff.indexOf(target)) < 0 && hasRead != -1);postotal = postotal - hasRead + postemp;}catch (Exception e) {// TODO: handle exceptione.printStackTrace();}if(postemp < 0){System.out.println("未找到目标字符串");return;}try(FileReader fR = new FileReader(file);RandomAccessFile raf = new RandomAccessFile(file, "rw")){fR.skip(postotal + target.length());StringBuffer strbuff = new StringBuffer();char[] buff = new char[32];int hasRead = 0;while((hasRead = fR.read(buff)) > 0){strbuff.append(buff, 0, hasRead);}raf.seek(postotal + target.length());String str = "\nfuck\n" + strbuff;raf.write(str.getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
在练习过程中,发现了一些值得注意的地方,

第一、

在长串星号的地方,本来打开了一个FileReader和一个FileWriter,但是这样每次都不能找到目标字符串。打开text.txt一看,空的。于是发现,如果用

FileWriter fW = new FileWriter(file)
构造FileWriter的时候默认是从文件开头开始写入,于是会清空文件的所有内容。查看文档发现,如果使用

public FileWriter(File file,                  boolean append)           throws IOException

这个构造器,append参数为true,即是从末尾写入,则不会清空已有内容。


第二、

RandomAccessFile的默认write方法是按字节写的,只能接收byte数组为参数,只有writeChars()、和writeUTF()方法可以以String为参数,前者写出来的东西英文字符变成了全角,汉字成了乱码。用write(str.getBytes())先转换成byte再写入才能正常。还有一个方法:raf.writeBytes(str)它会把一个byte能表示正常写入,比如英文,而汉字则会出错。

0 0
原创粉丝点击