文件Employee.txt包含两种类型员工的员工详细信息,按月付费和按小时付费。该文件包含月薪员工的名字,姓氏,性别,职级,类型和基本工资,或小时工资的小时费率和工作小时数。该文件的样本如下:
John Smiths M经理每月45000.00
Sunil Bates M高级每小时700.00 45
Eva Leung F官员每月30500.00我必须编写一个程序,查看每位员工,并计算奖金占基本工资的百分比。对于按小时工资的员工,基本工资是按小时工资乘以当月的工作小时数。如果等级为“军官”,奖励率为20%,如果等级为高级或以上,则奖励率为15%。该程序应将新文件TotalSalary.txt写入每个员工的全部详细信息,即姓名,性别和工资总额(即奖金)。
以下是我如何解决这个问题:
将员工数据写入文本文件类
public class files_qu1 {
public static Formatter writein;
private static Scanner sc;
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
writein= new Formatter("Employees.txt");
}
catch(SecurityException se){
System.out.println("You do have access to this file");
System.exit(1);
}
catch(FileNotFoundException fnfe){
System.out.println("Error in creating file");
System.exit(1);
}
Scanner sc= new Scanner(System.in);
String fname, lname, gender, rank, type;
double salary, t_sal, hours=0.0;
int num;
System.out.println("Enter num of employees");
num= sc.nextInt();
for(int i=0; i<num; i++){
System.out.println("First name: ");
fname=sc.next();
System.out.println("Last name: ");
lname=sc.next();
System.out.println("Gender: ");
gender=sc.next();
System.out.println("Rank: ");
rank=sc.next();
System.out.println("Type: ");
type=sc.next();
System.out.println("Salary: ");
salary=sc.nextDouble();
if(type.equals("hourly")){
System.out.println("Hours worked: ");
hours=sc.nextInt();
}
writein.format(" %s %s %s %s %s %.2f %.2f\n",fname, lname, gender, rank, type, salary, hours);
}
sc.close();
if(writein!=null){
writein.close();
}
}
}
从Employees文本文件读取和计算数据到TotalSalary文本文件类
public class files_qu1read {
private static Formatter writeToFile;
private static Scanner sc;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
sc= new Scanner(new File("C:/Users/Diksha/workspace/Java_Sem1/Employees.txt"));
}
catch
(FileNotFoundException fnfe){
System.out.println("Error Creating File");
System.exit(1);
}
String fname = null, lname, gender, rank, type;
double salary, t_sal = 0, hours;
while(sc.hasNext()){
fname=sc.next();
lname=sc.next();
gender=sc.next();
rank=sc.next();
type=sc.next();
salary=sc.nextDouble();
hours=sc.nextDouble();
if(type.equals("hourly")){
t_sal= salary*hours;
}
if(type.equals("monthly")&&rank.equals("officer")){
t_sal= salary*1.2;
}
if(type.equals("monthly")&&(rank.equals("senior")||rank.equals("manager"))){
t_sal= salary*1.15;
}
try{
writeToFile = new Formatter("TotalSalary.txt");
}
catch (SecurityException se) {
System.out.println("You do have access to this file");
System.exit(1);
}
catch (FileNotFoundException fnfe) {
System.out.println("Error Creating File");
System.exit(1);
}
writeToFile.format("First name: %s Last name: %s Gender: %s Total Salary: %.2f",fname,lname, gender, t_sal);
}
sc.close();
if(writeToFile!=null){
writeToFile.close();
}
}
}
基本上,一切正常,程序能够写入Employees文本文件,但是当读取和写入TotalSalary文件的数据时,只有我写入Employees文件的最后一个员工的名字正在写入TotalSalary文件以及他的总薪水。
即如果Employees.txt文件包含如下数据:
Riley Fox经理每月45000.00 0.00
Emily Roth官员每小时10000.00 8.00在TotalSalary.txt中,显示的唯一数据是最后一名员工的数据:
名字:Emily姓:Roth性别:f总薪水:80000.00
答案 0 :(得分:1)
每次创建要写入的Formatter时,都会创建或覆盖该文件。所以任何内容都会丢失。请阅读Javadoc:
- @param fileName
- 用作此
目的地的文件的名称- 格式化。 **如果文件存在,那么它将被截断为
- 零大小;否则,将创建一个新文件**。输出
- 将被写入文件并被缓冲。
您可以在循环外创建格式化程序
try{
writeToFile = new Formatter("TotalSalary.txt");
}
catch (SecurityException se) {
System.out.println("You do have access to this file");
System.exit(1);
}
catch (FileNotFoundException fnfe) {
System.out.println("Error Creating File");
System.exit(1);
}
while(sc.hasNext()){
...
并重复使用直到程序结束并最终关闭它。您始终可以使用try-with-resources格式。