String filename = "phonebook.dat";
String string;
int count = 1;
BufferedReader fileout = new BufferedReader(new FileReader(filename));
while((string = fileout.readLine() ) != null)
{
StringTokenizer tokenzier = new StringTokenizer(string,"\t");
while(tokenzier.hasMoreTokens())
{
stdOut.println("\n********" + count + "********\n");
stdOut.println("Name : " + tokenzier.nextToken());
stdOut.println("Phonenumber : " + tokenzier.nextToken());
stdOut.println("QQ : " + tokenzier.nextToken());
stdOut.println("E-mail : " + tokenzier.nextToken());
stdOut.println("Group : " + tokenzier.nextToken());
count ++;
}
}
String select;
int selection;
BufferedReader br = new BufferedReader(new FileReader(filename));
StringBuilder sb = new StringBuilder();
String s;
while((s = br.readLine()) != null)
sb.append(s + " ");
StringTokenizer tokenizer = new StringTokenizer(sb.toString(),"\t");
ArrayList<String> array = new ArrayList<String>();
while(tokenizer.hasMoreTokens())
array.add(tokenizer.nextToken() + "\t");
stdErr.println("Please input the number of the person who you want to delete : ");    //*********************
select = stdIn.readLine();
selection = Integer.parseInt(select);我的程序时打开一个联系人信息存储的文件,例如:
Uknown   12345678910   123456789   [email protected]   friend  Li Ming  123456  123456  [email protected]  friend ommited………………
每个信息隔一个换行符
然后我按照顺序读取,请注意,问题来了,我竟然奇迹的发现代码中注释为***************的地方竟然提前运行至上面的循环中间了,如:
//Output
********1********Name :   Uknown
Phonenumber :   12345678910
QQ :   123456789
E-mail :   [email protected]
Group :   friendPlease input the number of the person who you want to delete :      //就是这里。本来应该出现在所有信息的后面。结果。********3********Name :  Li Ming
Phonenumber :  123456
QQ :  123456
E-mail :  [email protected]
Group :  friend
我以为是编译器抽风了,就重启了一下,第一次运行时正常者呢。结果第二次又成这样子了。。以前也有遇到过这种提前运行的情况,但是没有太在意 ,请问这到底是怎么一回事啊?怎么解决啊?好纠结。

解决方案 »

  1.   

    在补一点,我刚刚把stdErr.println("Please input the number of the person who you want to delete : ");  
    这一行改为了stdOut.println("omitted...")
    结果又正常了,是输出流和错误输出流的区别吗?请大神解释下,万分感谢。
      

  2.   

    在控制台下运行不会出现此问题。
    我猜测是在eclipse下。
    eclipse跟运行的java程序是两个进程,
    涉及进程间通信的问题,
    不知道eclipse是如何实现的。
      

  3.   

    能不能讲的详细点,我的这段程序运行时会涉及到进程吗?
    麻烦你在看下下面的示例程序,结果和上面一样,我把它简化了一些。
    import java.io.*;
    import java.util.*;
    class huantinglove{
    private static BufferedReader  stdIn =
            new BufferedReader(new  InputStreamReader(System.in));    private static PrintWriter  stdOut =
            new PrintWriter(System.out, true);    private static PrintWriter  stdErr =
            new PrintWriter(System.err, true); public static void main(String[] args)throws IOException{
    stdErr.println("1");
    stdErr.flush();
    stdOut.println("2");
    }
    }
      

  4.   

    能不能讲的详细点,我的这段程序运行时会涉及到进程吗?
    麻烦你在看下下面的示例程序,结果和上面一样,我把它简化了一些。
    import java.io.*;
    import java.util.*;
    class huantinglove{
    private static BufferedReader  stdIn =
            new BufferedReader(new  InputStreamReader(System.in));    private static PrintWriter  stdOut =
            new PrintWriter(System.out, true);    private static PrintWriter  stdErr =
            new PrintWriter(System.err, true); public static void main(String[] args)throws IOException{
    stdErr.println("1");
    stdErr.flush();
    stdOut.println("2");
    }
    }
    2有时候会出现在1的前面运行。
    我的stdErr.flush用的不是很合适。大家无视它吧。。
    来个大神帮帮忙吧
      

  5.   

    我已经知道了,谢了哈。具体原因是下面的:
    两个println走的是两个不同的线程,由于ide运行速度不是很快,比不上pc,导致多线程的时候,打印的东西的顺序是随机的,而且好像很难消除