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、2 行目を読み取ろうとすると " " が発生します。

への変更:

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 に答える