在Java中读取和写入同一文件

在Java中读取和写入同一文件,java,file-io,Java,File Io,我想从criteria.txt文件中读取标记,并在同一文件的末尾附加标记。程序引发异常:未找到任何文件

我想从
criteria.txt
文件中读取标记,并在同一文件的末尾附加标记。程序引发异常:
未找到任何文件
这是我的密码:

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();
    }
}

您需要在完成文件读取后(即在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();
while((s=br.readLine())!=null)
{
strtok=新的StringTokenizer(“”);
while(strtok.hasMoreTokens())
{
write(“\n”+strtok.nextToken());
}

//br.close()在我看来,你不能这样做。你不能同时打开同一个文件进行读写。你必须在数据结构中打开并保存文件信息,然后关闭它。然后你必须在内存中使用数据结构并打开文件写入结果。当你完成写操作时,你应该关闭它。

t撤消是将
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();
    }
}

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

如果您使用Eclipse,文件需要位于项目的根目录中。您应该打印堆栈跟踪以查找有问题的代码行。@Doug Ramsey它位于项目的根目录中,而不是just“criteria.txt”,将文件的实际位置放在文件系统上,如“E:\\criteria.txt”。请为criteria.txt提供一个用例(之前和之后)。我不明白您想做什么。如果criteria.txt是“a=5”,您想创建一个“a=5a=5”的文件因为你在附加你刚读到的标记。很明显我遗漏了一些东西,所以请提供一个例子。