输入文件扫描程序在IDE中工作,而不在其他计算机的jar中

时间:2012-03-28 19:09:52

标签: java string resources java.util.scanner

编辑1:更新了我的方法。我觉得它有帮助......我不能确定,直到我以后可以测试它。

编辑2:恢复到之前的版本,以显示从原始版本到答案的更改。

这是一个更大问题的一部分,我正试图将我的程序分发给其他计算机。我有一个方法,它将文件(特别是一个XML文件,但我认为这是不相关的)读入String。这是一个GUI应用程序,因此用户选择一个文件,并通过此方法读取该文件。我也使用这种方法来读取资源,这就是为catch提供FileNotFoundException的原因。如果它被捕获,那么它会尝试将其作为资源读取。如果这不起作用那么太糟糕了我猜...哈哈。

所以我正在尝试4种不同的方式:

  • 在NetBeans(我的IDE)中工作计算机(开发计算机):工作
  • 从jar工作计算机(由NetBeans编译):工作
  • NetBeans中的个人计算机(我正在使用Dropbox,因此文件很好地同步并且我的所有引用都是正确的):工作
  • jar中的个人计算机(由NetBeans编译):不工作

据我所知,最后一种情况发生的情况是由于某种原因fileScanner.hasNext()在循环的第一个循环中返回false,因此没有任何内容附加到fileString。我只是不知道是什么会导致它这样做!任何帮助,将不胜感激! (注意,没有抛出任何错误,就计算机而言,这一切都“正常”)。

这是我的方法。任何改善它的帮助也会受到赞赏!

  /**
   * This method reads a file into a string. If you have an file in the resources folder for example, you can say
   * "/resources/exampleFile.txt".
   *
   * @param location location of the resource in the resources folder
   * @return String of the file
   */
  public static String fileToString(String location) throws FileNotFoundException {
    Scanner fileScanner;
    try {
      InputStream is = StaticClass.class.getResourceAsStream(location);
      fileScanner = new Scanner(is);
    } catch (NullPointerException e) {
      fileScanner = new Scanner(new File(location));
    }
    StringBuilder fileString = new StringBuilder();
    while (fileScanner.hasNext()) {
      fileString.append(fileScanner.nextLine()).append(newline);
    }
    return fileString.toString();
  }

1 个答案:

答案 0 :(得分:0)

我仍然不确定原因,但我认为这与扫描仪有关。由于某种原因,它不能正常工作,但我只是将其更改为以下代码:

  /**
   * Takes the file and returns it in a string
   *
   * @param location
   * @return
   * @throws IOException
   */
  public static String fileToString(String location) throws IOException {
    FileReader fr = new FileReader(new File(location));
    return readerToString(fr);
  }

  /**
   * Takes the given resource (based on the given class) and returns that as a string.
   *
   * @param location
   * @param c
   * @return
   */
  public static String resourceToString(String location, Class c) throws IOException {
    InputStream is = c.getResourceAsStream(location);
    InputStreamReader r = new InputStreamReader(is);
    return readerToString(r);
  }

  /**
   * Returns all the lines in the scanner's stream as a String
   *
   * @param r 
   * @return
   * @throws IOException  
   */
  public static String readerToString(InputStreamReader r) throws IOException {
    StringWriter sw = new StringWriter();
    char[] buf = new char[1024];
    int len;
    while ((len = r.read(buf)) > 0) {
      sw.write(buf, 0, len);
    }
    r.close();
    sw.close();
    return sw.toString();
  }

最大的变化是使用FileReaders和StringWriters而不是Scanners。我还分离了我的resourceToString和fileToString方法。无论如何,我认为这更好。所以,无论如何,你去!我希望这有助于将来的某个人!