2

В настоящее время я пытаюсь сохранить вывод моего кода в текстовый файл, когда я запускаю его в другом проекте, он генерирует выходной файл и сохраняет результат соответственно, однако, когда Я запускаю тот же код в другом проекте, он дает мне пустой выходной файл, и я действительно не знаю, в чем дело. Я смущен относительно того, где положить функцию .close() и функцию флеша. Заранее спасибо!Попытка написать выходной файл с помощью FileWriter

FileWriter output = new FileWriter("set.txt"); 
    BufferedWriter writer = new BufferedWriter(output); 
    InputStream fis_n = new  FileInputStream("/Users/User/NetBeansProjects/Test/src/test/sample.txt"); 
    InputStreamReader isr_n = new InputStreamReader(fis_n, Charset.forName("UTF-8")); 
    BufferedReader br_n = new BufferedReader(isr_n); 

while ((input = br_n.readLine()) != null) { 
     String[] s = input.split(":"); 
     if (s[1].equals(text)) { 
      writer.write(s[0] + "'s result is " + sample_text); 
      writer.newLine(); 
      break; 
     } 
} 
    writer.close(); 
    output.close(); 

Это то, что отредактированный код выглядит, но все-таки выходной файл «set.txt» пуст при запуске программы.

FileWriter output = new FileWriter("set.txt"); 
    BufferedWriter writer = new BufferedWriter(output); 
    InputStream fis_n = new  FileInputStream("/Users/User/NetBeansProjects/Test/src/test/sample.txt"); 
    InputStreamReader isr_n = new InputStreamReader(fis_n, Charset.forName("UTF-8")); 
    BufferedReader br_n = new BufferedReader(isr_n); 

    try { 
     while ((input = br_n.readLine()) != null) { 

      String[] s = input.split(":"); 
     if (s[1].equals(text)) { 
      writer.write(s[0] + "'s result is " + sample_text); 
      writer.newLine(); 
      break; 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      writer.close(); 
      fis_n.close(); 
      isr_n.close(); 
      br_n.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    // fis_n.close(); 
    //isr_n.close(); 
    //br_n.close(); 
} 

Это то, что окончательный код выглядит следующим образом:

 public static void dictionary(String sample_text, String text) throws FileNotFoundException, IOException { 

try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       new  FileInputStream("/Users/User/NetBeansProjects/Test/src/test/sample.txt"), 
       Charset.forName("UTF-8") 
     )); 
      try { 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream("/Users/User/NetBeansProjects/Test/src/test/set.txt"), 
        Charset.forName("UTF-8") 
      )); 
      try { 
       String input; 
       while ((input = reader.readLine()) != null) { 
        String[] s = input.split(":"); 
        if (s[1].equals(text)) { 
         writer.write(s[0] + "'s result is " + sample_text); 
         writer.newLine(); 
         break; 
        } 
       } 
      } finally { 
       writer.close(); 
      } 
     } finally { 
      reader.close(); 
     } 
    } catch (IOException e) { 
     // Error handling 
    } 
    } 

Это основной способ, при котором метод словаря вызывается.

public static void main(String[] args) throws FileNotFoundException, IOException { 

case 2: { 
       BufferedReader d_br = new BufferedReader(new InputStreamReader(
         new FileInputStream("/Users/User/NetBeansProjects/Test/src/test/input_file.txt"), 
         Charset.forName("UTF-8") 
       )); 

       try { 

        String d_line; 
        while ((d_line = d_br.readLine()) != null) { 

        String h_input = test(d_line); 
        dictionary(d_line, h_input); 

        } 
       } catch(IOException e){ 

       }finally { 
        d_br.close(); 
       } 
       break; 
      } 
    } 
+0

Вы уверены, что написано, что вы ожидаете? '" set.txt "- относительный путь. Это относится к _working directory_ вашей программы. Возможно, пустой 'set.txt', который вы видите, является _not_ one, созданным программой, поскольку он в настоящее время вызывается_. Один простой способ проверить - это удалить пустой 'set.txt' и снова запустить программу. Создает ли ваша программа еще один пустой 'set.txt', чтобы заменить его? – Birchlabs

+0

@Birchlabs Да, это так, всякий раз, когда я запускаю программу снова, создается новый файл «set.txt». – Scarl

ответ

3

Вы должны положить writer.close() после цикла while, и предпочтительнее, в разделе finally.

Если нет необходимости хранить частично обработанные файлы (как в большинстве случаев), вы можете удалить flush. В другом случае лучше оставить его там, где он есть.

