String sPath = "D:/sqlnet.sql";
String sReader = "";
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sPath)));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(sPath)));while((sReader=br.readLine()) != null){
    System.out.println(sReader);
    bw.write(sReader);
    bw.newLine();
    bw.flush();
}
System.out.println("-------------------------------");br.close();
bw.close();以上是事例代码。
简单的带缓冲区的读写流,只是他的读写对象是同一个文件(sPath),先读,在向这个文件里写。
问题来了,当这个文件(sPath)内容稍微多一点(或则这个程序重复执行几次),就会出现死循环问题。
求解怎么会出现这样结果。

解决方案 »

  1.   

    br.close();
    bw.close();你应该想想这两句应该放在哪呢???你在一个循球里先读后写,再读,当你下次读的时候,BufferedWriter 是没有关闭的,所以跟本写不于是去啊,读出来的还是原来的东西,所以老是不为空反正我是这么想的,对不对我不知道,你试一下吧
      

  2.   

    如果文件大的话,应该是你读取文件的速度和往文件里写内容的速度是一样的要不就没有往里写内容的时候快,这样就容易出现死循环,如果是重复执行的话有可能是线程抢占CPU时间片的问题,这个试着用线程同步来解决建议楼主用俩个文件,如果必须用一个的话,那就用线程同步做一下吧
      

  3.   

    就好像2楼说的
    while(true){
        读--->写--->读---->写
    }
      

  4.   

    debug一下,看看每次循环sReader的内容到底是什么,另外一个潜在问题就是对同一个文件,读写位置有没有影响。把这两个问题先测试一下呗
      

  5.   

    建议楼主把读出来的数据先存到一个List集合中,读完后把输入流关闭,再用输出流关联文件,把集合中的数据写入
    你可以参考下下面这段代码:import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;public class Test { public static void main(String[] args) throws IOException {
    List<String> list = new ArrayList<String>();
    BufferedReader br = new BufferedReader(new FileReader("ddd.txt"));
    String line = null;
    while((line=br.readLine())!=null){
    System.out.println(line);
    list.add(line);
    }
    br.close();
    BufferedWriter bw = new BufferedWriter(new FileWriter("ddd.txt"));
    for(String str : list){
    bw.write(str);
    bw.newLine();
    bw.flush();
    }
    bw.close();
    }}