如何读取此文件以免字符乱码?

时间:2019-05-01 01:11:16

标签: java hexdump

我尝试使用Java读取文件。该文件没有文件类型。当我使用UltraEdit文本编辑器打开它时,它看起来像这样:文件中的第一行是

00 00 10 01 00 51 21 E4 22 0D 6D F1 81 51 21 E2。

我还检查了UltraEdit中的文件编码格式,它是ANSI。但是如何在00 00 10中读取此文件...以这种方式在控制台上打印数据?

我在Java 1.7中有过日食。我试图在“ GBK”,“ GB2312”,“ UTF-8”中读取该文件,但是没有用。当我试图在“ ANSI”中读取它时,这是错误

错误消息

线程“ main”中的异常java.io.UnsupportedEncodingException:ANSI。

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Deconde{
    public static void main (String []args) throws Exception{
        //File byte stream
        FileInputStream fis=new FileInputStream("D:\\0testData\\Data_21");

        //A bridge of byte streams and character streams that can specify a specified character format
        InputStreamReader isr=new InputStreamReader(fis,"ANSI"); 

        String str=null;

        int c=0;
        while((c=isr.read())!=-1)
            System.out.print((char)c);
            System.out.println("_______________________________________________");

        //Read characters directly, as long as the encoding problem is ok
        BufferedReader br=new BufferedReader(isr);
        str=br.readLine();
        while(str!=null)
        {
            System.out.println(str);
            str=br.readLine();
        }
        System.out.println("______________________________________________________");

        //Use the default encoding of the InputStreamReader, no problem when it is ANSI
        BufferedReader br2=new BufferedReader(new InputStreamReader(fis));
        str=br2.readLine();
        while(str!=null)
        {
            System.out.println(str);
            str=br2.readLine();
        }

    }

}
```

1 个答案:

答案 0 :(得分:0)

我确实在上面问了一个问题,但是我假设您要执行HexDump,请考虑以下程序:

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

public class HexDump {
    public static void main(String[] args) {
        try {
            InputStream isr = new DataInputStream(new FileInputStream("C:\\Temp\\some_file.dat"));
            int bytesPerLine = 16;
            int byteCount = 0;
            int data;
            while ((data = isr.read()) != -1) {
                if (byteCount == 0)
                    System.out.println();
                else if (byteCount % bytesPerLine == 0)
                    System.out.printf("\n", byteCount);
                else
                    System.out.print(" ");

                System.out.printf("%02x", data & 0xff);
                byteCount += 1;
            }
            System.out.println();
        } catch (Exception e) {
            System.out.println("Exception: " + e);
        }
    }    
}

它将获取示例文件并将单个字节转储为十六进制值(每行16个字节)。

正如Stephen所提到的,对于二进制文件,实际上并没有任何形式的编码方案(您建议的类型-例如ANSI等)。这种类型的编码方案适用于文本文件,并告诉您它是ANSI还是UTF-8或UNICODE等,并告诉您如何阅读它。 话虽如此,二进制文件确实暗含了“编码方案”。就二进制文件而言,正如Stephen所提到的,“编码方案”是由写文件的人确定的。实际上对于文本文件也是如此,该程序将确定它是以ANSI,UTF-8还是任何编码方式编写文本文件。 对于二进制文件,“编码方案”可能是JPEG,PNG,GIF,MP3或MP4,ZIP或TAR或成千上万种其他可能性中的任何一种。同样,这取决于编写文件的程序(例如,图像编辑器,音频文件编辑器等)。

我希望这可以帮助您找到答案。