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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一生一世 中级黑马   /  2012-6-26 14:00  /  3759 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
  * 这个方法实现的功能是在文件的末尾添加回车换行符
  */
private void write(Vector<FileInputStream> v, String[] path) throws Exception{
  FileInputStream fis = null;
  FileOutputStream fos = null;
  
  for(int i=0; i<path.length ;i++){
   fis = new FileInputStream(path[i]);//path是一个存储路径的数组
   fos = new FileOutputStream(path[i]);
   
   int b;//记录最后一个字节的位置
   while(true){
    b = fis.read();
    if(b==-1)
     break;
   }
   
   byte[] buf = new byte[1024];
   int len;
   while((len=fis.read(buf))!=-1){//将换行符写入到指定的位置
    if(!(buf[b-2]==13 && buf[b-1]==10)){
     buf[b] = 13;
     buf[b+1] = 10;
     len += 2;
    }
    fos.write(buf, 0, len);
   }
   v.add(fis);
  }
}
我的问题是这个方法执行以后为什么path数组中指定路径的文件为什么都大小都变为0kb了为什么没有完成指定的功能,到底哪出错了?该怎么修改呢??

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 李天甲 于 2012-6-26 14:34 编辑
  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;

  3. /*
  4. * 我的问题是这个方法执行以后为什么path数组中指定路径的文件为什么都大小都变为0kb了
  5. * 为什么没有完成指定的功能,到底哪出错了?该怎么修改呢??
  6. */

  7. public class test1 {

  8.         private void write(String[] path) throws Exception {
  9.                 FileInputStream fis = null;
  10.                 FileOutputStream fos = null;

  11.                 for (int i = 0; i < path.length; i++) {
  12.                         fis = new FileInputStream(path[i]);// path是一个存储路径的数组
  13.                         fos = new FileOutputStream(path[i]);

  14.                         int b;// 记录最后一个字节的位置
  15.                         while (true) {
  16.                                 b = fis.read(); // 每一次read之后都往下一个方走了,你这里b已经是等于读到最后一个的位置了
  17.                                 if (b == -1)
  18.                                         break;
  19.                         }

  20.                         byte[] buf = new byte[1024]; // 呵呵,虽然这里用不着,但您想过1024个装的开不?
  21.                         int len;// 默认是0呵呵,
  22.                         while ((len = fis.read(buf)) != -1) {// 将换行符写入到指定的位置 但是这里面read恒等于-1了
  23.                                 // 一次读取1024个字节进去
  24.                                 if (!(buf[b - 2] == 13 && buf[b - 1] == 10)) { // 这块压根不会执行的
  25.                                         buf[b] = 13;
  26.                                         buf[b + 1] = 10;
  27.                                         len += 2;
  28.                                 }
  29.                                 fos.write(buf, 0, len); // 写的什么,您看读buf的时候已经到末尾了呵呵,然后len=-1.....
  30.                         }
  31.                 }
  32.         }
  33. }
复制代码
b = fis.read(); // 每一次read之后都往下一个方走了,你这里b已经是等于读到最后一个的位置了
while ((len = fis.read(buf)) != -1) {// 将换行符写入到指定的位置 但是这里面read恒等于-1了因为已经read到了最后一个位置,读不到东西啊,

修改方法

你这样获取文件长度不是很理想,我一般通过file.length(),直接获取到文件的长度,然后直接生成一个file.length()+1的数组,先读取,再写入,当然也有问题,就是文件不能太大呵呵....

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
少了fos.flush()把数据刷新 还有功能一般不要私有化
或者或者fos.close();fis.close()
回复 使用道具 举报
功能怎么能私有化,功能是给别人用,第一句话错了,下次问的时候把你调用的都打出来,这样看的费劲
回复 使用道具 举报
本帖最后由 周兴中 于 2012-6-26 16:46 编辑

  1. <P>import java.io.FileInputStream;
  2. import java.io.FileOutputStream;</P>
  3. <P>/*
  4. * 我的问题是这个方法执行以后为什么path数组中指定路径的文件为什么都大小都变为0kb了
  5. * 为什么没有完成指定的功能,到底哪出错了?该怎么修改呢??
  6. */</P>
  7. <P>public class test1 {</P>
  8. <P>        private void write(String[] path) throws Exception {
  9.                 FileInputStream fis = null;
  10.                 FileOutputStream fos = null;</P>
  11. <P>                for (int i = 0; i < path.length; i++) {
  12.                         fis = new FileInputStream(path);
  13.                         fos = new FileOutputStream(path);</P>
  14. <P>                        int b;
  15.                         while (true) {
  16.                                 b = fis.read(); //fis.read()返回的是下一个数据字节,不是返回位置.你用这个方法无法记录最后一个字符出现的位置,仅仅得到一个-1;
  17.                             if (b == -1)
  18.                                         break;
  19.                         }</P>
  20. <P>                        byte[] buf = new byte[1024];
  21.                         int len;
  22.                         while ((len = fis.read(buf)) != -1) {
  23.                                 
  24.                                 if (!(buf[b - 2] == 13 && buf[b - 1] == 10)) {
  25.                                         buf [b]= 13;  //此处应该会有角标越界异常,你上面b最后得的值得是-1
  26.                                         buf[b + 1] = 10;
  27.                                         len += 2;
  28.                                 }
  29.                                 fos.write(buf, 0, len); // 就算你前面方法对,你还缺少了flush()方法,刷新缓冲区,这样才能把内存中的读到的数据写如文件.在程序的最后要关闭资
  30.                                                                   //源.fos.close(),fis.close();
  31.                                        
  32.                         }
  33.                 }
  34.         }
  35. }</P>
  36. <P>可以这么改:
  37. byte[] buf = new byte[1024];
  38. int len = 0;
  39. while ((len=fis.read(buf))!=-1)
  40.                         {
  41.                                 
  42.                                 if(len!=1024&&b[len-2]!=13&&b[len-1]!=10)//是否为文件尾,并且最后一个字符是否为换行符.                                 {
  43.                            
  44.                                         buf[len] = 13;
  45.                                         buf[len+1] = 10;
  46.                                         len += 2;
  47.                                 }
  48.                                 fos.write(buf,0,len);
  49.                                 fos.flush();//刷新缓冲区
  50.                         }
  51.                             fos.close();//关闭资源
  52.                             fis.close();</P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
yufeiant 发表于 2012-6-26 14:46
功能怎么能私有化,功能是给别人用,第一句话错了,下次问的时候把你调用的都打出来,这样看的费劲 ...

功能怎么不可以私有化呢?有些功能不方便直接对外部提供访问,就可以私有化呀,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马