Проверка файла на определенную строку в Java - PullRequest
1 голос
/ 01 ноября 2009

Я пытаюсь, чтобы мое приложение прочитало текстовый файл и поискало строку. Если строка не существует, она делает это с помощью println. Единственная проблема, с которой я столкнулся, это то, что он не читает текстовый файл. То, что у меня пока есть:

PrintWriter itemwriter = new PrintWriter(new FileOutputStream(items));
FileInputStream fstream = new FileInputStream(items);
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

String strLine;

while ((strLine = br.readLine()) != null)   {
    if (strLine.contains(name)) {
        //do nothing, the item already is in the database.
    } else {
        itemwriter.println(name);
}

Это, похоже, не работает. Есть предложения?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2009

Вы пытаетесь читать и писать в один и тот же файл одновременно. Хотя может быть способ заставить это работать, это будет непросто.

Я предлагаю вам прочитать из файла A и записать в файл B - и если вы хотите эффективно заменить входной файл, то вы можете сделать это с помощью последовательности ходов и удалений в конце.

Несколько других предложений:

  • У вас должны быть блоки try / finally, чтобы закрыть как вход, так и выход в конце.
  • Вам не нужно использовать DataInputStream - вы ничего не используете от него. Просто оберните входной поток напрямую.
  • Я предлагаю вам явно указать кодировку для ввода и вывода, а не доверять кодировке по умолчанию. (Я желаю FileWriter и FileReader принятых кодировок в их конструкторах.)
  • Более надежно использовать OutputStreamWriter (или что-то подобное), а не PrintWriter - в настоящее время вы не обнаружите, если что-то идет не так, когда вы пишете.

Так что-то вроде этого:

// Ideally have this as a constant somewhere.
Charset utf8 = Charset.forName("UTF-8");

BufferedReader reader = new BufferedReader(new InputStreamReader(
    new FileInputStream(inputFile), utf8);
try {
  try {
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(outputFile), utf8);

    String line;
    while ((line = reader.readLine()) != null) {
      if (!line.contains(name)) {
        writer.write(line);
        writer.newLine();
      }
    }
  } finally {
    writer.close();
  }
} finally {
  reader.close();
}
// Now if you want to shift files around, do it here

Жаль, что Java делает это так с блоками try / finally. Ах, за using заявления C # ...

0 голосов
/ 01 ноября 2009

Прежде всего, вы не должны использовать потоки. Используйте FileReaders и FileWriters.

Если вам нужна дополнительная помощь, опубликуйте свою SSCCE , показывая проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...