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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.io.IOException;

  5. /**
  6. * 7、 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件
  7. * (例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。
  8. *
  9. * @author KEVIN
  10. *
  11. */
  12. public class Test_07 {
  13.         public static void main(String[] args) throws IOException {
  14.                 Input in = new Input("Test_02.java");
  15.                 //System.out.println(in.getFileName());
  16.                 in.reader();
  17.                
  18.         }
  19.        
  20.        
  21. }

  22. class Input {
  23.          String fileName;

  24.         public Input(String fileName) {
  25.                 this.fileName = fileName;
  26.         }
  27. public String getFileName(){
  28.         return this.fileName;
  29. }
  30.         public void reader() throws IOException {
  31.                 BufferedReader br = new BufferedReader(new FileReader(fileName));
  32.                
  33.                 int x = 1 ;
  34.                 String str = null;
  35.                 while((str=br.readLine())!=null){
  36.                         StringBuilder sb = new StringBuilder();
  37.                         sb = sb.append(x).append(":").append(str);
  38.                        
  39.                         String s = sb.toString();
  40.                         System.out.println(s);
  41.                         x++;
  42.                        
  43.                 }
  44.         }
  45. }
复制代码

求大神帮忙看看为什么一直报错找不到文件?可是命名同一个包下就是有文件的啊。全路径就可以。

评分

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

查看全部评分

26 个回复

正序浏览
曲终烟尽 发表于 2015-5-28 11:54
我还是觉得你那里一直重复new 对象不妥。
我刚看了StringBuilder的方法里有替换(replace)效果相同。你可以 ...

嗯,这个确实是。应该可以优化的。谢谢
回复 使用道具 举报
本帖最后由 曲终烟尽 于 2015-5-28 11:58 编辑

我还是觉得你那里一直重复new 对象不妥。
我刚看了StringBuilder的方法里有替换(replace)效果相同。你可以用下面这个方法:
                sb.replace(0, sb.length(), x+":"+str);
来替换。
把new的操作放在while循环前边,只需要new一个对象就足够了。
再new那么多就是制造垃圾啊。你只用一次就不管了,剩下的都是虚拟机在处理的不用的垃圾了。
可以优化就尽量优化啊。        哥们。假如你读取的是一个小说文件,那得有多少万行文本,你得new多少万个sb对象!!!很恐怖的。。。。
回复 使用道具 举报
本帖最后由 曲终烟尽 于 2015-5-28 11:57 编辑

这层楼删不掉么,,,用快速回复,按了个Enter结果没输完。。。
                sb.replace(0, sb.length(), x+":"+str);
回复 使用道具 举报
348532020 发表于 2015-5-28 11:29
首先,谢谢你的认真。
其次,一天最多20分,已经给完了,所以也给不了了。
最后一点,也是比较重要的,我 ...

sb = sb.append(x).append(":").append(str);
这句话改成:
sb=sb.append(x+":"+str);
应该也可以吧???我觉得应该没问题。。这连着3个append虽然没问题,看着怪着急的。
回复 使用道具 举报
348532020 发表于 2015-5-28 11:29
首先,谢谢你的认真。
其次,一天最多20分,已经给完了,所以也给不了了。
最后一点,也是比较重要的,我 ...

StringBuilder还没学到,刚才理解错了,我以为是像数组操作一样在第x位置添加一个字符串,一开始看的是两个append。理解错了。那这一块儿代码是对的。。。
回复 使用道具 举报
曲终烟尽 发表于 2015-5-28 11:12
权限太低,给点分吧。楼上的都是匆匆过客,木的意思。看我多么的虔诚,加个好友吧。 ...

首先,谢谢你的认真。
其次,一天最多20分,已经给完了,所以也给不了了。
最后一点,也是比较重要的,我觉得你应该重新学习一下StringBuider这个类。
另外这个x是指的行号,自然得++ 。 StringBuider.append()方法返回值类型还是StringBuider类型的。所以sb接受没有任何问题。至于每次都要new 一个对象是因为,如果你不是每次新建一个字符串的话,你的字符串是在上一行的基础上加上了下一行的内容。 说起来不好说,把new的那个语句移到循环外面运行一下就知道了。
回复 使用道具 举报
权限太低,给点分吧。楼上的都是匆匆过客,木的意思。看我多么的虔诚,加个好友吧。

点评

分数很好得。有很多教你怎么得黑马币的帖子,然后多做活动,多回复赠黑马币的那些帖子,很快就够了,不用着急。  发表于 2015-5-28 11:37
回复 使用道具 举报
你的代码我看了,发现一个问题,已经回帖,你看看对不对,没权限发消息,
回复 使用道具 举报
本帖最后由 曲终烟尽 于 2015-5-28 11:08 编辑
  1. public void reader() throws IOException {
  2.                 BufferedReader br = new BufferedReader(new FileReader(fileName));
  3.                
  4.                 int x = 1 ;
  5.                 String str = null;
  6.                 while((str=br.readLine())!=null){
  7.                         StringBuilder sb = new StringBuilder();  //这里  new  了一个 StringBuilder对象,sb引用了这个新的对象
  8.                         sb = sb.append(x).append(":").append(str);   //这里sb添加,添加第x个字符串,我很纳闷,你都new 了一个对象了,怎么还能继续累加x再添加进这个新的对象sb里。添加的位置似乎不对。
  9.                         
  10.                         String s = sb.toString();//这里转换成文本,似乎没问题
  11.                         System.out.println(s);//这里输出文本,没问题
  12.                        x++;//这里 x++,语句没问题,逻辑有问题,你为何要++,你++的目的和之前sb.append(x)的位置是对应的吗?,你之前是new了一个新对象,每次循环都new 一遍,new 的新对象里边是空的,而你直接用append(x)往一个空的对象里向一个超过0的位置追加内存,逻辑上来说是错的!
  13.                         
  14.                 }
  15.         }
