返回FileInputStream指向的旧位置

时间:2012-02-15 05:44:13

标签: java

我正在从文本文件中读取数据。但是在代码从主类离开到Factory类之后,我希望empTextStreamIn从它停止的地方继续。但对我来说,它只显示与Salaried类相关的数据。请告诉我应该在我的Main课程中进行哪些更改。我的文本文件包含与所有类型的员工相关的数据。

假设所有必要的数据。

以下是代码段

Main.java

char valueInFirstColumn = 0;
while((valueInFirstColumn!=' ' || valueInFirstColumn!='\n') && (empTextStreamIn.available()!=0))
        {
            employeeFileParser = empTextStreamIn.read();
            valueInFirstColumn = (char)employeeFileParser;
            Factory f = new Factory(empTextStreamIn,valueInFirstColumn);
        }

==============

Factory.java

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

我没有得到其他内容。

1 个答案:

答案 0 :(得分:0)

据我所知,没有办法回到FileInputStream的早期点。

在这种情况下,您应该确保员工构造函数只读取描述其相应员工的数据。 Employee构造函数中的do-while条件是罪魁祸首。 while(FileParser != -1);基本上意味着“在我们到达文件末尾之前继续这样做。更合适的是,在这种特殊情况下,你应该使用while(FileParser != '\n');,这意味着”继续这样做,直到我们到达结束这条线“。

您使用什么编辑器编写代码?如果您正在使用Eclipse(一个非常常见的编辑器来编写Java代码),我建议您学习如何使用调试器。看看here上的教程。最相关的部分是: 4.1。设置断点 4.2。启动调试器 4.4。变量即可。使用调试器可以帮助您找出这种情况下的错误。调试器将逐个遍历代码行,您很快就会注意到while循环执行的次数太多了。

完全不相关的建议:Java开发人员通常遵循使用小写字母启动变量名称的约定。因此,我会建议你,例如使用empId而不是大写第一个字母。