Java DataInputStream readLine()已弃用

Java DataInputStream readLine()已弃用,java,io,deprecated,readline,datainputstream,Java,Io,Deprecated,Readline,Datainputstream,我需要使用DataInputStream,因为我需要不推荐使用的readLine()功能,并且我不知道输入文件的确切文件格式(即使用的行尾),但还需要读取二进制编码的原语 这与这个问题类似: 我的建议是用这样的东西 public class SaveDataInputStream extends DataInputStream { public SaveDataInputStream(InputStream in) {super(in);} public String readLine

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

这与这个问题类似:

我的建议是用这样的东西

public class SaveDataInputStream extends DataInputStream {
  public SaveDataInputStream(InputStream in) {super(in);}
  public String readLineSave() throws IOException {
    // ???
  }
}
以及使用DataInputStream类中可以找到的readLine()方法内容(这类似于参考问题中的公认答案)。然而,我不完全理解为什么这个方法被弃用,我更想知道它是否与我的代码相关

javadoc说:此方法无法正确地将字节转换为字符。

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


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

我不是100%确定,但我发现与BufferedReader.readLine()相比,该方法工作不正确。代码如下:

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似乎根本不处理多字节字符,因为它基本上在.read()中处理char next=(char);对于每个字符

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

编辑:还值得注意的是,即使是DataInputStream也会在内部缓冲,以便正确处理\r\n行结尾。至少在jdk7中,对\r的处理是:

          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未读回到一个pushback输入流,该输入流保持一个未读字节的内部缓冲区。

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

那么,你需要担心吗?当然方法被弃用,以向开发人员提供警告,指出它可能在将来消失。也就是说,根据JavaDoc,
readLine()
在很久以前的JDK1.1中就被弃用了

至于你因为缓冲而不想要一个
BufferedReader
,我想说的是不要使用它。使用其他扩展类中的一个,或者,如果您想达到这个极限,可以使用自己的类。没有什么可以阻止您创建自己的名为DataInputReader的类,添加读取原语的方法,并提供适当的
readLine()
实现以满足您的需要


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

如果您显示用于编写文件的代码,则更容易了解如何读取该文件。接受此答案,因为它给出了readLine()方法失败的示例。我不确定如何解决转换问题,但由于我的输入仅为ASCII码,因此我并不关心这一问题。