首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataInputStream readLine()

DataInputStream readLine()
EN

Stack Overflow用户
提问于 2014-02-13 12:19:14
回答 2查看 5.8K关注 0票数 3

我需要使用DataInputStream,因为我需要不推荐的readLine()功能,并且我不知道输入文件的确切文件格式(即使用什么行结束),但也需要读取二进制编码原语。

这与这个问题类似:

是否有类在Java中公开未缓冲的readLine方法?

我的建议是用这样的方法

代码语言:javascript
复制
public class SaveDataInputStream extends DataInputStream {
  public SaveDataInputStream(InputStream in) {super(in);}
  public String readLineSave() throws IOException {
    // ???
  }
}

并使用可以在readLine类中找到的DataInputStream ()方法内容(这类似于所提到的问题中接受的答案)。但是,我不完全理解为什么不推荐这个方法,我更希望知道它是否与我的代码相关。

javadoc说:这个方法不能正确地将字节转换成字符.

但这意味着什么呢?我应该担心这一点吗?在最坏的情况下会发生什么呢?是否有可能编写我自己的方法来解决这个问题(效率并不是一个真正的问题)?

提示: new BufferedReader(new InputStreamReader(..));不是正确的答案.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-13 12:41:07

我不是百分之百确定,但我发现了一个与BufferedReader.readLine()相比,该方法工作不正确的例子。下面是代码:

代码语言:javascript
复制
import java.io.*;

public class HelloWorld {
  public static void main(String[] args) throws Exception {
    String s = "喜\n";
    InputStream in = new ByteArrayInputStream(s.getBytes());
    DataInputStream d = new DataInputStream(in);
    System.out.println(d.readLine()); // prints å

    in = new ByteArrayInputStream(s.getBytes());
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    System.out.println(br.readLine()); // prints 喜
  }
}

基本上,DataInputStream根本不处理多字节字符,因为它基本上处理char = (char)in.read();对于每个字符。

基本上,我认为您至少需要一个非常小的缓冲区才能正确读取多字节字符。尽管如此,您可能可以直接在InputStreamReader之上构建自定义方法,而不是BufferedReader,因为这将正确地处理多字节字符。或者,如果您知道您总是要处理ascii,那么使用不推荐的方法可能是安全的。

编辑:还值得注意的是,为了正确处理\r\n行尾,即使是内部的DataInputStream缓冲区也是如此。至少在jdk7中,对\r的处理是:

代码语言:javascript
复制
          case '\r':
            int c2 = in.read();
            if ((c2 != '\n') && (c2 != -1)) {
                if (!(in instanceof PushbackInputStream)) {
                    in = new PushbackInputStream(in);
                }
                ((PushbackInputStream)in).unread(c2);
            }
            break loop;

因此,如果遇到类似\ra的情况,a将未读回推回输入流,该流维护未读字节的内部缓冲区。

票数 3
EN

Stack Overflow用户

发布于 2014-02-13 12:41:07

当他们说readLine()不被推荐,因为它不能正确转换字符时,他们的意思是它不允许您指定字符编码,例如UTF-8和CP1252。这意味着,使用一个字符编码编写的数据很可能会失败,如果读取一个字符,系统默认为不同的字符编码。

你需要担心吗?好的。方法不被推荐用于向开发人员提供警告,说明它可能会在将来消失。尽管如此,根据JavaDoc的说法,readLine()在JDK1.1中被否决了,这是很久以前的事了。

至于您不想要一个BufferedReader,因为缓冲,我想说,不要使用它。使用扩展阅读器的其他类之一,或者,如果您想变得如此极端,则使用自己的类。没有什么能阻止您创建自己的名为DataInputReader的类,跟踪读取原语的方法,并提供适合您需要的适当readLine()实现。

但是,如果您正在读取二进制编码的数据,我建议您完全不要使用读取器,而是坚持使用InputStream,这样您就可以读取原始的byte并自己处理转换。Reader的设计考虑了字符编码的处理,因此倾向于修改您正在阅读的内容,前提是它试图将二进制数据转换为字符串。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21754078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档