Назначение:
Мне нужно использовать графический интерфейс для открытия файла, суммирования каждой строки и вывода содержимого каждой строки, за которым следует ряд пробелов и суммакаждая строка в новый файл.Новый файл должен быть помечен как «Previousfilename» _out.txt aka * _out.txt, если хотите.
Где я нахожусь:
У меня есть графический интерфейс, который работает и копирует файл.
Это редактирование и суммирование строк в файле, что, по-видимому, является проблемой.
Моя текущая программа, в которой работает только графический интерфейс, не распознает символы новой строки и показывает каждый int
суммированныйна новой строке, например,
ввод:
1, 2, 3, 4, 5
5, 6
4, 3, 9
вывод:
1
3
6
10
15
20
26
30
33
42
Из-за ненуждаясь в ',', разделяя целые в моем testfile.txt
Я удалил разделитель и вся программа перестала работать после того, как я нажал на копию с ошибкой:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "1 2 3 4 5"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at fileSumCompute.computeF(fileSumCompute.java:210)
at fileSumCompute$myHandler.actionPerformed(fileSumCompute.java:105)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Как мне отредактировать копию, даже если она используетсяпо Jfilechooser?Как я могу заставить его распознавать символы новой строки, но при этом распечатывать последнюю сумму с помощью EOF (там были проблемы с предыдущей сборкой, которые там были с ошибкой.)?
Старый код: https://drive.google.com/open?id=1OOB5-21sJXQSl8XLlFPASaAPoIsXWnPu
Новый код:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.nio.file.*;
import java.util.*;
public class fileSumCompute extends JFrame{
//my first gui
private JFileChooser fc;
private JButton copyButton;
private JButton chooseFileButton;
private JButton destinationButton;
private File workingDirectory;
private JLabel sourceLabel;
private JLabel destinationLabel;
private JTextField sourceText;
private JTextField sourceFileText;
private JTextField destinationText;
public static void main(String [] args)
{
fileSumCompute cpy1 = new fileSumCompute();
cpy1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cpy1.setSize(600, 150);
cpy1.setVisible(true);
}
//my first time creating and opening files without direct command line input.
public fileSumCompute() { @Override
//peiced together a couple JfileChooser examples and customized... I cant seem to get it to work without the other path selection and preprograming it into the same directory as source file.
//It works though.
super("Compute sum of row. New file = \" *_out.txt\" ");
setLayout(new GridLayout(3, 3, 5, 5));
fc = new JFileChooser();
//Open dialog box to make easier to find files
workingDirectory = new File(System.getProperty("user.dir"));
fc.setCurrentDirectory(workingDirectory);
//create labels and buttons
chooseFileButton = new JButton("CHOOSE SOURCE FILE");
destinationButton = new JButton("DESTINATION FOLDER");
copyButton = new JButton("COMPUTE & SAVE FILE"); //copies file so origonal is preserved
sourceLabel = new JLabel("SOURCE: ");
sourceText = new JTextField(10);
sourceText.setEditable(false);
destinationLabel = new JLabel("DESTINATION: ");
destinationText = new JTextField(10);
destinationText.setEditable(false);
//JFrame tools
add(sourceLabel);
add(sourceText);
add(chooseFileButton);
add(destinationLabel);
add(destinationText);
add(destinationButton);
add(copyButton);
//Create myHandler object to add action listeners for the buttons.
myHandler handler = new myHandler(); //handles the files and copies them
chooseFileButton.addActionListener(handler);
destinationButton.addActionListener(handler);
copyButton.addActionListener(handler);
//computeF(name);
}
//Inner class to create action listeners
private class myHandler implements ActionListener {
private File selectedSourceFile;
private File selectedDestinationFile;
public void actionPerformed(ActionEvent event)
{
int returnVal;
String selectedFilePath;
File selectedFile;
if (event.getSource() == chooseFileButton)
{
returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION)
{
selectedSourceFile = fc.getSelectedFile();
sourceText.setText(selectedSourceFile.getName());
}
}
if (event.getSource() == destinationButton)
{
returnVal = fc.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION)
{
selectedDestinationFile = fc.getSelectedFile();
destinationText.setText(selectedDestinationFile.getName());
//where we implement the second file... here is where we'll call to compute the sum of the lines
String name = selectedSourceFile.getName();
name = selectedSourceFile.getName().substring(0, name.lastIndexOf(".")) + "_out.txt"; //changed the output file to read ("Orig name here"_out.txt)
File destinationFile = new File(selectedDestinationFile.getParentFile(), name);
//destinationFile.deleteOnExit();
try {
Files.copy(selectedSourceFile.toPath(), destinationFile.toPath()); //copying and computing
computeF(destinationFile); //if we can get this to edit the _out.txt file we can do with out creating two seperate files- the previous *_.tmp can just be the *_out.txt
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
if (event.getSource() == copyButton)
{
Path sourcePath = selectedSourceFile.toPath();
Path destinationPath = selectedDestinationFile.toPath();
try
{
Files.copy(sourcePath, destinationPath);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
Это выше графический интерфейс, тогда мой метод обработки процесса ниже
public static void computeF(File selectedDestinationFile) throws IOException{
//int i=0;
if (!selectedDestinationFile.isFile()) // IF CANNOT FIND FILE
{
System.out.println("File.txt - Parameter is not an existing file");
return;
}
Scanner fileReader = null; //using the namespace for readability.
int lineSum=0;
try
{
fileReader = new Scanner(selectedDestinationFile);
}
catch (IOException a) //it insists on a try catch
{
a.printStackTrace();
}
String name = selectedDestinationFile.getName();
System.setOut(new PrintStream(new FileOutputStream(name)));
while(fileReader.hasNext()) {
String number = fileReader.next();
sum += Integer.parseInt(number);
System.out.println(sum);
if(fileReader.hasNextLine()) {
System.out.println(sum);
sum = 0;
}
}
}
}
/*_______________________________________________________________________________________________________________________*/
/*implement after Working script*/
//is there a way to append instead of doing the System.setout? like with this similarly found code.
/* appending how can I implement this??
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
// or this one? I need to keep the copy but just add to the end so that makes the most sense.
fout = new FileWriter("filename.txt", true);
*/
/*______________________________________________________________________________________________________________________*/
_________________ edit________________ // примерно через 2 часа после OP
игнорировать команду переопределения в Jfilechooser, ее там не должно было быть.Кроме того, для нового кода, в основном, как мне заставить его делать то, что я хочу, начиная с того, что я знаю, работает?Ака, как я могу заставить это делать то, что мне нужно:
public static void computeF(FILE in)
{
if (!selectedDestinationFile.isFile()) // IF CANNOT FIND FILE
{
System.out.println("File.txt - Parameter is not an existing file");
return;
}
Scanner fileReader = null; //using the namespace for readability.
try
{
fileReader = new Scanner(in);
}
catch (IOException a) //it insists on a try catch
{
a.printStackTrace();
}
String name = in.getName();
fout = new FileWriter(name, true);// to try to append to the copy instead of rewriting the whole file
}