我正在从文本文件中读取数据。但是在代码从主类离开到Factory类之后,我希望empTextStreamIn从它停止的地方继续。但对我来说,它只显示与Salaried类相关的数据。请告诉我应该在我的Main课程中进行哪些更改。我的文本文件包含与所有类型的员工相关的数据。
假设所有必要的数据。
以下是代码段
char valueInFirstColumn = 0;
while((valueInFirstColumn!=' ' || valueInFirstColumn!='\n') && (empTextStreamIn.available()!=0))
{
employeeFileParser = empTextStreamIn.read();
valueInFirstColumn = (char)employeeFileParser;
Factory f = new Factory(empTextStreamIn,valueInFirstColumn);
}
==============
public Factory(FileInputStream empTextStreamIn, char valueInFirstColumn) throws IOException
{
// TODO Auto-generated constructor stub
//do
//{
if(valueInFirstColumn == '1')
{
Salaried slr = new Salaried(empTextStreamIn);
slr.readData();
slr.printData();
//System.out.println(empTextStreamIn.read());
}
else if(valueInFirstColumn == '2')
{
Hourly hr = new Hourly(empTextStreamIn);
hr.readData();
hr.printData();
}
else if(valueInFirstColumn == '3')
{
Commissioned com = new Commissioned(empTextStreamIn);
com.readData();
com.printData();
}
else
{
System.out.println("Unkown Department");
}
}
=====================
Employee.java
public Employee(FileInputStream empTextStreamIn) throws IOException
{
// TODO Auto-generated constructor stub
do
{
FileParser = empTextStreamIn.read();
//System.out.println(FileParser);
if(FileParser != -1)
{
parsed_text+=(char)FileParser;
}
} while(FileParser != -1);
System.out.println(parsed_text);
//FileParser = empTextStreamIn.read();
//parsed_text+=(char)FileParser;
//System.out.println(parsed_text);
/*for (String everyLine : parsed_text.split("\\n"))
{*/
tokens1 = parsed_text.split("\\s+");
//System.out.println(tokens1);
/*String var1 = tokens1[0];
empType = Integer.parseInt(var1);
if(empType == 1)
{*/
var1 = tokens1[1];
var2 = tokens1[2];
var3 = tokens1[3];
var4 = tokens1[4];
/*}
}*/
}
protected void readData()
{
EmpID = var1;
DeptID = var2;
}
protected void printData()
{
System.out.print("Emp ID:"+EmpID+" DeptID:"+DeptID);
}
==============================
Salaried.java
public class Salaried extends Employee
{
double salary; //Unique detail for Salaried class
Salaried()
{
}
Salaried(FileInputStream empTextStreamIn) throws IOException
{
super(empTextStreamIn);
}
protected void readData()
{
super.readData();
salary = Double.parseDouble(var3);
}
protected void printData()
{
super.printData();
System.out.println(" Salary:"+salary);
}
}
=====================================
Commissioned.java
Commissioned(FileInputStream empTextStreamIn) throws IOException
{
super(empTextStreamIn);
}
protected void readData()
{
super.readData();
sales = Double.parseDouble(var3);
}
protected void printData()
{
super.printData();
System.out.println(" Sales:"+sales);
}
===========================================
Hourly.txt
Hourly(FileInputStream empFileInputStream) throws IOException
{
super(empFileInputStream);
}
protected void readData()
{
super.readData();
hours = Double.parseDouble(var3);
rate = Double.parseDouble(var4);
}
protected void printData()
{
super.printData();
System.out.println(" Sales:"+hours+" Rate:"+rate);
employee.txt中
第一个值是代表员工类型的代码:1是工资,2是每小时,3是佣金。 下一列是员工ID, 下一个员工的部门ID。 下一列取决于员工类型。 - 对于受薪雇员,这是他们每年的工资。 - (对于每小时的员工,这是要支付的小时数。超时(1.5)是在40小时内的所有时间支付的。 - 在第五列中的小时数之后是雇员的工资率。)
1 23938475683 1111 62000
2 30495848484 2222 40 21.5
3 40394833333 3333 30000
2 48584842283 2232 45 10
2 38485849494 2222 42.5 15
1 34345564433 1111 56000
3 98605050393 3333 12000
3 00033432738 3333 17000
==
必需的输出
Employee #23938475683 Dept# 1111 Salary:$62000
Employee #30495848484 Dept# 2222 Hours:40 Rate:$21.5
Employee #40394833333 Dept# 3333 Sales:$30000
Employee #48584842283 Dept# 2232 Hours:45 Rate:$10
Employee #38485849494 Dept# 2222 Hours:42.5 Rate:$15
Employee #34345564433 Dept# 1111 Salary:$56000
Employee #98605050393 Dept# 3333 Sales:$12000
Employee #00033432738 Dept# 3333 Sales:$17000
===============================
获得输出
Employee #:23938475683 Dept#:1111 Salary:62000.0
我没有得到其他内容。
答案 0 :(得分:0)
据我所知,没有办法回到FileInputStream
的早期点。
在这种情况下,您应该确保员工构造函数只读取描述其相应员工的数据。 Employee
构造函数中的do-while条件是罪魁祸首。 while(FileParser != -1);
基本上意味着“在我们到达文件末尾之前继续这样做。更合适的是,在这种特殊情况下,你应该使用while(FileParser != '\n');
,这意味着”继续这样做,直到我们到达结束这条线“。
您使用什么编辑器编写代码?如果您正在使用Eclipse(一个非常常见的编辑器来编写Java代码),我建议您学习如何使用调试器。看看here上的教程。最相关的部分是: 4.1。设置断点, 4.2。启动调试器和 4.4。变量即可。使用调试器可以帮助您找出这种情况下的错误。调试器将逐个遍历代码行,您很快就会注意到while循环执行的次数太多了。
完全不相关的建议:Java开发人员通常遵循使用小写字母启动变量名称的约定。因此,我会建议你,例如使用empId
而不是大写第一个字母。