Общий случай использования ресурсов на Java 7+ выглядит как следует (этот синтаксис называется try-with-resources:

try (
    Resource resource1 = // Resource 1 initialization 
    Resource resource2 = // Resource 2 initialization 
    ... 
) { 
    // Resource utilization 
} catch (XXXException e) { 
    // Something went wrong 
} 

ресурсы освобождается (закрытый) автоматически примеркой с-ресурсами

Если. вам нужно использовать Java 6 или более раннюю версию, приведенный выше код можно было бы приблизительно перевести на следующий (на самом деле есть некоторые тонкие различия, которые не важны на этом уровне деталей).

try { 
    Resource1 resource1 = // Resource initialization 
    try { 
     Resource2 resource2 = // Resource initialization 
     try { 
      // Resource utilization 
     } finally { 
      // Free resource2 
      resource2.close(); 
     } 
    } finally { 
     // Free resource1 
     resource1.close(); 
    } 
} catch (XXXException e) { 
    // Something went wrong 
} 

Обратите внимание, как вложены try-finally блоки, используемые для управления ресурсами.

В вашем конкретном случае, нам нужно управлять двумя ресурсами: Reader и Writer, так что код будет выглядеть следующим образом:

try (
     // Notice, we build BufferedReader for the file in a single expression 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       new FileInputStream("sample.txt"), 
       StandardCharsets.UTF_8 // Better replacement for Charset.forName("UTF-8") 
     )); 
     // Alternative way to do the same 
     // BufferedReader reader = Files.newBufferedReader(Paths.get("sample.txt"), StandardCharsets.UTF_8); 

     // Output charset for writer provided explicitly 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
       new FileOutputStream("set.txt"), 
       StandardCharsets.UTF_8 
     )) 
     // Alternative way to do the same 
     // BufferedWriter writer = Files.newBufferedWriter(Paths.get("set.txt"), StandardCharsets.UTF_8) 
) { 
    String input; 
    while ((input = reader.readLine()) != null) { 
     String[] s = input.split(":"); 
     if (s[1].equals(text)) { 
      writer.write(s[0] + "'s result is " + text); 
      writer.newLine(); 
      break; 
     } 
    } 
} catch (IOException e) { 
    // Error handling 
} 

Или, используя предварительно Java7 синтаксис:

try { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      new FileInputStream("sample.txt"), 
      Charset.forName("UTF-8") 
    )); 
    try { 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
       new FileOutputStream("set.txt"), 
       Charset.forName("UTF-8") 
     )); 
     try { 
      String input; 
      while ((input = reader.readLine()) != null) { 
       String[] s = input.split(":"); 
       if (s[1].equals(text)) { 
        writer.write(s[0] + "'s result is " + text); 
        writer.newLine(); 
        break; 
       } 
      } 
     } finally { 
      writer.close(); 
     } 
    } finally { 
     reader.close(); 
    } 
} catch (IOException e) { 
    // Error handling 
} 
+0

это все равно заставляет выходной файл ничего не содержать. – Scarl

+0

Пожалуйста, опубликуйте измененный код. – kgeorgiy

+0

Я только что изменил код в вопросе. – Scarl

2

Первый из всего, вы вызываете метод flush автора, всякий раз, когда вы хотите, чтобы текущий буфер был написан немедленно. Если вы просто пишете файл полностью без какой-либо промежуточной операции на вашем выходе, вам не нужно его явно указывать, так как вызов close сделает это за вас.

Во-вторых, вы только вызовите close метод верхнего уровня читателя или писателя, в вашем случае BufferedWriter. Вызов close пересылается другим назначенным читателям или писателям. Несколько последовательных вызовов close не влияют на ранее закрытый экземпляр, см. here.

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

// This writer must be declared before 'try' to 
// be visible in the finally block 
AnyWriter writer = null; 

try { 

    // Instantiate writer here, because it can already 
    // throw an IOException 
    writer = new AnyWriter(); 

    // The the writing in a loop or as you wish 
    // If you need to write out the buffer in 
    // between, call flush 

} catch (IOException e) { 

    // Something went wrong while writing 

} finally { 

    try { 
     if (writer != null) 
      writer.close(); 
    } catch (IOException e) { 
     // Exception while trying to close 
    } 

} 

finally блок всегда выполняется. Если вам нужен более компактный синтаксис, и вы используете хотя бы Java 7, вы можете взглянуть на ноту try-withhere.

+0

Я отредактировал код, чтобы отразить br_n и другие отсутствующие переменные. И выходной файл по-прежнему пуст: o – Scarl

+0

@Scarl Переменные 'input' и' sample_text' по-прежнему отсутствуют, а исправленный код также пропускает скобки. Тем не менее, я тестировал его, и он работает. Попробуйте протестировать его с ** bold ** абсолютными путями ** bold ** для обоих файлов, например 'c:/test/sample.txt' и' c:/test/set.txt'. Я предполагаю, что есть проблема с чтением входного файла, так как вы заявили, что выходной файл создан, а у вас нет других зависимостей. – thatguy

+0

Общая схема, поясняемая в моем ответе, проще и содержит меньше шаблонов (пример с двумя ресурсами содержит то же количество операторов, что и пример с одним ресурсом). – kgeorgiy

Смежные вопросы