为什么它仍然存储我以前的输入流

时间:2011-09-05 20:34:25

标签: java file-io

我正在浏览inputStream并检查文件的第一个输入是否具有有效输入,但问题是它是否不是我调用我的方法再次读入文件但它仍然具有上一次扫描的信息的文件。无论如何,我可以告诉它只是重置inputStream中的内容并重新开始?

 public static  void readinfile(ArrayList<ArrayList> table,
        int numberOfColumns,  
        ArrayList<String> header, ArrayList<ArrayList<String>> original,
        ArrayList<String> sntypes, ArrayList<Integer> displaySize, ArrayList<String> writeOut, Scanner inputStream) 
{

    inputStream = null;
     table.clear(); 
    sntypes.clear();
    displaySize.clear();
    header.clear();
    numberOfColumns = 0;
    original.clear();
    Scanner keyboard = new Scanner(System.in);
    String fileName = keyboard.nextLine();
    System.out.println(inputStream);
    boolean done = false;
    while(!done)
    {
        try 
        {
            inputStream = new Scanner(new FileInputStream(fileName));
            done = true;

            header.clear();
        }
        catch(FileNotFoundException E)
        {   System.out.println("Error in opening file ");
        System.out.print("enter data file: ");
            fileName = keyboard.nextLine();

        }
    }

    // file is now open and input scanner attached
    boolean done1 = false;
    if ( inputStream.hasNextLine() ) {

        String csvLine = inputStream.nextLine();

        Scanner lineparse = new Scanner(csvLine);
        lineparse.useDelimiter(",");
        ArrayList<String> rowOne = new ArrayList<String>();

        while (lineparse.hasNextLine()) {
            String temp = lineparse.next();
            String originaltemp = temp; 
            writeOut.add(temp);
            temp = temp + "(" + (++numberOfColumns) + ")";
            displaySize.add(temp.length());


            if (temp.trim().substring(0, 2).equalsIgnoreCase("S ")
                    || temp.trim().substring(0, 2).equalsIgnoreCase("N ")) {
                rowOne.add(originaltemp);
                header.add(temp.substring(2));
                sntypes.add(temp.toUpperCase()
                        .substring(0,2).trim());

            } else {

                System.out
                .println("Invalid file please enter a new file: ");
                readinfile(table, numberOfColumns, header,
                    original, sntypes,displaySize, writeOut, inputStream );

            }

        }
        // add table here it gives problem later on...
        original.add(rowOne);

    }

    while (inputStream.hasNextLine()) 
    {
        String csvLine = inputStream.nextLine();

        Scanner lineparse = new Scanner(csvLine);
        lineparse.useDelimiter(",");

        ArrayList row = new ArrayList();
        int j = 0;
        while (lineparse.hasNext()) {
            String temp = lineparse.next().trim();

            int sizeOfrow = temp.trim().length();
            if (sizeOfrow > displaySize.get(j))
            {
                displaySize.set(j, sizeOfrow);
            }
            if (j < numberOfColumns && sntypes.get(j).equalsIgnoreCase("N")) {
            try 
                {
                    if(temp.equalsIgnoreCase(""))
                    {
                        row.add(new Double(0.0));   
                    }
                    else
                    {   
                        row.add(new Double(temp.trim()));
                    }
                }

            catch (NumberFormatException E)
                {
                    System.out.println("Opps there is a mistake I was expecting a number and I found: "+temp);
                    System.out.println("This row will be ignored");
                    break;

                }

            }
            else 
            {
                if(temp.equalsIgnoreCase(""))
                {
                    row.add((" "));
                }else
                {
                    row.add(temp);
                }

            }
            j++;
        }

        if (row.size() == numberOfColumns) 
        {
            table.add(row);
        }
    }// close for while


    inputStream.close();
}

1 个答案:

答案 0 :(得分:2)

你正在以递归的方式调用这个方法 - 这实际上并不理想,但我们暂时不会这样做(方法方式比维护性更好) - 但问题是是之后你进行了递归调用并且它已经完成,你仍然继续使用原始扫描程序。我怀疑如果你只是在递归调用后添加一个return;语句,那就没问题了。