0

あるファイルから読み取り、結果を別のファイルに処理しようとしていますが、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;
}
 }
4

2 に答える 2

2

問題はここにあります:

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

このステートメントに中かっこを追加する必要があります。ifそうしないと、 txtFileOut JTextField. ファイルを書き出すときに、というファイルを書き込もうとすると""FileNotFoundException.

への変更:

if (a.getSource() == btnClear) {
   txtFileIn.setText("");
   txtFileOut.setText(""); 
}
于 2013-03-12T00:50:59.730 に答える
0

ドキュメントにあるように、以前に PrintWriter で問題が発生したことがあります。

「このクラスのメソッドは I/O 例外をスローしませんが、そのコンストラクターの一部は例外をスローする可能性があります。クライアントは、checkError() を呼び出して、エラーが発生したかどうかを問い合わせることができます。」

ディスクがいっぱいの状態で PrintWriter を使用しようとしましたが、何も得られませんでした。

IOExceptions をスローする代わりに a を使用するか、ここBufferedWriterで行ったようなことを行って、チェックされていない例外をスローする BufferedWriter のコピーを作成することができます。

于 2013-03-12T00:55:08.290 に答える