黑马程序员技术交流社区

标题: 为什么报出文件未找到异常? [打印本页]

作者: 曹宇    时间: 2013-6-13 14:04
标题: 为什么报出文件未找到异常?
本帖最后由 曹宇 于 2013-6-13 22:36 编辑

我创建一个文件对象 用的当前路径下的 Test1.java
当前路径下 有这个文件 可是程序一运行就报出未发现文件异常
我在CMD下面编译运行都可以
就是用Eclipse运行就提示异常 这是为什么?


求教
代码如下:
  1. /*
  2. * 需求:7、 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装
  3. * 让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。
  4. *
  5. * */

  6. package com.itheima;

  7. import java.io.BufferedReader;
  8. import java.io.File;
  9. import java.io.FileNotFoundException;
  10. import java.io.FileReader;
  11. import java.io.IOException;

  12. public class Test7 {
  13.         public static void main(String args[])
  14.         {
  15.                 File file = null;
  16.                 file = new File("Test1.java");
  17.                 ReaderPackaging rp = new ReaderPackaging(file);
  18.                 System.out.print(rp.readFile());
  19.                
  20.         }
  21.         

  22. }

  23. class ReaderPackaging
  24. {
  25.         File file;

  26.         //构造函数,传入被操作的文件
  27.         ReaderPackaging(File file)
  28.         {
  29.                 this.file = file;
  30.         }
  31.         
  32.         //定义读取流对象
  33.         BufferedReader readinfo = null;
  34.         
  35.         //定义行号计数器,默认为1开始
  36.         private int linecount=1;
  37.         
  38.         

  39.         public String readFile()
  40.         {
  41.                 try {
  42.                         //为读取流对象关联
  43.                         readinfo = new BufferedReader(new FileReader(file));
  44.                 } catch (FileNotFoundException e) {
  45.                         e.printStackTrace();
  46.                 }
  47.                 //定义一个字符串容器,用以存放添加行号和冒号后的字符串数据
  48.                 StringBuilder tempbuf = new StringBuilder("");
  49.                
  50.                 //临时存储一行字符串
  51.                 String line = null;
  52.                
  53.                 //调用BufferedReader的readLine方法一次读取一行,存入line(临时存储字符串)中
  54.                 //然后在加上行号和冒号后添加进入字符串容器中
  55.                 try {
  56.                         while((line=readinfo.readLine())!=null)
  57.                         {               
  58.                                 tempbuf.append(linecount+":"+line+"\r\n");
  59.                                 linecount++;
  60.                         }
  61.                 } catch (IOException e) {
  62.                         e.printStackTrace();
  63.                 }
  64.                 //返回带行号和冒号的字符串容器的字符串表现形式
  65.                 return tempbuf.toString();
  66.                
  67.         }
  68.         
  69.         

  70. }
复制代码

作者: mvplee    时间: 2013-6-13 14:19
我推测可能的问题:
路径问题,
1、绝对路径
2、相对路径
楼主用的是相对路径,换个文件夹就找不到文件了。
我猜是这样的!

作者: 曹宇    时间: 2013-6-13 14:22
mvplee 发表于 2013-6-13 14:19
我推测可能的问题:
路径问题,
1、绝对路径

嗯,就是相对路径.

我代码的java文件和要操作的Test1.java文件都是在一个文件夹之内的阿,这时为啥呢?

我以前写Eclipse代码的时候 也是这样用的 都没错误

是不是因为我调用了另外一个类的一个方法,那个方法接收的是我传入的file  然后 就在中间某个不知道的地方就蛋疼了?

作者: 曹宇    时间: 2013-6-13 14:27
我把Test1.java文件换了个位置放
放在了我工程文件夹中 就是 和 src  lib 等文件夹一个目录下 然后就蛋疼的 可以了

可是我想不明白阿  我代码文件的目录不是这个目录阿  
Eclipse是不是 默认的相对路径都是指向工程目录的?


为什么我以前使用的就可以呢?
作者: 苑永志    时间: 2013-6-13 15:15
本帖最后由 苑永志 于 2013-6-13 15:21 编辑

在命令行中编译运行是相对于当前目录的,如F:\heima>javac Test.java编译Test.java是相对于路径F:\heima这个路径的,所以你平时测试的时候是在java文件所在目录操作的话就是相对于当前路径,所以无需注明具体路径。

而Eclipse帮助用户进行编译过程,其实也是调用jdk的javac命令进行的,而此时所在路径正是工程所在的文件夹,所以改成file = new File("src/com/itheima/Test1.java");即可

希望能帮助楼主理解。
作者: 曹睿翔    时间: 2013-6-13 16:02
问题已经解决的,请及时更改分类为已解决,方便大家查阅,没有的继续追问
关于提问技巧请看:http://bbs.itheima.com/thread-53229-1-1.html
作者: 曹宇    时间: 2013-6-13 22:36
苑永志 发表于 2013-6-13 15:15
在命令行中编译运行是相对于当前目录的,如F:\heima>javac Test.java编译Test.java是相对于路径F:\heima这 ...

非常感谢,我明白了!!
作者: 苑永志    时间: 2013-6-13 22:51
曹宇 发表于 2013-6-13 22:36
非常感谢,我明白了!!

甭客气,互相交流




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