2013-03-12 2 views
0

Я пытаюсь читать из одного файла и обрабатывать результаты в другой файл, но у меня возникают трудности с использованием PrintWriter. Я знаю, что все работает, когда я печатаю на консоль, но когда я устанавливаю PrintWriter в указанный файл с помощью JOFileChooser, он не будет писать или создавать файл. Я не уверен, где я ошибаюсь. Любая помощь с этим будет оценена по достоинству.Ищете руководство с использованием PrintWriter

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Container; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.Scanner; 

import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class FileIntAdder extends JFrame implements ActionListener 
{ 
    private JTextField txtFileIn; 
    private JTextField txtFileOut; 
    private JButton btnFileIn; 
    private JButton btnFileOut; 
    private JButton btnProcess; 
    private JButton btnClear; 
    public FileIntAdder() 
    { 
     this.setTitle("File I/O"); 
     Container canvas = this.getContentPane(); 

     canvas.add(createCenterPanel(), BorderLayout.CENTER); 
     canvas.add(createSouthPanel(), BorderLayout.SOUTH); 


     this.setResizable(false); 
     this.setSize(600, 150); 
     this.setLocation(800, 500); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); 
    } 

    private JPanel createSouthPanel() 
     { 
      JPanel pnlSouth = new JPanel(); 

      btnProcess = new JButton("Process"); 
      btnProcess.addActionListener(this); 
      pnlSouth.add(btnProcess); 

      btnClear = new JButton("Clear"); 
      btnClear.addActionListener(this); 
      pnlSouth.add(btnClear); 

      pnlSouth.setBackground(Color.DARK_GRAY); 
      return pnlSouth; 
     } 

    private JPanel createCenterPanel() 
     { 

      JPanel pnlCenter = new JPanel(); 
      pnlCenter.setLayout(new GridLayout(2,2)); 

      btnFileIn = new JButton("File In"); 
      pnlCenter.add(PanelWrap(btnFileIn)); 
      btnFileIn.addActionListener(this); 
      txtFileIn = new JTextField(25); 
      pnlCenter.add(PanelWrap(txtFileIn)); 


      btnFileOut = new JButton("File Out"); 
      pnlCenter.add(PanelWrap(btnFileOut)); 
      btnFileOut.addActionListener(this); 
      txtFileOut = new JTextField(25); 
      pnlCenter.add(PanelWrap(txtFileOut)); 

      return pnlCenter; 
     } 

     public static void main(String[] args) 
      { 
       new FileIntAdder(); 
      } 

     @Override 
     public void actionPerformed(ActionEvent a) 
      { 
       JFileChooser fileInput = new JFileChooser(); 
       JFileChooser fileOutput = new JFileChooser(); 

        if(a.getSource() == btnClear) 

         txtFileIn.setText(""); 
         txtFileOut.setText(""); 

        if(a.getSource() == btnFileIn) 
        { 

    if(fileInput.showOpenDialog(btnFileIn) != JFileChooser.CANCEL_OPTION) 
         { 
      File inFile = fileInput.getSelectedFile(); 
       String fileInName = inFile.getAbsolutePath(); 
                       txtFileIn.setText(fileInName); 
         } 
        } 
        if(a.getSource() == btnFileOut) 
        { 
    if(fileOutput.showSaveDialog(btnFileOut) != JFileChooser.CANCEL_OPTION) 
         { 
       File outFile = fileOutput.getSelectedFile(); 
       String fileOutName = outFile.getAbsolutePath(); 

       txtFileOut.setText(fileOutName); 
         } 
        } 
        if(a.getSource() == btnProcess) 
        { 
        PrintWriter fout = null; 
        try 
        { 
    Scanner lineScanner = new Scanner(new FileInputStream(txtFileIn.getText())); 
      fout = new PrintWriter(txtFileOut.getText()); 
      while(lineScanner.hasNext()) 
         { 
      String line = lineScanner.nextLine(); 
          Scanner rowScanner = new Scanner(line); 
      int i=0; 
      int parentAge = 0; 
      int childsAge = 0; 
      while(rowScanner.hasNext()) 
      { 
       if(i==0) 
       { 
      fout.println("Whoes your daddy: " + rowScanner.next() + " "); 
      parentAge = rowScanner.nextInt(); 
      } 
      else 
      { 
        fout.println(i +". " + rowScanner.next() + " "); 
        childsAge+= rowScanner.nextInt(); 
       } 

       i++; 
      } 
      if(childsAge>parentAge) 
      { 
       fout.println("You are older than dirt"); 
      } 
      else 
      { 
       fout.println("Just a kid still ..."); 
      } 

      fout.println("\n"); 
     } 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.println(e.getMessage()); 
    } 
    finally 
    { 
     if(fout != null) 
    { 
     fout.close(); 
    } 

     } 
} 
    } 
private JPanel PanelWrap(Component c) 
{ 
    JPanel panel = new JPanel(); 
    panel.setBackground(Color.DARK_GRAY); 
    panel.add(c); 
    return panel; 
} 
} 
+2

Хотя ваш образец кода оценен, создание и предоставление [SSCCE] (http://www.sscce.org) позволит (1) упростить * вы *, чтобы понять проблему, и (2) сделать это проще для * нас *, чтобы помочь вам. – wchargin

+0

спасибо за головы. Я все еще пытаюсь понять все. –

ответ

2

Проблема здесь:

if (a.getSource() == btnClear) 
    txtFileIn.setText(""); 
    txtFileOut.setText(""); <-- txtFileOut is always cleared 

Вам нужно добавить вмещающих скобки в этом if заявление, в противном случае вы будете очистить txtFileOutJTextField. Когда вы идете выписать файл, который вы пытаетесь записать файл с именем "", в результате получится FileNotFoundException.

Изменить на:

if (a.getSource() == btnClear) { 
    txtFileIn.setText(""); 
    txtFileOut.setText(""); 
} 
+0

Большое вам спасибо. Должно быть, я просмотрел свой код часами, и я просто не видел проблемы. как только я разместил прилагаемые фигурные скобки, он работал отлично. Теперь он имеет такой смысл, что мне было доведено до меня. –

+0

Нет проблем, рассмотрите [принятие этого ответа] (http://meta.stackexchange.com/a/65088/155831), если это помогло :) – Reimeus

0

У меня были проблемы с PrintWriter раньше, потому что, как documentation says

«Методы в этом классе никогда не бросайте ввода/исключения вывода, хотя некоторые из его конструкторы может. Клиент может узнать, произошли ли ошибки , вызвав checkError(). "

Я пытался использовать PrintWriter с полным диском и просто ничего не получал.

Вы можете использовать BufferedWriter вместо, который будет бросать IOExceptions, или вы можете сделать что-то вроде того, что я сделал here и сделать копию BufferedWriter, что проливает непроверенные исключения.

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