英文:
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.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) 用于高端主板
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论