#java #readfile
Вопрос:
Я пытаюсь прочитать файл и сохранить каждую переменную из файла в нужном месте, которое я хочу сохранить из файла , как Имя, фамилия, доллар в час. Затем после этого распечатайте каждого человека отдельно вместе с уравнением для решения их проверки за неделю, но я понятия не имею, как хранить, а затем позвоните правильно от каждого отдельного человека
public class Workers {
private String FirstName;
private String LastNAme;
private int HoursWorked;
private int DollarPerHour;
public String getFirstName() {
return FirstName;
}
public void setFirstName(String firstName) {
FirstName = firstName;
}
public String getLastNAme() {
return LastNAme;
}
public void setLastNAme(String lastNAme) {
LastNAme = lastNAme;
}
public int getHoursWorked() {
return HoursWorked;
}
public void setHoursWorked(int hoursWorked) {
HoursWorked = hoursWorked;
}
public int getDollarPerHour() {
return DollarPerHour;
}
public void setDollarPerHour(int dollarPerHour) {
DollarPerHour = dollarPerHour;
}
@Override
public String toString() {
return "Workers{"
FirstName LastNAme
", Has Worked " HoursWorked "hours this week"
"and makes " DollarPerHour
"a hour";
}
}
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Main extends Workers {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try{
BufferedReader reader = new BufferedReader(new FileReader("src/WorkersAndPay.txt"));
String file = reader.readLine();
while (file != null){
System.out.println(file);
file = reader.readLine();
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
мой txt-файл настроен следующим образом
Michael,Zargosa,14
MAx,SMith,15
Judith,Smith,16
Комментарии:
1. Я предлагаю вам использовать настоящую библиотеку CSV, а не
BufferedReader
просто разбирать ее на объекты Java. Но что именно вы не понимаете в своейline
переменной, чтобы разделить или разобрать ее на отдельные компоненты? Такжеextends Workers
следует удалить
Ответ №1:
Если все ваши строки отформатированы как [Имя],[Фамилия],[Отработанные часы] (я предполагаю, что ваше числовое значение-это ваши отработанные часы, а не «доллары в час»), например, вы можете просто использовать метод разделения над вашим объектом line (странно называемый файл). :
String[] data = file.split(",");
Теперь у вас есть массив строк, подобных этому: [«Майкл», «Заргоса», «14»]
Вам все равно нужно преобразовать строку «14» в int, что можно сделать следующим образом :
Целое число.Синтаксический анализ(…)
В конце концов, вы могли бы написать метод, превращающий вашу строку в рабочий объект :
private static Workers createFromLine(final String line) {
Workers worker = null;
if(line != null) {
worker = new Workers();
String[] data = line.split(",");
int workedHours = Integer.parseInt(data[2]);
worker.setFirstName(data[0]);
worker.setLastNAme(data[1]);
worker.setHoursWorked(workedHours);
}
return worker;
}
Более элегантный и безопасный способ сделать это, вероятно, состоял бы в извлечении данных на основе регулярных выражений. Минимальная реализация может включать проверку соответствия вашей строки этому регулярному выражению: w ,w ,d
Ваш класс «Main» не должен наследовать (расширяться) Рабочий класс, так как это не имеет смысла. Я действительно не знаю, что вы пытаетесь сделать, но если вы хотите, чтобы ваш основной метод использовал или «содержал» (экземпляры) класса Workers, нет необходимости в наследовании класса от рабочих.
Комментарии:
1. да, прошло некоторое время с тех пор, как я изучал основы, поэтому вернулся, чтобы освежить свои мысли, похоже, мне нужно много освежиться
2. Чтобы убедиться, что Ваши личные статические работники создают исходную строку(последнюю строковую строку) после того, как я уже правильно прочитал файл
Ответ №2:
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader(new File("./WorkersAndPay.txt")));
while (br.ready()) {
String line = br.readLine();
if (line == null){continue;}
String[] words = line.split(",");
Workers worker = new Workers();
worker.setFirstName(words[0]);
worker.setLastName(words[1]);
worker.setHoursWorked(Integer.parseInt(words[2]));
System.out.println(worker.toString());
}
br.close();
}
catch (IOException e) {e.printStackTrace();}
}
Комментарии:
1. Это хорошо печатается, но в конце я получаю это исключение в потоке «main» java.lang. Исключение NullPointerException: Не удается вызвать «String.split(строка)», потому что «файл» равен нулю в Main.main(Main.java:20)
Ответ №3:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
BufferedReader reader = new BufferedReader(new FileReader("src/WorkersAndPay.txt"));
String file = reader.readLine();
while (file != null){
file = reader.readLine();
String[] data = file.split(",");
Workers worker = new Workers();
worker.setFirstName(data[0]);
worker.setLastName(data[1]);
worker.setHoursWorked(Integer.parseInt(data[2]));
worker.setDollarPerHour(Integer.parseInt(data[3]));
System.out.println(worker.toString());
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//I did this and it prints out also change my txt to be see up like
//firstname,lastname,hourswroked,dallorPerhour
/* change to string to
@Override
public String toString() {
return "Workers{"
firstName " " lastName
", Has Worked " hoursWorked " hours this week Check will be: "
(dollarPerHour * hoursWorked) " $ ";
}
*/
/*
Workers{Michael Murillo, Has Worked 50 hours this week Check will be: 550 $
Workers{Max Murillo, Has Worked 49 hours this week Check will be: 637 $
Workers{Eddie Murillo, Has Worked 50 hours this week Check will be: 700 $
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.split(String)" because "file" is null
at Main.main(Main.java:19)
*/