当前位置: 首页 > 面试题库 >

System.out和System.err调用的随机打印顺序

华涵意
2023-03-14
问题内容

请参见下面的代码段

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile {


    public static void main(String[] args)  {

        String str="";
        FileReader fileReader=null;

        try{


            // I am running on windows only  & hence the path :) 
            File file=new File("D:\\Users\\jenco\\Desktop\\readme.txt");
            fileReader=new FileReader(file);
            BufferedReader bufferedReader=new BufferedReader(fileReader);
            while((str=bufferedReader.readLine())!=null){
                System.err.println(str);
            }

        }catch(Exception exception){
            System.err.println("Error occured while reading the file : " + exception.getMessage());
            exception.printStackTrace();
        }
        finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                    System.out.println("Finally is executed.File stream is closed.");
                } catch (IOException ioException) {

                    ioException.printStackTrace();
                }
            }
        }

    }

}

当我多次执行代码时,我会如下随机获得输出,有时System.out语句首先在控制台中打印,有时System.err首先打印。以下是我得到的随机输出

输出1

Finally is executed.File stream is closed.
this is a text file 
and a java program will read this file.

输出2

this is a text file 
and a java program will read this file.
Finally is executed.File stream is closed.

为什么会这样呢?


问题答案:

我相信这是因为您正在写入两个不同的输出(一个是标准输出,另一个是标准错误)。这些可能在运行时由两个不同的线程处理,以允许在Java执行期间同时写入两者。假设是这种情况,cpu任务调度程序将不会每次都以相同的顺序执行线程。

如果您所有的输出都流向相同的输出流(即,一切都输出到标准输出或一切都输出到标准err),则永远不要获得此功能。您将永远无法保证标准错误与标准输出的执行顺序。



 类似资料:
  • 问题内容: 声明为。 但是你可以致电重新分配它。 ??如果是这样怎么可能? (和适用于) 更重要的是,如果你可以对public static final字段进行突变,那么就可以为你提供的保证(如果有)意味着什么?(我从未意识到,也没想到System.in/out/err表现为变量) 问题答案: 通常,最终的静态字段可能不会被修改。然而和是,由于遗留原因,必须允许通过方法来改变最终的静态字段和。我们

  • 问题内容: 我需要将System.out / err.println输出重定向到slf4j。 我知道这不是正确记录日志的方法, 但是有一个外部库记录到System.out 问题答案: 您可以使用sysout-over-slf4j。 sysout-over- slf4j模块允许用户将对System.out和System.err的所有调用重定向到SLF4J定义的记录器,该记录器的名称是在其中进行Sys

  • 问题内容: 我是编码的新手,我最近制作了“十进制到二进制”和“二进制到十进制”转换器,并且我希望raw_input的文本像打字机一样一次键入一个字母,但是这样做之后我会得到None,因为函数不返回任何东西。我不确定如何解决此问题,因为我希望raw_input是一个变量,并且尝试返回内容会给我带来语法错误。任何帮助表示赞赏。 这是重要的部分^ 完整的程序供有兴趣的人使用:http : //paste

  • 有没有一种方法可以让你使用打印给定数组中的元素? 所以输出将是 或者 或

  • 我正在尝试编写一个程序,打印一个2d数组,其中包含100-10000范围内的随机数,并打印出数组中的最大值、平均值和最小值。该程序将询问用户行数和列数,并在该数组中打印随机数。 这是我的代码:

  • 问题内容: 在此问题中, 有一个功能要求,要求使用可选种子进行订购,以允许随机订购。 我需要能够对随机排序的结果进行分页。用Elasticsearch 0.19.1怎么做? 谢谢。 问题答案: 您可以使用唯一字段(例如id)和随机盐的哈希函数进行排序。根据结果​​的真实程度,您可以执行以下原始操作: 或像 第二个示例将产生更多随机结果,但速度会稍慢。 为了使这种方法起作用,必须存储字段。否则,查询