Сканер входных файлов работает в IDE, а не в jar на других компьютерах. - PullRequest
0 голосов
/ 28 марта 2012

Edit1: Обновлен мой метод. Я думаю, что это помогло ... Я не смогу быть уверенным, пока не смогу проверить это позже.

Edit2: Возврат к предыдущей версии, чтобы показать изменение от оригинала к ответу.

Это часть большей проблемы, с которой я пытаюсь распространить свою программу на другие компьютеры. У меня есть метод, который читает файл (в частности, XML-файл, но я думаю, что это не имеет значения) в String. Это приложение с графическим интерфейсом, поэтому пользователь выбирает файл, и этот файл читается этим методом. Я также использую этот метод для чтения ресурсов, поэтому у меня есть catch для FileNotFoundException. Если он обнаружен, он пытается прочитать его как ресурс. Если это не сработает, то, наверное, слишком плохо ... Ха-ха.

Итак, я пытаюсь это сделать 4 разными способами:

  • Рабочий компьютер (компьютер разработки) в NetBeans (моя IDE): работает
  • Рабочий компьютер из банки (скомпилирован NetBeans): работает
  • Персональный компьютер в NetBeans (я использую Dropbox, поэтому файлы синхронизируются довольно хорошо, и все мои ссылки верны): работает
  • Персональный компьютер из банки (скомпилирован 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 голосов
/ 30 марта 2012

Я до сих пор не уверен, почему, но я думаю, что это было связано со сканером. По какой-то причине он работал не совсем правильно, но я просто изменил его на следующий код:

  /**
   * 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 вместо сканеров. Я также разделил мои методы resourceToString и fileToString. Я думаю, что так или иначе лучше. Так что, в любом случае, вы идете! Я надеюсь, что это поможет кому-то в будущем!

...