黑马程序员技术交流社区

标题: 求大神帮忙分析一下,江湖救急! [打印本页]

作者: 348532020    时间: 2015-5-27 10:37
标题: 求大神帮忙分析一下,江湖救急!
  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. }
复制代码

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

作者: 348532020    时间: 2015-5-27 11:33
有人知道吗??
作者: 348532020    时间: 2015-5-27 12:56
有大神分析一下吗?
作者: 348532020    时间: 2015-5-27 14:30
有没有有人会啊
作者: 姬光普    时间: 2015-5-27 15:07
这个你可以去网上搜一下答案,挺多的。其实就是你用的相对路径错了,这个文件是要放在工程目录的下面,并不是
要放在和编译的.java文件同目录下。你把这个文件放在跟src文件平行下的目录就可以了。

作者: 雪域星辰    时间: 2015-5-27 15:13
能不能在文件前面加一个./   本目录下面的嘛。
作者: forTomorrow    时间: 2015-5-27 17:12
相对路径是相对于所在项目的根目录而言的,你将那个文件复制过去就可以,即\workspace\learn_say(我的项目名称)的下面,与src,bin文件夹是同一级
作者: forTomorrow    时间: 2015-5-27 17:17
也可以这样写  .\\src\\learn_say(package包名)\\Test2.java
作者: forTomorrow    时间: 2015-5-27 17:21
你的黑马币和技术分好多啊,我正在过报名的第三关,要技术分10分,郁闷啊,求指教
作者: 348532020    时间: 2015-5-28 00:00
forTomorrow 发表于 2015-5-27 17:21
你的黑马币和技术分好多啊,我正在过报名的第三关,要技术分10分,郁闷啊,求指教 ...

多做活动就好了,不是有好多送黑马币的帖子么,你就多回复,然后有活动就做做简单的活动。然后每天回复五次帖子五个黑马币,登录一币,签到一币。加上送的黑马币,基本上挺快的。我差不多不到半个月就25分了。我到现在也才一个月多点吧、
作者: 348532020    时间: 2015-5-28 00:03
姬光普 发表于 2015-5-27 15:07
这个你可以去网上搜一下答案,挺多的。其实就是你用的相对路径错了,这个文件是要放在工程目录的下面,并不 ...

是在相对路径下的,我做的正好是test7,然后文件是test1,都在一个包下的,我也不知道为什么就是不行。我记得好像有一种复制文件的就是绝对路径来着。具体的忘了。不知道是不是我这种。
作者: forTomorrow    时间: 2015-5-28 10:20
348532020 发表于 2015-5-28 00:00
多做活动就好了,不是有好多送黑马币的帖子么,你就多回复,然后有活动就做做简单的活动。然后每天回复五 ...

谢谢兄弟的奖励,好激动!!!我之前有自学过Java最近才开始报名,无奈过到第三关才发现要技术分,早知道我之前学的时候就发帖了,现在又要重新看视频!!!!悲催啊!!!也不知道能不能进6月30号的大数据班,非常感谢馈赠!!!!!!!!:victory:
作者: forTomorrow    时间: 2015-5-28 10:30
我现在是一边工作一边过关啊,苦逼的生活!为什么黑马不在首页或者自学视频教程前面说清楚要技术分什么的呢,这样就能早点注册发帖啊,不至于自学完了报名的时候才发现要技术分!!!希望能改进
作者: 348532020    时间: 2015-5-28 10:52
forTomorrow 发表于 2015-5-28 10:20
谢谢兄弟的奖励,好激动!!!我之前有自学过Java最近才开始报名,无奈过到第三关才发现要技术分,早知道 ...

不客气。不过没事多看看论坛,前面置顶的那些帖子,好多都有说明的,因为黑马的消息基本全是通过论坛来发布的。多看看就知道了。我也是之前在论坛上看了。然后看视频,传日志,论坛技术分都是同步进行的,。不过你也可以继续看巩固基础。或者提前预习安卓的课程,以后学起来也不会太吃力
作者: 348532020    时间: 2015-5-28 10:58
forTomorrow 发表于 2015-5-28 10:30
我现在是一边工作一边过关啊,苦逼的生活!为什么黑马不在首页或者自学视频教程前面说清楚要技术分什么的呢 ...

