逐字节读取二进制文件

时间:2014-08-19 08:34:44

标签: java io binaryfiles

我一直在研究一个没有成功的java问题。我在StackOverflow上阅读了大量类似的问题,但解决方案似乎没有按预期工作。

我正在尝试逐字节读取二进制文件。

我用过:

while ((data = inputStream.read()) != -1) 

...循环

for (int i = 0; i < bFile.length; i++) {

...循环

但我只得到空或空白输出。我正在尝试阅读的文件的实际内容如下:

  

¬íssrassignment6.PetI¿Z8kyQŸIageD weightL namet Ljava / lang / String; xp&gt; @ 4 t andysq~ @bÀtsimbasq~ @It wolletjiesq~
  @ $ t rakker

我只是试图以字节为单位读取它并将其提供给具有以下行的字符数组:

char[] charArray = Character.toChars(byteValue);

此处的字节值表示它正在读取的字节的int。

哪里出了什么问题?

4 个答案:

答案 0 :(得分:2)

由于java 7不需要逐字节读取,因此Files中有两个实用功能:

Path path = Paths.get("C:/temp/test.txt");

// Load as binary:
byte[] bytes = Files.readAllBytes(path);
String asText = new String(bytes, StandardCharset.ISO_8859_1);

// Load as text, with some Charset:
List<String> lines = Files.readAllLines(path, StandardCharsets.ISO_8859_1);

如果您想阅读二进制数据,可以使用readAllBytes

字符串和字符用于文本。与许多其他编程语言相反,这意味着Unicode,因此可以组合世界上的所有脚本。 char为16位,而不是8位byte

对于纯ASCII,Unicode / UTF-8的7位​​子集,字节和char值是相同的。

然后你可能已经完成了以下(低质量代码):

int fileLength = (int) path.size();
char[] chars = new char[fileLength];
int i = 0;
int data;
while ((data = inputStream.read()) != -1) {
    chars[i] = (char) data; // data actually being a byte
    ++i;
}
inputStream.close();

String text = new String(chars);

System.out.println(Arrays.toString(chars));

你遇到的问题可能与java中笨重的固定大小数组有关,并且char[]仍然不是String

对于二进制使用,因为您似乎正在读取序列化数据,您可能希望转储该文件:

int i = 0;
int data;
while ((data = inputStream.read()) != -1) {
    char ch = 32 <= data && data < 127 ? (char) data : ' ';
    System.out.println("[%06d] %02x %c%n", i, data, ch);
    ++i;
}

转储文件位置,十六进制值和字符值。

答案 1 :(得分:0)

这是一个简单的例子:

   public class CopyBytes {
    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("xanadu.txt");
            out = new FileOutputStream("outagain.txt");
            int c;

            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

如果你想阅读文字(字符) - 使用读者,如果你想读取字节 - 使用Streams

答案 2 :(得分:0)

为什么不使用Apache Commons:

byte[] bytes = IOUtils.toByteArray(inputStream);

然后你可以把它转换为char:

String str = new String(bytes); 
Char[] chars = str.toCharArray();

或者像你一样:

char[] charArray = Character.toChars(bytes);

反序列化对象:

List<Object> results = new ArrayList<Object>();
FileInputStream fis = new FileInputStream("your_file.dat");
ObjectInputStream ois = new ObjectInputStream(fis);

try {
    while (true) {
        results.add(ois.readObject());
    }
} catch (OptionalDataException e) {
    if (!e.eof) throw e;
} finally {
    ois.close();
}

答案 3 :(得分:0)

编辑: 使用file.length()作为数组大小,并创建一个字节数组。然后是inputstream.read(b)。 再次编辑:如果你想要字符,使用inputstreamreader(fileinputstream(file),charset),它甚至还带有字符集。