java - 为什么我的程序中的错误和输出消息会更改它们在每次运行时出现的顺序?

标签 java netbeans-7

我使用 netbeans 7 作为 IDE。几乎每次我运行代码时,都不会更改我正在操作的代码或文件 - 错误消息会出现在输出的不同部分中。为什么会发生这种情况以及它将如何影响我的编码?

例如在一次运行中:

the  character read at switch Dictionary is:  d
this is the length  8
buffered string is  announce
the  character read at switch decodeString is:  3
this is the length  36
buffered string is  http://bt1.archive.org:6969/announce
this is the length  13
buffered string is  announce-list
the  character read at switch List is:  l
the  character read at switch decodeString is:  3
this is the length  36
buffered string is  http://bt1.archive.org:6969/announce
Exception in thread "main" java.io.IOException: Problem parsing bencoded file
the  character read at switch decodeString is:  3
this is the length  36
buffered string is  http://bt2.archive.org:6969/announce
list object -------------->http://bt1.archive.org:6969/announce
list object -------------->http://bt2.archive.org:6969/announce
    at javaapplication1.DotTorrentBencodeReader.Decode(DotTorrentBencodeReader.java:61)
this is the length  7
buffered string is  comment
the  character read at switch decodeString is:  6
this is the length  692
    at javaapplication1.DotTorrentBencodeReader.decodeDictionary(DotTorrentBencodeReader.java:82)
    at javaapplication1.DotTorrentBencodeReader.Decode(DotTorrentBencodeReader.java:46)
    at javaapplication1.DotTorrentBencodeReader.decodeDictionary(DotTorrentBencodeReader.java:82)
    at javaapplication1.DotTorrentBencodeReader.Decode(DotTorrentBencodeReader.java:46)
    at javaapplication1.DotTorrentBencodeReader.main(DotTorrentBencodeReader.java:26)
buffered string is  This content hosted at the Internet Archive at http://archive.org/details/dopapod2014-02-25.elam260.sbd.flac
Files may have changed, which prevents torrents from downloading correctly or completely; please check for an updated torrent at http://archive.org/download/dopapod2014-02-25.elam260.sbd.flac/dopapod2014-02-25.elam260.sbd.flac_archive.torrent
Note: retrieval usually requires a client that supports webseeding (GetRight style).
Note: many Internet Archive torrents contain a 'pad file' directory. This directory and the files within it may be erased once retrieval completes.
Note: the file dopapod2014-02-25.elam260.sbd.flac_meta.xml contains metadata about this torrent's conte
this is the length  10
buffered string is  created by
the  character read at switch decodeString is:  1
this is the length  15
buffered string is  ia_make_torrent
this is the length  13
buffered string is  creation date
the  character read at switch Number is:  i
this is the length  4
buffered string is  info
the  character read at switch Dictionary is:  d
this is the length  11
buffered string is  collections
the  character read at switch List is:  l
this is the length  6
buffered string is  org.ar

