日期:2014-05-20  浏览次数:20761 次

IO死循环问题求教
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)内容稍微多一点(或则这个程序重复执行几次),就会出现死循环问题。
求解怎么会出现这样结果。

------解决方案--------------------
读了写,写了读.....可能是这样造成的
------解决方案--------------------
br.close();
bw.close();你应该想想这两句应该放在哪呢???你在一个循球里先读后写,再读,当你下次读的时候,BufferedWriter 是没有关闭的,所以跟本写不于是去啊,读出来的还是原来的东西,所以老是不为空。。。反正我是这么想的,对不对我不知道,你试一下吧
------解决方案--------------------
如果文件大的话,应该是你读取文件的速度和往文件里写内容的速度是一样的要不就没有往里写内容的时候快,这样就容易出现死循环,如果是重复执行的话有可能是线程抢占CPU时间片的问题,这个试着用线程同步来解决

建议楼主用俩个文件,如果必须用一个的话,那就用线程同步做一下吧
------解决方案--------------------
就好像2楼说的
while(true){
    读--->写--->读---->写
}

------解决方案--------------------
A从盒子拿一个苹果,然后放进去,在从里面拿一个苹果,在放进去!以前我记录产生的流水好的时候碰到过这个问题。解决办法还是用4楼的办法解决的
------解决方案--------------------
建议楼主把读出来的数据先存到一个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();
}

}