2011-12-31 96 views
1

我写了一些代码来读取文本文件并返回一个数组,每行存储在一个元素中。我不能为我的生活找出为什么这不起作用......任何人都可以快速浏览一下吗? System.out.println(行)的输出;是空的,所以我猜测读取线路时出现问题,但我看不出为什么。顺便说一句,我传递给它的文件肯定有一些内容!阅读Java中的文本文件

public InOutSys(String filename) { 
    try { 
     file = new File(filename); 
     br = new BufferedReader(new FileReader(file)); 
     bw = new BufferedWriter(new FileWriter(file)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 



public String[] readFile() { 

    ArrayList<String> dataList = new ArrayList<String>(); // use ArrayList because it can expand automatically 
    try { 
     String line; 

     // Read in lines of the document until you read a null line 
     do { 
      line = br.readLine(); 
      System.out.println(line); 
      dataList.add(line); 
     } while (line != null && !line.isEmpty()); 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // Convert the ArrayList into an Array 
    String[] dataArr = new String[dataList.size()]; 
    dataArr = dataList.toArray(dataArr); 

    // Test 
    for (String s : dataArr) 
     System.out.println(s); 

    return dataArr; // Returns an array containing the separate lines of the 
    // file 
} 
+0

你确定你已经有文件了吗?你是否在正确的位置查找文件(相对于用户导演)? – 2011-12-31 13:23:26

+0

file/br/bw在哪里声明? InOutSys和readFile是公开的,但第二个关闭br。如何避免在封闭的br上调用readFile? – 2011-12-31 13:38:35

+0

文件的位置。 – javaDisciple 2011-12-31 13:40:29

回答

2

首先,使用新的FileWriter(文件)打开FileReader后打开一个FileWriter,FileWriter以创建模式打开文件。所以在你运行你的程序后它会是一个空文件。

其次,文件中是否有空行?如果是这样,!line.isEmpty()将终止您的do-while-loop。

1

您对正在读取的文件使用FileWriter,因此FileWriter会清除文件的内容。不要同时读写同一个文件。

另外:

  • 不要以为文件包含一行。你不应该使用do/while循环,而应该使用while循环;
  • 总是关闭steamed,读者和作家在一个最后的块;
  • catch(Exception)是一种不好的做法。只抓住你想要的例外,并且可以处理。否则,让他们走上堆栈。
0

有你的问题的几种可能的原因:

  • 的文件路径不正确
  • 你不应该试图读/同时
  • 写同一个文件它不是这样的好想法在构造函数中初始化缓冲区,想一想 - 有些方法可能会关闭缓冲区,使其无法用于该方法或其他方法的后续调用
  • 循环条件不正确

最好尝试这种方法来阅读:

try { 
    String line = null; 
    BufferedReader br = new BufferedReader(new FileReader(file)); 
    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
     dataList.add(line); 
    } 
} finally { 
    if (br != null) 
     br.close(); 
} 
1

我不知道,如果你正在寻找改善您提供的代码或只为“读文本文件中的Java”的解决方案的一种方式标题说,但如果你正在寻找解决方案,我建议使用Apache Commons io为你做。来自FileUtilsreadLines方法将按照您的要求进行。

如果你想从一个很好的例子中学习,FileUtils是开源的,所以你可以看看他们如何选择实现looking at the source