以及下一次运行:

    the  character read at switch Dictionary is:  d
    this is the length  8
    buffered string is  announce
    the  character read at switch decodeString is:  3
    this is the length  36
    buffered string is  http://bt1.archive.org:6969/announce
    this is the length  13
    buffered string is  announce-list
    the  character read at switch List is:  l
    the  character read at switch decodeString is:  3
    this is the length  36
    buffered string is  http://bt1.archive.org:6969/announce
    the  character read at switch decodeString is:  3
    this is the length  36
    buffered string is  http://bt2.archive.org:6969/announce
    list object -------------->http://bt1.archive.org:6969/announce
    list object -------------->http://bt2.archive.org:6969/announce
    Exception in thread "main" java.io.IOException: Problem parsing bencoded file
        at javaapplication1.DotTorrentBencodeReader.Decode(DotTorrentBencodeReader.java:61)
    this is the length  7
    buffered string is  comment
    the  character read at switch decodeString is:  6
    this is the length  692
    buffered string is  This content hosted at the Internet Archive at http://archive.org/details/dopapod2014-02-25.elam260.sbd.flac
    Files may have changed, which prevents torrents from downloading correctly or completely; please check for an updated torrent at http://archive.org/download/dopapod2014-02-25.elam260.sbd.flac/dopapod2014-02-25.elam260.sbd.flac_archive.torrent
    Note: retrieval usually requires a client that supports webseeding (GetRight style).
    Note: many Internet Archive torrents contain a 'pad file' directory. This directory and the files within it may be erased once retrieval completes.
    Note: the file dopapod2014-02-25.elam260.sbd.flac_meta.xml contains metadata about this torrent's conte
    this is the length  10
    buffered string is  created by
    the  character read at switch decodeString is:  1
    this is the length  15
    buffered string is  ia_make_torrent
    this is the length  13
    buffered string is  creation date
    the  character read at switch Number is:  i
    this is the length  4
    buffered string is  info
    the  character read at switch Dictionary is:  d
    this is the length  11
    buffered string is  collections
        at javaapplication1.DotTorrentBencodeReader.decodeDictionary(DotTorrentBencodeReader.java:82)
    the  character read at switch List is:  l
    this is the length  6
    buffered string is  org.ar
        at javaapplication1.DotTorrentBencodeReader.Decode(DotTorrentBencodeReader.java:46)
        at javaapplication1.DotTorrentBencodeReader.decodeDictionary(DotTorrentBencodeReader.java:82)
        at javaapplication1.DotTorrentBencodeReader.Decode(DotTorrentBencodeReader.java:46)
        at javaapplication1.DotTorrentBencodeReader.main(DotTorrentBencodeReader.java:26)
    Java Result: 1

`

我的代码:

`

