2014-02-18 3 views
-1

У меня есть программа, над которой я работаю, и у меня проблема с записью строки в файл. Файл создается, но строковое значение, которое должно быть записано в него, в конечном счете не записывается. В Eclipse нет синтаксических ошибок, поэтому я предполагаю, что это семантическая ошибка.Почему ничего не пишет в мой файл?

public boolean createFile() 
{ 
    try 
    { 
     f = new File("house.txt"); 
     if(!f.exists()) 
     { 
      f.createNewFile(); 
      exists = true; 
     } 
     else 
      exists = false; 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
    return exists; 
} 

Это метод, который создает файл. Это следующий метод, который фактически записывает в файл, который успешно создан. Действие происходит от JButton, при нажатии, следует выполнить следующее:

if(evt.getActionCommand().equals("CONFIRM")) 
    { 
     attribute = txt.getText(); 
     try 
     { 
      createFile(); 
      fWriter = new FileWriter(f); 
      String content = attribute;   
      BufferedWriter output = new BufferedWriter(new FileWriter(f)); 
      output.write(content); 
      output.close(); 

     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
+0

Это пустая? : attribute = txt.getText(); – Sembrano

+1

Я сильно подозреваю, что вы получаете исключение, которое должно быть распечатано на консоли. (Это * не * хорошая обработка исключений, кстати.) Посмотрите там. Обратите внимание, что в настоящее время вы пытаетесь создать два объекта FileWriter для одного и того же файла ... это вряд ли сработает. –

+0

вызов метода флеша после записи –

ответ

1

если attribute = txt.getText(); пусто оно не что-либо в файл писать.

Иначе делать.

if(evt.getActionCommand().equals("CONFIRM")) 
    { 
     attribute = txt.getText(); 
     try 
     { 
      createFile(); 
      fWriter = new FileWriter(f); 
      String content = attribute;   
      BufferedWriter output = new BufferedWriter(new FileWriter(f)); 
      output.write(content); 
      output.flush(); 
      output.close(); 


     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

или же добавить StringReader: BufferedReader reader = new BufferedReader(new StringReader(content));

+0

Существует абсолютно * нет * нужно начинать использовать 'StringReader' здесь - какую выгоду вы думаете, что было бы? И вы распространяете исходную проблему, которая создает два 'FileWriter'. ОП заявил, что проблема сохраняется, даже если 'txt.getText()' изменено на «abc», поэтому это определенно не проблема. –

+0

Yeh, но я написал ответ до этого. Таким образом, вы нашли реальную проблему. – Sembrano

+0

Или до того, как я увидел ответы :-) – Sembrano

1

txt.getText(); вероятно пустует.

JavaDoc также предупреждает об этом, хотя, о createNewFile:

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

+0

Он сказал в комментарии, что он попытался создать вручную строку, и он все еще не писал. – ryvantage

+0

Я также просто прокомментировал вызов метода для createFile(), в котором есть .createNewFile(), учитывая совет кого-то, кто предположил, что FileWriter будет по существу создавать файл в любом случае. Еще ничего. – Code4Fun

3

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

Это почти наверняка проблема:

fWriter = new FileWriter(f); 
String content = attribute;   
BufferedWriter output = new BufferedWriter(new FileWriter(f)); 

Вы создаете два FileWriter с для одного файла. Существование первого будет препятствовать правильному созданию второго.

Однако, есть много других точек следует отметить:

  • FileWriter всегда использует кодировку платформы по умолчанию. Я предпочитаю явно указывать кодировку, обычно UTF-8.
  • Создание нового FileWriter (или FileOutputStream) уже создает файл, если он не существует, так что ваш метод createFile бессмысленно (если вам действительно нужно проверить, является ли или не ранее файл существует)
  • Вы должны всегда рядом ваш поток ресурсов в finally блоке или с использованием примерочных с-ресурсов заявление в Java 7.

библиотеки могут сделать такого рода вещи гораздо проще, хотя. Я хотел бы использовать Guava переписать весь код как:

if (evt.getActionCommand().equals("CONFIRM")) { 
    Files.write(txt.getText(), new File("house.txt"), StandardCharsets.UTF_8); 
} 

Declare, что ваш метод может бросить IOException, или поймать его, если вы действительно хотите обрабатывать его в методе.

Если вы действительно хотите сделать это вручную:

if (evt.getActionCommand().equals("CONFIRM")) { 
    try (Writer writer = new OutputStreamWriter(
     new FileOutputStream("house.txt"), StandardCharsets.UTF_8)) { 
    writer.write(txt.getText()); 
    } 
} 
0

Все, что вам действительно нужно это:

try {  
     BufferedWriter output = new BufferedWriter(new FileWriter(new File("house.txt"))); 
     output.write(txt.getText()); 
     output.close(); 

    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

Если house.txt не существует, то он будет создан. Если txt.getText() возвращает строку, она будет записана в house.txt.

Я бы также предложил использовать оператор try-with-resources, если это возможно, что закроет ваш поток для вас после выхода блока try.

try (BufferedWriter output = new BufferedWriter(new FileWriter(new File("house.txt")))){ 
     output.write(txt.getText()); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

Хм, я уверен, что это должно сработать вместе с несколькими другими решениями, которые были опубликованы. Я начинаю думать, что это проблема с моим ActionListener. По сути, добавление Jbutton при нажатии открывается окно с JComboBox, после выбора формы опции, которую JComboBox открывает новый фрейм с текстовым полем и кнопкой «ПОДТВЕРДИТЬ». ActionListener для обеих этих кнопок находится в одном методе. Может ли это иметь какое-либо отношение к проблеме? – Code4Fun

+0

Извините, я никогда не использовал Swing, поэтому я не могу с этим поделать, я бы проверял, выполняется ли этот код и что txt.getText() возвращает строку, которая не пуста. – Alex

+0

Код выполняется отлично и не падает в любом случае, поэтому проблема не является синтаксической. Но спасибо. – Code4Fun

0

Введите этот код. Это поможет вам скопировать один файл в другой и скопировать только палиндромы, которые есть в вашем файле.

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 

public class Reader { 
    public static String reverse(String s) 
    { 
     String str= new String(""); 
     for(int i=s.length()-1;i>=0;i--) 
     { 
      str+=s.charAt(i); 
     } 
     return str; 
    } 

    public static void main(String[] args) throws Exception { 
     //File m=new File("C:\\bg/newfile.txt"); 
     int count=0; 
     FileReader f=new FileReader("C:\\bg/newfile.txt"); 
     FileWriter fa=new FileWriter("C:\\bg/newfile1.txt"); 
     BufferedReader bf=new BufferedReader(f); 
     BufferedWriter br=new BufferedWriter(fa); 
     String line=bf.readLine(); 
     //String li=br.newLine(); 
     while(line!=null) 
     { 
      String[] sa=line.split(" "); 
      for(String a:sa) 
      { 
       if(a.equals(reverse(a))) 
       { 
        System.out.println(a); 
        br.write(a); 
        br.newLine(); 
        count++; 
       } 
       //System.out.println(count+""+a); 
      } 
      //br.newLine(); 
      line=bf.readLine(); 
     } 
     bf.close(); 
     br.close(); 
    } 
} 
Смежные вопросы