11

我想从 criteria.txt文件中读取,以标记化并在同一文件的末尾附加标记。程序抛出异常:No file found!我不知道我的错误在哪里。任何建议都会帮助我。先感谢您!

这是我的代码:

import java.io.*;
import java.util.StringTokenizer;

public class Test
{
    private FileReader fr;
    private BufferedReader br;
    private FileWriter fw;
    private BufferedWriter bw;
    private StringTokenizer strtok;
    private String s;

    //constructor
    public Test()  
    {
        try
        {
            fw=new FileWriter("criteria.txt", true);
            bw=new BufferedWriter(fw);

            try
            {
                fr=new FileReader("criteria.txt");
                br=new BufferedReader(fr);

                while((s=br.readLine())!=null)
                {
                    strtok=new StringTokenizer(s," ");
                    while(strtok.hasMoreTokens())
                    {
                        bw.write("\n"+strtok.nextToken());
                    }
                    br.close();
                }
            }
            catch(FileNotFoundException e)
            {
                System.out.println("File was not found!");
            }
            catch(IOException e)    
            {
                System.out.println("No file found!");
            }

            bw.close();
        }
        catch(FileNotFoundException e)
        {
            System.out.println("Error1!");
        }
        catch(IOException e)    
        {
            System.out.println("Error2!");
        }
    }   

    public static void main(String[] args) 
    {
        Test t=new Test();
    }
}
4

3 回答 3

8

完成阅读文件后,即在 while 循环之后,您需要关闭阅读器。目前,您在阅读第一行后关闭它,这会IOException: Stream closed在它尝试阅读第二行时导致“”。

改成:

while((s=br.readLine())!=null)
{
    strtok=new StringTokenizer(s," ");
    while(strtok.hasMoreTokens())
    {
        bw.write("\n"+strtok.nextToken());
    }
    //br.close(); <----- move this to outside the while loop
}
br.close();
于 2012-10-03T17:14:47.133 回答
2

您最大的失败是将循环放在br.close();内部while():每次写入文件时都告诉计算机立即关闭它,因此文件保持关闭状态,并且计算机在循环的下一次迭代/执行期间永远找不到它。但是,我已将初始程序编辑为:

import java.io.*;
import java.util.StringTokenizer;

public class Test
{
    private FileReader fr;
    private BufferedReader br;
    private FileWriter fw;
    private BufferedWriter bw;
    private StringTokenizer strtok;
    private String s;

    //constructor
    public Test()  
    {
        try
        {
            fw=new FileWriter("criteria.txt", true);
            bw=new BufferedWriter(fw);

            try
            {
                fr=new FileReader("criteria.txt");
                br=new BufferedReader(fr);

                **while((s=br.readLine())!=null)
                {
                    strtok=new StringTokenizer(s," ");
                    while(strtok.hasMoreTokens())
                    {
                        bw.write("\n"+strtok.nextToken());
                    }

                }
                     br.close();
            }**
            catch(FileNotFoundException e)
            {
                System.out.println("File was not found!");
            }
            catch(IOException e)    
            {
                System.out.println("No file found!");
            }
            bw.close();
        }
        catch(FileNotFoundException e)
        {
            System.out.println("Error1!");
        }
        catch(IOException e)    
        {
            System.out.println("Error2!");
        }
    }   

    public static void main(String[] args) 
    {
        Test t=new Test();
    }
}

在这种情况下,文件存在的文件夹或目录无关紧要,因为程序将在与 java 程序相同的文件夹中创建一个名为“criteria.txt”的新文件;但是,您必须使用文本编辑器打开文件以添加/附加一些数据,因为该文件最初是空白的。程序的后续运行现在会将已插入的内容作为连接字符串附加到新行上。每次运行程序时都会产生一个新行。希望这可以帮助。

于 2012-10-13T00:15:27.450 回答
0

在我看来,你不能那样做。您不能同时打开同一个文件进行读写。您必须打开文件信息并将其保存在数据结构中,然后将其关闭。然后您必须使用内存中的数据结构并打开文件以写入结果。当你写完你应该关闭它。

于 2012-10-03T21:51:34.450 回答