2015-12-14 4 views
-2

Ну, я приступил к созданию и написанию файлов на Java. Однако я не могу понять, почему мой вывод не будет писать, мой File file не найден, потому что он создается/читается в моем основном методе, который, разумеется, находится в том же class.Почему мой файл не добавляется?

public class EloManip { 

    private JFrame frame; 
    private JTextField textField; 
    private JTextField textField_1; 
    private JTextField textField_2; 
    private JTextField textField_3; 
    private JTextField textField_4; 
    private JLabel lblFormat; 
    private JTextField textField_5; 
    private JLabel lblCase; 
    private JLabel label; 

    //Path p5 = Paths.get(System.getProperty("user.home"),"EloManip", "EloManipCases.log"); 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     try { 

      String content = "This is the content to write into file"; 

      File file = new File("https://stackoverflow.com/users/Peter/EloManipulation.txt"); 

      // if file doesnt exists, then create it 
      if (!file.exists()) { 
       file.createNewFile(); 
      } 

      FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
      BufferedWriter bw = new BufferedWriter(fw); 
      bw.write(content); 
      bw.close(); 

      System.out.println("Done"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        EloManip window = new EloManip(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public EloManip() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 
     frame.setTitle("Elo Manipulation Case Creator by Cavasi"); 

     /*lblFormat = new JLabel("Format"); 
    lblFormat.setBounds(32, 180, 307, 14); 
    frame.getContentPane().add(lblFormat); 
     */ 

     textField = new JTextField(); 
     textField.setBackground(new Color(255, 255, 255)); 
     textField.setBounds(173, 34, 86, 20); 
     frame.getContentPane().add(textField); 
     textField.setColumns(10); 

     JLabel lblEnterName = new JLabel("Enter name:"); 
     lblEnterName.setBounds(32, 37, 122, 14); 
     frame.getContentPane().add(lblEnterName); 

     JLabel lblEnterReason = new JLabel("Enter Reason:"); 
     lblEnterReason.setBounds(32, 62, 104, 14); 
     frame.getContentPane().add(lblEnterReason); 

     textField_1 = new JTextField(); 
     textField_1.setBackground(new Color(255, 255, 255)); 
     textField_1.setBounds(173, 59, 86, 20); 
     frame.getContentPane().add(textField_1); 
     textField_1.setColumns(10); 

     JLabel lblEnterEvidence = new JLabel("Enter Evidence:"); 
     lblEnterEvidence.setBounds(32, 87, 131, 14); 
     frame.getContentPane().add(lblEnterEvidence); 

     textField_2 = new JTextField(); 
     textField_2.setBackground(new Color(255, 255, 255)); 
     textField_2.setBounds(173, 84, 86, 20); 
     frame.getContentPane().add(textField_2); 
     textField_2.setColumns(10); 

     JLabel lblEnterDatemmddyy = new JLabel("Enter Date(MM/DD/YY):"); 
     lblEnterDatemmddyy.setBounds(32, 112, 136, 14); 
     frame.getContentPane().add(lblEnterDatemmddyy); 

     textField_3 = new JTextField(); 
     textField_3.setBackground(new Color(255, 255, 255)); 
     textField_3.setBounds(173, 109, 86, 20); 
     frame.getContentPane().add(textField_3); 
     textField_3.setColumns(10); 

     JLabel lblEnterLength = new JLabel("Enter Length:"); 
     lblEnterLength.setBounds(32, 137, 122, 14); 
     frame.getContentPane().add(lblEnterLength); 

     textField_4 = new JTextField(); 
     textField_4.setBackground(new Color(255, 255, 255)); 
     textField_4.setBounds(173, 134, 86, 20); 
     frame.getContentPane().add(textField_4); 
     textField_4.setColumns(10); 

     textField_5 = new JTextField(); 
     textField_5.setBackground(new Color(255, 255, 255)); 
     textField_5.setBounds(10, 207, 414, 20); 
     frame.getContentPane().add(textField_5); 
     textField_5.setColumns(10); 

     JButton btnNewButton = new JButton("Generate Elo Manipulation Case"); 
     btnNewButton.setFont(new Font("Nirmala UI Semilight", Font.BOLD, 11)); 
     btnNewButton.setForeground(Color.BLACK); 
     btnNewButton.setBackground(Color.GREEN); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       //lblFormat.setText(textField) 
       //JOptionPane.showMessageDialog(null, textField.getText() + " - " + textField_1.getText() + " - " + textField_2.getText() + " " + textField_3.getText() + " [" + textField_4.getText() + "]"); 
       textField_5.setText(textField.getText() + " - " + textField_1.getText() + " - " + textField_2.getText() + " " + textField_3.getText() + " [" + textField_4.getText() + "]"); 
       JOptionPane.showMessageDialog(null, "Successfully created Elo Manipulation Case!"); 
       Writer output; 
       output = new BufferedWriter(new FileWriter(file, true)); 
       output.append("New Line!"); 
       output.close(); 
      } 
     }); 
     btnNewButton.setBounds(0, 238, 434, 23); 
     frame.getContentPane().add(btnNewButton); 

     lblCase = new JLabel("Case:"); 
     lblCase.setBounds(10, 182, 352, 14); 
     frame.getContentPane().add(lblCase); 

     label = new JLabel(""); 
     label.setBounds(269, 11, 155, 163); 
     frame.getContentPane().add(label); 

     Image img = new ImageIcon(this.getClass().getResource("/badlionsmall.png")).getImage(); 

     label.setIcon(new ImageIcon(img)); 
    } 
} 