而且如果你是先付费的话好像不用技术分吧,好像。我也不清楚。这有个帖子,是先付费的。我也不知道你是不是先付费,如果你是准备先付费的话,可以看看。先付费便宜4000.
http://bbs.itheima.com/forum.php?mod=viewthread&tid=62090
作者: forTomorrow    时间: 2015-5-28 10:58
348532020 发表于 2015-5-28 10:52
不客气。不过没事多看看论坛,前面置顶的那些帖子,好多都有说明的,因为黑马的消息基本全是通过论坛来发 ...

额。我想报大数据班,不想搞安卓!其实数据库框架那些我有自学过,只是感觉太不扎实了,项目也没做,所以才想来黑马
作者: 348532020    时间: 2015-5-28 10:59
forTomorrow 发表于 2015-5-28 10:58
额。我想报大数据班,不想搞安卓!其实数据库框架那些我有自学过,只是感觉太不扎实了,项目也没做,所以 ...

嘿嘿,不好意思,因为我是准备学安卓,所以把你也想成学安卓了。。。
作者: 曲终烟尽    时间: 2015-5-28 11:06
本帖最后由 曲终烟尽 于 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的位置追加内存,逻辑上来说是错的!

作者: 曲终烟尽    时间: 2015-5-28 11:09
你的代码我看了,发现一个问题,已经回帖,你看看对不对,没权限发消息,
作者: 曲终烟尽    时间: 2015-5-28 11:12
权限太低,给点分吧。楼上的都是匆匆过客,木的意思。看我多么的虔诚,加个好友吧。
作者: 348532020    时间: 2015-5-28 11:29
曲终烟尽 发表于 2015-5-28 11:12
权限太低,给点分吧。楼上的都是匆匆过客,木的意思。看我多么的虔诚,加个好友吧。 ...

首先,谢谢你的认真。
其次,一天最多20分,已经给完了,所以也给不了了。
最后一点,也是比较重要的,我觉得你应该重新学习一下StringBuider这个类。
另外这个x是指的行号,自然得++ 。 StringBuider.append()方法返回值类型还是StringBuider类型的。所以sb接受没有任何问题。至于每次都要new 一个对象是因为,如果你不是每次新建一个字符串的话,你的字符串是在上一行的基础上加上了下一行的内容。 说起来不好说,把new的那个语句移到循环外面运行一下就知道了。
作者: 曲终烟尽    时间: 2015-5-28 11:33
348532020 发表于 2015-5-28 11:29
首先,谢谢你的认真。
其次,一天最多20分,已经给完了,所以也给不了了。
最后一点,也是比较重要的,我 ...

StringBuilder还没学到,刚才理解错了,我以为是像数组操作一样在第x位置添加一个字符串,一开始看的是两个append。理解错了。那这一块儿代码是对的。。。
作者: 曲终烟尽    时间: 2015-5-28 11:34
348532020 发表于 2015-5-28 11:29
首先,谢谢你的认真。
其次,一天最多20分,已经给完了,所以也给不了了。
最后一点,也是比较重要的,我 ...

sb = sb.append(x).append(":").append(str);
这句话改成:
sb=sb.append(x+":"+str);
应该也可以吧???我觉得应该没问题。。这连着3个append虽然没问题,看着怪着急的。
作者: 曲终烟尽    时间: 2015-5-28 11:51
本帖最后由 曲终烟尽 于 2015-5-28 11:57 编辑

这层楼删不掉么,,,用快速回复,按了个Enter结果没输完。。。
                sb.replace(0, sb.length(), x+":"+str);
作者: 曲终烟尽    时间: 2015-5-28 11:54
本帖最后由 曲终烟尽 于 2015-5-28 11:58 编辑

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

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

嗯,这个确实是。应该可以优化的。谢谢




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