黑马程序员技术交流社区

标题: IO流用RandomAccessFile向文本自定义位置插入内容的问题 [打印本页]

作者: 谢冬    时间: 2013-3-11 15:24
标题: IO流用RandomAccessFile向文本自定义位置插入内容的问题
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.RandomAccessFile;
  6. /*
  7. * 功能:实现向文本自定义位置插入内容,不覆盖原有的内容
  8. * */
  9. public class InsertContent {
  10.         public static void main(String[] args) throws IOException {
  11.                 insert("G:\\Code\\FileDemo.java", 120, "这是插入的内容\r\n");
  12.         }

  13.         private static void insert(String fileName, int pos, String content) throws IOException {
  14.                 //static File createTempFile(String prefix, String suffix)  在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
  15.                 File tmp = File.createTempFile("tmp", null);
  16.                 //void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
  17.                 tmp.deleteOnExit();
  18.                 RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
  19.                 //创建一个临时文件来保存插入点后的数据
  20.                 FileOutputStream fos = new FileOutputStream(tmp);
  21.                 FileInputStream fis = new FileInputStream(tmp);
  22.                 //将指针移动到插入位置
  23.                 raf.seek(pos);
  24.                 /*
  25.                  * 将插入点后的内容读入临时文件中保存
  26.                  * */
  27.                 byte[] bys = new byte[1024];
  28.                 int len = 0;
  29.                 while((len = fis.read(bys)) != -1)
  30.                 {
  31.                         //将数据写入临时文件
  32.                         fos.write(bys, 0, len);
  33.                 }
  34.                 /*
  35.                  * 插入内容
  36.                  * */
  37.                 //把文件指针重新定位到pos位置
  38.                 raf.seek(pos);
  39.                 raf.write(content.getBytes());
  40.                 while((len = fis.read(bys)) != -1)
  41.                 {
  42.                         raf.write(bys, 0, len);
  43.                 }
  44.         }
  45. }
复制代码
测试结果:能够向文本插入内容,但还是会替换掉相应的字节数,这个程序哪里有问题?求解答


作者: 曾钦    时间: 2013-3-11 16:08
问题出在这里:
/*
                 * 将插入点后的内容读入临时文件中保存
                 * */
                byte[] bys = new byte[1024];
                int len = 0;
                while((len = fis.read(bys)) != -1) //这一行应该是用raf去读。。改成 raf.read(bys)就可以了。。楼主试试
                {
                        //将数据写入临时文件
                        fos.write(bys, 0, len);
                }
作者: 曾钦    时间: 2013-3-11 16:10
按照你原本写的。。你读了一个临时的空文件,然后写入一个临时的空文件,
最后将目的文件中的一段替换为空字符串,
就有了你这个测试结果:
测试结果:能够向文本插入内容,但还是会替换掉相应的字节数,
作者: 谢冬    时间: 2013-3-11 16:13
曾钦 发表于 2013-3-11 16:08
问题出在这里:
/*
                 * 将插入点后的内容读入临时文件中保存

不对 测试结果还是有问题 一起想想 我也觉得是最后一个循环追加的时候出了问题
作者: 谢冬    时间: 2013-3-11 16:16
谢冬 发表于 2013-3-11 16:13
不对 测试结果还是有问题 一起想想 我也觉得是最后一个循环追加的时候出了问题 ...

那样改 就无法写入临时文件
作者: 曾钦    时间: 2013-3-11 16:46
谢冬 发表于 2013-3-11 16:16
那样改 就无法写入临时文件

fos 有写入临时文件啊,我这样试了下可以哎。。 - -
作者: 曾钦    时间: 2013-3-11 16:49
我写入AAAAAAA的效果。。后面的两个XX没有覆盖掉。。

QQ截图20130311164823.jpg (191.46 KB, 下载次数: 14)

QQ截图20130311164823.jpg

作者: 曾钦    时间: 2013-3-11 16:53
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.RandomAccessFile;
  6. /*
  7. * 功能:实现向文本自定义位置插入内容,不覆盖原有的内容
  8. * */
  9. public class Test {
  10.         public static void main(String[] args) throws IOException {
  11.                 insert("D:\\137.txt", 300, "AAAAAAA");
  12.         }

  13.         private static void insert(String fileName, int pos, String content) throws IOException {
  14.                 //static File createTempFile(String prefix, String suffix)  在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
  15.                 File tmp = File.createTempFile("tmp", null);
  16.                 //void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
  17.                 tmp.deleteOnExit();
  18.                 RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
  19.                 //创建一个临时文件来保存插入点后的数据
  20.                 FileOutputStream fos = new FileOutputStream(tmp);
  21.                 FileInputStream fis = new FileInputStream(tmp);
  22.                 //将指针移动到插入位置
  23.                 raf.seek(pos);
  24.                 /*
  25.                  * 将插入点后的内容读入临时文件中保存
  26.                  * */
  27.                 byte[] bys = new byte[1024];
  28.                 int len = 0;
  29.                 while((len = raf.read(bys)) != -1)
  30.                 {
  31.                         //将数据写入临时文件
  32.                         fos.write(bys, 0, len);
  33.                 }
  34.                 /*
  35.                  * 插入内容
  36.                  * */
  37.                 //把文件指针重新定位到pos位置
  38.                 raf.seek(pos);
  39.                 raf.write(content.getBytes());
  40.                 while((len = fis.read(bys)) != -1)
  41.                 {
  42.                         raf.write(bys, 0, len);
  43.                 }
  44.         }
  45. }
复制代码
代码如上。。

作者: 陈丽莉    时间: 2013-3-12 13:47
如果还有问题,请继续追问,如果没有问题,请将帖子分类改成【已解决】。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2