【问题标题】:How can I know if a BufferedReader is chained with a DataInputStream?我如何知道 BufferedReader 是否与 DataInputStream 链接?
【发布时间】:2012-07-05 20:01:45
【问题描述】:

在一个方法中,我需要一个将 DataInputStream 包装为参数的 BufferedReader。我想这样声明方法:

public void firstPass(BufferedReader inStream){ // some code ... }

但我不知道如何检查 inStream 是否包装了 DataInputStream。

我试过了

public static void firstPass(BufferedReader inStream){
    if (inStream instanceof DataInputStream){

    }       
}

但代码无法编译(Eclispe 不接受代码:“不兼容的条件操作数类型 BufferedReader 和 DataInputStream”)。


为什么需要这个?因为我想使用相同的变量 inStream :

  • BufferedReader 中的方法 readLine()
  • DataInputStream 中的 readDouble() 方法

所以我需要一个链接两个类的流。

我正在使用 Java 7 JDK 编程。

有人可以帮帮我吗?提前致谢。

【问题讨论】:

  • 好吧,装饰器模式的重点是你不关心 InputStream 的实现是什么。为什么需要检查这个?
  • @Tudor感谢您的回答,请检查已编辑的问题。
  • 嗯...但是如果你只得到一个BufferedReader,你怎么能使用底层DataInputStreamreadDouble呢?
  • 这就是我面临的问题:实际上我读取了一个写为文本文件的值文件,但现在我明白我的处理方法不好 => 将其用作文本流,拆分“单词”并使用正确的包装器解析每个单词。
  • 如果你告诉我们你打算如何使用这个BufferedReader,我们可以推荐一个替代方案。

标签: java file java-7


【解决方案1】:

DataInputStream 永远不能是 BufferedReader 的实例 - 它们都位于不同的类层次结构中。

BufferedReader 包装另一个 Reader,而不是 Stream。

您可以使用 InputStreamReader 从 Streams 桥接到 Readers。

从同一个 Reader 读取双精度和行并没有真正意义 - 一个是原始二进制数据,另一个是字符数据。也许您需要阅读双打的文本编码,并使用Double.parseDouble(text) 解析它。

【讨论】:

  • 恐怕不是这个问题。他在问如何检查包装的输入流是否是DataInputStream
  • 他的问题没有意义,因为 is 没有包装的 InputStream,因为 BufferedReader 没有 包装 Streams。
  • 它包装了一个Reader,它可以包装一个InputStream
  • @DNA 我同意你的观点:我应该只处理一个文本文件,然后用好的数字包装器解析。非常感谢:我明白我做了一个不合逻辑的过程:)
  • @Laurent BERNABE 为此使用扫描仪。 docs.oracle.com/javase/6/docs/api/java/util/Scanner.html
【解决方案2】:

A.不可能通过向您的方法添加一个接受 bufferedReader 参数的标志来完成您想要完成的工作

B.目前尚不清楚您如何将 DataInputStream 传递给 BufferedReader(可能是通过 InputStreamReader 对吗?)但无论如何,将 BufferedReader 和 DataInputStream 一起使用似乎是错误的。 BufferedReader 将像使用普通 InputStream 一样使用您的 DataInputStream,所以我不知道您为什么要将 DataInputStream 放在它周围

【讨论】:

  • 是的,我使用 InputStreamReader,如下所示:try (BufferedReader file = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream(new File(name)))))) {
  • DataInputStream 在那里做什么?如果你丢掉它会发生什么? ;)
  • @PeterLawrey 我丢失了 DataInputStream,因为 BufferedReader 位于流链的顶部,并且我将此 BufferedReader 传递给了该方法。
  • 您可以使用反射将其取回,但您返回的将处于未知状态,即如果您正在尝试这样做,您将无法使用它来读取数据。正如我一直说的,你不能安全地将 BufferedReader 和 DataInputStream 混合在同一个流上。
  • 是的,我会听从您的建议:请参阅我对您上述回复之一的评论。
【解决方案3】:

DataInputStream 类不是 BufferedReader 类的子类型

class DataInputStream extends FilterInputStream implements DataInput {}

class BufferedReader extends Reader {}

更多信息:

【讨论】:

    【解决方案4】:

    BufferedReader 不是DataInputStream 的子类,所以你的错误是合乎逻辑的......

    【讨论】:

      【解决方案5】:

      BufferedReaders 用于文本数据,DataInputStream 用于二进制数据。除非你喜欢混淆别人,否则你永远不会把一个和另一个包裹起来。

      您可以使用 DataInputStream 来包装 BufferedInputStream(以其他方式包装它没有任何意义)

      您可以将 BufferedReader 包裹在 InputStreamReader 周围,但没有简单的方法可以确定这已完成。

      你可以写

      BufferedReader br = new BufferedReader(new FileReader(name));
      

      但您必须使用反射库来确定 BufferedReader 包装的内容。

      【讨论】:

      • 但是通过链式构造函数,您可以将DataInputStream 包装在BufferedReader 中。他在问如何检查包装的输入流是否确实是DataInputStream
      • 你可以做很多没有意义的事情,这就是其中之一。也许他正在寻找代码中的错误,但这不是最好的方法。
      • @PeterLawrey 我同意你的看法。如果我遇到这样一个错误的过程,那是因为我虽然对主要问题的解决方案不好 => 读取 OBJ 文件。我需要以不同的方式处理,并忽略 DataInputStream。
      • 如果OBJ文件是文本,试试我上面给你的例子。
      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      相关资源
      最近更新 更多