为什么我的输出没有保存为文件?

0yycz8jy  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(480)

这个问题在这里已经有答案了

将文本文件加载到文本区域(4个答案)
5个月前关门了。
我正在创建一个应用程序,它接收用户输入,将其发送到pccalc方法,当按下gui类(不存在)中的submit按钮时,会打开pw class窗口以显示结果。我现在要做的是在调用displayc方法后,将输出打印到textarea中的一个.txt文件中。你可以看到我在下面尝试了什么,但什么都没有发生,我不知道从这里去哪里。
预期的输出将是display和displayc方法,这两种方法在以txt格式保存到以内部版本名作为文件名的文件之前都存在于输出中。
打印方法:

package pcbuilder;

public class pccalc {

public void display() {

    curWatt = cpu + cpuO + mobo + gpu + fastStore + slowStore + store + exStore + fan + sound; ////(http://www.buildcomputers.net/power-consumption-of-pc-components.html) for high end Mobo

    System.out.printf("The max PSU wattage estimate is: " + curWatt + ".%n");
    System.out.println("We suggest a minimum of 80+ Gold rating.");
    System.out.println("A wattage of even 100w - 200w less is doable!");

}

public void displayC(String n, String cb, String cl, String gb, String gl, String fs, String ss, String sa, String fq, String cf) {

    curWatt = cpu + cpuO + mobo + gpu + fastStore + slowStore + store + exStore + fan + sound; 

    System.out.printf("%nBuild Name: %s", buildName);
    System.out.printf("%nCPU - %s %s: %d", cb, cl, cpu);
    System.out.printf("%nCPU OC Needed: %d", cpuO);
    System.out.printf("%nMotherboard: %d", mobo);
    System.out.printf("%nGPU - %s %s: %d", gb, gl, gpu);
    System.out.printf("%nSSD/NVME - %s: %d", fs, fastStore);
    System.out.printf("%nHDD - %s: %d", ss, slowStore);
    System.out.printf("%nUnused Sata/NVME - %s: %d", sa, store);
    System.out.printf("%nCD/DVD/BlueRay - %s: %d", fq, exStore);
    System.out.printf("%nFans - %s: %d", cf, fan);
    System.out.printf("%nOverhead for Sound: %d", sound);
    System.out.printf("%nTotal Estimated Wattage: %d%n", curWatt);

    }
}

在窗口中显示结果的类

package pcbuilder;
import java.awt.EventQueue;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import javax.swing.JLabel;
import javax.swing.SwingConstants;

import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class pw {

    test nt = new test();
    private JFrame framePU;
    JLabel lblNewLabel = new JLabel("Your Max PSU Estimate!");
    JScrollPane scrollPane_1 = new JScrollPane();
    JTextArea psuArea = new JTextArea();        
    PrintStream printStream = new PrintStream(new CustomOutputStream(psuArea));
    JScrollPane scrollPane = new JScrollPane();
    JButton btnAdv = new JButton("Advanced Breakdown");
    pccalc pcp = new pccalc("");

    String in = "";
    String cbrand = "N/A";
    String cline = "N/A" ;
    String oclock = "";
    String gbrand = "N/A";
    String gline = "N/A";
    String fstorage = "0";
    String sstorage = "0";
    String savailable = "0";
    String fquarter = "0";
    String cfan = "0";
    String soverhead = "";
    String fn = in + ".txt";
    int btnct = 0;

    /**
     * Launch the application.
     */

    public void newScreen(String n, String cb, String cl, String oc, String gb, String gl, String fs, String ss, String sa, String fq, String cf, String so) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {

                try {

                    lblNewLabel.setText("A different label");

                    in = n;
                    cbrand = cb;
                    cline = cl;
                    oclock = oc;
                    gbrand = gb;
                    gline = gl;
                    fstorage = fs;
                    sstorage = ss;
                    savailable = sa;
                    fquarter = fq;
                    cfan = cf;
                    soverhead = so;

                    //A method from the pccalc class that recalculates based on the strings passed through.
                    pcp.reCalc(in, cbrand, cline, oclock, gbrand, gline, fstorage, sstorage, savailable, fquarter, cfan, soverhead);
                    pcp.display();

                    framePU.setVisible(true);

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

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

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        framePU = new JFrame();
        framePU.setBounds(100, 100, 450, 348);
        framePU.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        framePU.getContentPane().setLayout(null);
        lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);

        lblNewLabel.setBounds(128, 6, 200, 16);
        framePU.getContentPane().add(lblNewLabel);

        scrollPane_1.setBounds(6, 26, 438, 246);
        framePU.getContentPane().add(scrollPane_1);

        scrollPane_1.setViewportView(psuArea);

        JButton btnSave = new JButton("Save");
        btnSave.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                if (btnct != 1) {

                    pcp.displayC(in, cbrand, cline, gbrand, gline, fstorage, sstorage, savailable, fquarter, cfan);

                }

                PrintStream fileStream = null;
                try {
                    fileStream = new PrintStream(new FileOutputStream(in));
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                System.setOut(fileStream);

            }
        });
        btnSave.setBounds(45, 284, 86, 29);
        framePU.getContentPane().add(btnSave);

        btnAdv.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                pcp.displayC(in, cbrand, cline, gbrand, gline, fstorage, sstorage, savailable, fquarter, cfan);
                btnAdv.setEnabled(false);
                btnct++;
            }
        });
        btnAdv.setBounds(214, 284, 187, 29);
        framePU.getContentPane().add(btnAdv);

        scrollPane.setBounds(22, 354, 354, 230);
        System.setOut(printStream);
        System.setErr(printStream);
    }
}
yk9xbfzb

yk9xbfzb1#

将输出写入 System.out 以及使用 System.setOut 从长远来看,改变它所指向的东西最终会令人困惑。我建议通过考试 PrintStreampccalc.display 以及 pccalc.displayC 方法,这样就不必更改system.out:

public void display(PrintStream out) {
    curWatt = cpu + cpuO + mobo + gpu + fastStore + slowStore + store + exStore + fan + sound; ////(http://www.buildcomputers.net/power-consumption-of-pc-components.html) for high end Mobo
    out.printf("The max PSU wattage estimate is: " + curWatt + ".%n");
    out.println("We suggest a minimum of 80+ Gold rating.");
    out.println("A wattage of even 100w - 200w less is doable!");
}

每次调用这些方法时,不要忘记传入正确的输出流:

pcp.display(printStream);

现在写入新文件很容易:

try (PrintStream fileStream = new PrintStream(new FileOutputStream(name of your file here))) {
    pcp.display(fileStream);
    pcp.displayC(fileStream, the rest of your long parameter list here);
} catch (FileNotFoundException e1) {
    // display an error dialog to the user here
}

我还建议你给你的方法和变量起一个有意义的名字——从长远来看,你会感谢你自己的

相关问题