Файл не может быть разрешен к переменному, поскольку она создается/проверяется в моем основном методе, но мое действие, которое должно быть записано в файл .txt не в основном методе, а скорее инициализации метод. Что я делаю?

+0

Локальные переменные не привязаны к классу метода, в котором они появляются, они привязаны к фигурным скобкам ('{}'), которые они появляются. Если вы хотите иметь возможность использовать переменную в любом месте своего класса, вам нужно сделать его переменной класса. – azurefrog

+4

Если у вас есть новый вопрос, задайте новый вопрос. Не перезаписывайте это. –

+0

Как написано много раз, новый вопрос принадлежит новому сообщению, а не прилагается к нему. Вы можете создать новый вопрос, щелкнув «Задать вопрос» в верхнем правом углу. – Tom

ответ

1

Почему мой файл не прилагается?

Исправьте меня, если я ошибаюсь ... но я думаю, что этот вопрос действительно связан с ошибкой компиляции. Проблема в том, что локальная переменная file в методе main не входит в объем вашего слушателя.

Решение состоит в переводе декларации file. Самый простой способ - сделать его статическим (частным, окончательным) полем EloManip.

(Включение состояния в статику обычно не является хорошей идеей, но если состояние эффективно является константой, и оно локализовано для одного класса и его внутренних классов, то нет большого вреда. OO способ обработки этого ...)

+0

Я исправил его, однако теперь у меня есть текст, который записывается на него, перезаписывается, как только я закрываю свою кнопку, теперь проверяю мою нить – Cavasi

+2

. У вас «вандализирован» ваш вопрос, удалив проблему, на которую ссылается мой ответ. Если вы хотите, чтобы я ответил на ваш вопрос, верните исходный код и спросите, как это сделать, как EDIT или как новый вопрос. Начните с возврата вашего последнего изменения ... –

+2

@ Cavasi, пожалуйста, не изменяйте свой вопрос. Это делает недействительными ответ (ы). – Emz

0

вы фактически объявляя две переменные FileWriter

FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
    BufferedWriter bw = new BufferedWriter(fw); 
    Writer output; 
    output = new BufferedWriter(new FileWriter(file, true)); 

вы пытались использовать только один? Я подозреваю, что первый очищает ваше содержимое, а не второе.

+0

Да, это isn [t working – Cavasi

0

Это сработало для меня;

public static void main(String[] args) throws IOException { 
    File f = new File("test.txt"); 
    try(FileWriter fw = new FileWriter(f, true)) { 
     fw.append("charsequence\r\n"); 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } 
} 

Помните, что изменения в файле будут отображаться только в том случае, если вы его закроете, а затем снова откроете.

+0

* «Помните, что изменения в файле будут отображаться только в том случае, если вы закроете его, а затем снова откроете». * - Неправильно. Также будет работать 'flush()', и вам не нужно снова открывать файл (в этом приложении), чтобы изменения отображались в другом приложении. –

+0

Если он открывает файл в программе, например блокноте _before_, он очищает поток, а затем нет, изменения не будут видны. –

+0

Это правильно. Если он откроет его в другой программе, прежде чем он сбросит ИЛИ закрывается. Но ему не нужно открывать его >> снова << в этом приложении или другом, чтобы изменения были видимыми. Достаточно флеша или закрытия. (Не для Блокнот ...но для других приложений, которые не читают весь файл при запуске.) –

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