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

huangapple go评论83阅读模式
英文:

Why isn't my output being saved as a file?

问题

package pcbuilder;

public class pccalc {

    public void display() {
        curWatt = cpu + cpuO + mobo + gpu + fastStore + slowStore + store + exStore + fan + sound;

        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);
    }
}

public class pw {

    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) {
        // ...
        pcp.reCalc(in, cbrand, cline, oclock, gbrand, gline, fstorage, sstorage, savailable, fquarter, cfan, soverhead);
        pcp.display();
        framePU.setVisible(true);
    }

    // ...

    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) {
            e1.printStackTrace();
        }
        
        System.setOut(fileStream);
    }
}
英文:

I am creating an application that takes in user input, sends it to my pccalc method and when the submit button in the GUI class (not present) is pressed opens the pw class window to display the results. What I am trying to do now is get the output printed to my textArea into a .txt file once the displayC method is called. You can see what I tried below, but nothing is happening and I'm not sure where to go from here.

Expected output would be the display and displayC methods both being present on the output before being saved to the file with the build name as the file name in txt format.

Method that prints:

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);
}
}

Class that displays results in window

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);
}
}

答案1

得分: 2

将输出写入System.out并使用System.setOut来更改其指向的内容最终会在长期运行中引起混淆。我建议将PrintStream传递给pccalc.displaypccalc.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) 用于高端主板
    out.printf("最大电源功率估计为:" + curWatt + "。%n");
    out.println("我们建议至少选择80+金牌级别。");
    out.println("甚至可以减少100瓦至200瓦的功率!");
}

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

pcp.display(printStream);

现在轻松地写入新文件:

try (PrintStream fileStream = new PrintStream(new FileOutputStream(您的文件名))) {
    pcp.display(fileStream);
    pcp.displayC(fileStream, 其余的长参数列表);
} catch (FileNotFoundException e1) {
    // 在这里向用户显示错误对话框
}

我还建议您为方法和变量取有意义的名称 - 长期来看,您会对自己感到满意。

英文:

Writing output to System.out and using System.setOut to change what it points to ends up being confusing in the long run. I would suggest passing a PrintStream to the pccalc.display and pccalc.displayC methods so that you don't have to change 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!");
}

Don't forget to pass in the correct output stream every time you call these methods:

pcp.display(printStream);

Now writing to new file is easy:

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
}

I would also suggest you give meaningful names to your methods and variables - you'll thank yourself in the long run

huangapple
  • 本文由 发表于 2020年8月19日 09:23:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/63478727.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定