A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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. }
复制代码
测试结果:能够向文本插入内容,但还是会替换掉相应的字节数,这个程序哪里有问题?求解答

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

8 个回复

倒序浏览
问题出在这里:
/*
                 * 将插入点后的内容读入临时文件中保存
                 * */
                byte[] bys = new byte[1024];
                int len = 0;
                while((len = fis.read(bys)) != -1) //这一行应该是用raf去读。。改成 raf.read(bys)就可以了。。楼主试试
                {
                        //将数据写入临时文件
                        fos.write(bys, 0, len);
                }
回复 使用道具 举报
按照你原本写的。。你读了一个临时的空文件,然后写入一个临时的空文件,
最后将目的文件中的一段替换为空字符串,
就有了你这个测试结果:
测试结果:能够向文本插入内容,但还是会替换掉相应的字节数,

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
曾钦 发表于 2013-3-11 16:08
问题出在这里:
/*
                 * 将插入点后的内容读入临时文件中保存

不对 测试结果还是有问题 一起想想 我也觉得是最后一个循环追加的时候出了问题
回复 使用道具 举报
谢冬 发表于 2013-3-11 16:13
不对 测试结果还是有问题 一起想想 我也觉得是最后一个循环追加的时候出了问题 ...

那样改 就无法写入临时文件
回复 使用道具 举报
谢冬 发表于 2013-3-11 16:16
那样改 就无法写入临时文件

fos 有写入临时文件啊,我这样试了下可以哎。。 - -
回复 使用道具 举报
曾钦 中级黑马 2013-3-11 16:49:07
7#
我写入AAAAAAA的效果。。后面的两个XX没有覆盖掉。。

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

QQ截图20130311164823.jpg
回复 使用道具 举报
曾钦 中级黑马 2013-3-11 16:53:11
8#
  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. }
复制代码
代码如上。。
回复 使用道具 举报
如果还有问题,请继续追问,如果没有问题,请将帖子分类改成【已解决】。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马