package javaapplication1;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class DotTorrentBencodeReader {

    public static BufferedInputStream bufferedDotTorrrentFile;
    public static Map<String, Object> dotTorrentDictionary;

    public static void main(String[] args) throws FileNotFoundException, IOException {

        bufferedDotTorrrentFile = new BufferedInputStream(new FileInputStream("/home/user/dopapod.torrent"));
        dotTorrentDictionary = new LinkedHashMap<String, Object>();
        Decode(bufferedDotTorrrentFile);
        //  printDictionary();
    }

    public static Object Decode(BufferedInputStream bufferedDotTorrrentFile) throws IOException {

        bufferedDotTorrrentFile.mark(0);

        char theCharacterRead = (char) bufferedDotTorrrentFile.read();

        switch (theCharacterRead) {
            case 'i':
                System.out.println("the  character read at switch Number is:  " + theCharacterRead);
                return decodeNumber(bufferedDotTorrrentFile);

            case 'l':
                System.out.println("the  character read at switch List is:  " + theCharacterRead);
                return decodeList(bufferedDotTorrrentFile);
            case 'd':
                System.out.println("the  character read at switch Dictionary is:  " + theCharacterRead);
                return decodeDictionary(bufferedDotTorrrentFile);
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                bufferedDotTorrrentFile.reset();
                System.out.println("the  character read at switch decodeString is:  " + theCharacterRead);
                return decodeString(bufferedDotTorrrentFile);
            default:
                throw new IOException("Problem parsing bencoded file");

        }

    }

    public static Map decodeDictionary(BufferedInputStream bufferedDotTorrrentFile) throws IOException {

        bufferedDotTorrrentFile.mark(0);

        char readChar = (char) bufferedDotTorrrentFile.read();

        while (readChar != 'e') {

            if (readChar < 0) {

                throw new IOException("Unexpected EOF found");
            }

            bufferedDotTorrrentFile.reset();

            dotTorrentDictionary.put(decodeString(bufferedDotTorrrentFile), Decode(bufferedDotTorrrentFile));

            bufferedDotTorrrentFile.mark(0);

            readChar = (char) bufferedDotTorrrentFile.read();

        }

        return dotTorrentDictionary;

    }

    public static String decodeString(BufferedInputStream bufferedDotTorrrentFile) throws IOException {
        char readChar = (char) bufferedDotTorrrentFile.read();

        StringBuilder bufferedStringLength = new StringBuilder();

        do {

            if (readChar < 0) {
                throw new IOException("Unexpected EOF found");
            }

            bufferedStringLength.append(readChar);
            readChar = (char) bufferedDotTorrrentFile.read();

        } while (readChar != ':');

        System.out.println("this is the length  " + bufferedStringLength.toString().replaceAll("\\D+", ""));

        int eye = Integer.parseInt(bufferedStringLength.toString().replaceAll("\\D+", ""));

        StringBuilder bufferedString = new StringBuilder();

        int i = 0;

        while (i < eye) {

            bufferedString.append(((char) bufferedDotTorrrentFile.read()));
            i++;
        }
        System.out.println("buffered string is  " + bufferedString);
        return bufferedString.toString();

    }

    public static Long decodeNumber(BufferedInputStream bufferedDotTorrrentFile) throws IOException {

        char readChar = (char) bufferedDotTorrrentFile.read();

        StringBuilder bufferedNumber = new StringBuilder();

        do {

            if (readChar < 0) {
                throw new IOException("Unexpected EOF found");
            }

            bufferedNumber.append(readChar);
            readChar = (char) bufferedDotTorrrentFile.read();

        } while (readChar != 'e');

        return Long.parseLong(bufferedNumber.toString());

    }

    public static List decodeList(BufferedInputStream bufferedDotTorrrentFile) throws IOException {

        List listObject = new LinkedList();

        bufferedDotTorrrentFile.mark(0);

        if (((char) bufferedDotTorrrentFile.read()) == 'l') {
            bufferedDotTorrrentFile.reset();
            char readChar;

            while ((readChar = (char) bufferedDotTorrrentFile.read()) == 'l') {


                listObject.add(Decode(bufferedDotTorrrentFile));
                bufferedDotTorrrentFile.read();


            }
            for (int i = 0; i < listObject.size(); i++) {
                System.out.println("list object -------------->" + listObject.get(i));
            }
        }
        return listObject;
    }

    public static void printDictionary() {

        for (Map.Entry<String, Object> entry : dotTorrentDictionary.entrySet()) {
            System.out.println(entry.getKey() + ": \n" + entry.getValue());

        }
        System.out.println(DotTorrentReaderThree.listObject.get(0));
    }

}
`

最佳答案

因为 Netbeans(或 shell)将使用两个不同的线程来读取每个流:1 个用于错误,1 个用于输出。因此,无法保证每个线程将如何调度(以及打印的输出)!

这两个线程都在竞争将文本附加到控制台,并且通常输出流将在出现换行符时刷新()。这就是为什么错误行和输出文本交错的原因。

我可能还应该说,使用两个线程的原因是因为如果没有可用数据,从流中读取通常会阻塞线程。因此,如果仅使用一个线程从输出和错误中读取数据,则即使在错误时数据可用,它也可能会阻止尝试从输出中读取数据(当没有可用的输出数据时)。

关于java - 为什么我的程序中的错误和输出消息会更改它们在每次运行时出现的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22239947/

相关文章:

Java 包。每个文件不能使用多个包

java - 在 Java 中获取 StackOverFlowError

java - 如何在 java netbeans 中保存包含组合框和文本框的 jpanel?

java - 如何使用java声明 "anything"?

java - 如何将一些默认字体安装到在 Docker 中运行的 Openjdk 8

java - 在 J2ME 中拆分文本

java - RED5 RTMPConnManager 不设置 applicationContext 局部变量。这会导致 NullPointerException

java - 如何更改片段内的汉堡颜色?

java - 网络应用程序。 Java EE。我应该在哪里初始化我的业务逻辑?

java - SAAJ 与 MTOM + XOP 兼容吗?