文件中的插入一行字符目前没找到什么好方法,只能将数据读出来,然后在该插入的地方插入string后再写回去
[java]
view plain
copy
1. /**
2. * 在文件里面的指定行插入一行数据
3. *
4. * @param inFile
5. * 文件
6. * @param lineno
7. * 行号
8. * @param lineToBeInserted
9. * 要插入的数据
10. * @throws Exception
11. * IO操作引发的异常
12. */
13. public static void insertStringInFile(File inFile, int lineno,
14. throws Exception {
15. // 临时文件
16. "name", ".tmp");
17.
18. // 输入
19. new FileInputStream(inFile);
20. new BufferedReader(new InputStreamReader(fis));
21.
22. // 输出
23. new FileOutputStream(outFile);
24. new PrintWriter(fos);
25.
26. // 保存一行数据
27. String thisLine;
28. // 行号从1开始
29. int i = 1;
30. while ((thisLine = in.readLine()) != null) {
31. // 如果行号等于目标行,则输出要插入的数据
32. if (i == lineno) {
33. out.println(lineToBeInserted);
34. }
35. // 输出读取到的数据
36. out.println(thisLine);
37. // 行号增加
38. i++;
39. }
40. out.flush();
41. out.close();
42. in.close();
43.
44. // 删除原始文件
45. inFile.delete();
46. // 把临时文件改名为原文件名
47. outFile.renameTo(inFile);
48.
49. }
删除当然也可以像上面那样,但是如果文件比较大,那就是个工程了。
先看看下面的关于RandomAccessFile的seek
seek
public void seek(long pos) throws IOException
参数:
pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。
抛出:
IOException - 如果
pos 小于
0 或者发生 I/O 错误。
说的很是让人迷糊。
下面就一个小例子说明你:
在项目目录下建一个test文件夹,在该文件夹中新建一个aa.txt的文件。在里面写上abcdefghijklmnopqrstuvwsyz
源文件内容如下(Main方法部分):
[java]
view plain
copy
1. String basePath=System.getProperty("user.dir");
2. String fileName="aa.txt";
3. System.out.println(basePath);
4. File file=new File(basePath+"/test", fileName);
5. RandomAccessFile accessor=new RandomAccessFile(file, "rw");
6. System.out.println("文件长度:"+accessor.length());
7. accessor.seek(accessor.length());
8. accessor.writeBytes("[First Add]");
9. accessor.close();
程序执行结果为:
abcdefghijklmnopqrstuvwsyz[First Add]
[java]
view plain
copy
1. abcdefghijklmnopqrstuvwsyz[First Add]
现在修改一下程序:
[java]
view plain
copy
1. String basePath=System.getProperty("user.dir");
2. String fileName="aa.txt";
3. System.out.println(basePath);
4. File file=new File(basePath+"/test", fileName);
5. RandomAccessFile accessor=new RandomAccessFile(file, "rw");
6. System.out.println("文件长度:"+accessor.length());
7. accessor.seek(3);
8. accessor.writeBytes("[Second Add]");
9. accessor.close();
程序运行结果为:
abc[Second Add]pqrstuvwsyz[First Add]
[java] view plain copy
- abc[Second Add]pqrstuvwsyz[First Add]
比较两次结果我们可以得出以下的结论:
seek()方法是移动文件操作的指针的,而其参数就是位移量。
我们第一次将位移量设置为整个文件的长度,则指针指向了文件的末尾,我们向文件写入[First Add],则会出现在文件的结尾。
第二次,我们将位移量设置为3,则文件指针指向了第三个字符c的后面,我们向我文件写入[Second Add],则该文字出现在c的后方,同时覆盖掉了其所占位置的原来的字符。
这样如果是中间的文字,可以用空格符(或者其他无意义的字符)来进行一个替换。一个简单在第一行插入一个标识字符串。
[java]
view plain
copy
1. public static void writeOffset(String name, String str) {
2. new File(name);
3.
4. if (file == null || !file.exists()) {
5. "file donest exist");
6. return;
7. }
8.
9. if (str == null || str.length() <= 0) {
10. return;
11. }
12.
13. RandomAccessFile rf;
14. try {
15. new RandomAccessFile(file, "rw");
16.
17. String line1 = rf.readLine();
18.
19. if(line1 != null && line1.startsWith("PrefixXXXXXXXX")) {
20.
21. //PrefixXXXXXXXX 的长度
22. 13);
23. rf.write(str.getBytes());
24. rf.close();
25. else{
26.
27. rf.close();
28. 1, "XXXXXXX");
29. }
30.
31. catch (FileNotFoundException e) {
32. e.printStackTrace();
33. catch (IOException e) {
34. // TODO Auto-generated catch block
35. e.printStackTrace();
36. catch (Exception e) {
37. // TODO Auto-generated catch block
38. e.printStackTrace();
39. }
40.
41. }
参考,http://yuanpan1987.iteye.com/blog/668204