复制代码


StringBuilder sb = new StringBuilder();  //这里  new  了一个 StringBuilder对象,sb引用了这个新的对象
sb = sb.append(x).append(":").append(str);   //这里sb添加,添加第x个字符串,我很纳闷,你都new 了一个对象了,怎么还能继续累加x再添加进这个新的对象sb里。添加的位置似乎不对。
x++;//这里 x++,语句没问题,逻辑有问题,你为何要++,你++的目的和之前sb.append(x)的位置是对应的吗?,你之前是new了一个新对象,每次循环都new 一遍,new 的新对象里边是空的,而你直接用append(x)往一个空的对象里向一个超过0的位置追加内存,逻辑上来说是错的!
回复 使用道具 举报
forTomorrow 发表于 2015-5-28 10:58
额。我想报大数据班,不想搞安卓!其实数据库框架那些我有自学过,只是感觉太不扎实了,项目也没做,所以 ...

嘿嘿,不好意思,因为我是准备学安卓,所以把你也想成学安卓了。。。
回复 使用道具 举报
348532020 发表于 2015-5-28 10:52
不客气。不过没事多看看论坛,前面置顶的那些帖子,好多都有说明的,因为黑马的消息基本全是通过论坛来发 ...

额。我想报大数据班,不想搞安卓!其实数据库框架那些我有自学过,只是感觉太不扎实了,项目也没做,所以才想来黑马
回复 使用道具 举报
forTomorrow 发表于 2015-5-28 10:30
我现在是一边工作一边过关啊,苦逼的生活!为什么黑马不在首页或者自学视频教程前面说清楚要技术分什么的呢 ...

而且如果你是先付费的话好像不用技术分吧,好像。我也不清楚。这有个帖子,是先付费的。我也不知道你是不是先付费,如果你是准备先付费的话,可以看看。先付费便宜4000.
http://bbs.itheima.com/forum.php?mod=viewthread&tid=62090
回复 使用道具 举报
forTomorrow 发表于 2015-5-28 10:20
谢谢兄弟的奖励,好激动!!!我之前有自学过Java最近才开始报名,无奈过到第三关才发现要技术分,早知道 ...

不客气。不过没事多看看论坛,前面置顶的那些帖子,好多都有说明的,因为黑马的消息基本全是通过论坛来发布的。多看看就知道了。我也是之前在论坛上看了。然后看视频,传日志,论坛技术分都是同步进行的,。不过你也可以继续看巩固基础。或者提前预习安卓的课程,以后学起来也不会太吃力
回复 使用道具 举报
我现在是一边工作一边过关啊,苦逼的生活!为什么黑马不在首页或者自学视频教程前面说清楚要技术分什么的呢,这样就能早点注册发帖啊,不至于自学完了报名的时候才发现要技术分!!!希望能改进
回复 使用道具 举报
348532020 发表于 2015-5-28 00:00
多做活动就好了,不是有好多送黑马币的帖子么,你就多回复,然后有活动就做做简单的活动。然后每天回复五 ...

谢谢兄弟的奖励,好激动!!!我之前有自学过Java最近才开始报名,无奈过到第三关才发现要技术分,早知道我之前学的时候就发帖了,现在又要重新看视频!!!!悲催啊!!!也不知道能不能进6月30号的大数据班,非常感谢馈赠!!!!!!!!:victory:
回复 使用道具 举报
姬光普 发表于 2015-5-27 15:07
这个你可以去网上搜一下答案,挺多的。其实就是你用的相对路径错了,这个文件是要放在工程目录的下面,并不 ...

是在相对路径下的,我做的正好是test7,然后文件是test1,都在一个包下的,我也不知道为什么就是不行。我记得好像有一种复制文件的就是绝对路径来着。具体的忘了。不知道是不是我这种。
回复 使用道具 举报
forTomorrow 发表于 2015-5-27 17:21
你的黑马币和技术分好多啊,我正在过报名的第三关,要技术分10分,郁闷啊,求指教 ...

多做活动就好了,不是有好多送黑马币的帖子么,你就多回复,然后有活动就做做简单的活动。然后每天回复五次帖子五个黑马币,登录一币,签到一币。加上送的黑马币,基本上挺快的。我差不多不到半个月就25分了。我到现在也才一个月多点吧、
回复 使用道具 举报
你的黑马币和技术分好多啊,我正在过报名的第三关,要技术分10分,郁闷啊,求指教

评分

参与人数 1黑马币 +20 收起 理由
348532020 + 20 还有发帖子,发一次帖子两个黑马币。加油。.

查看全部评分

回复 使用道具 举报
也可以这样写  .\\src\\learn_say(package包名)\\Test2.java
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马