从文件中读取(按位)然后再次写入文件

时间:2012-04-01 14:04:36

标签: java

我无法理解使用I / O.

我正在使用此代码从文件中读取:

if (file.length() > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("File is too large: " + file.length());
}

int len = (int) file.length();
System.out.println("failo dydis yra = "+len);
FileInputStream inputStream = new FileInputStream(file);

try {
    byte[] fileBits = new byte[len];
    for (int pos = 0; pos < len;) {
        int n = inputStream.read(fileBits, pos, len - pos);

        if (n < 0) {
            throw new EOFException();
        }
        pos += n;

    }
    for(int q=0; q<len; q++){
        char ch = (char)fileBits[q];
        int sk = (int)ch;
        System.out.println("symbol = "+fileBits[q]+" - "+ch+" - "+sk);
    }

当我读取txt文件时,一切都很好但是当我读取不是txt例如图像时,我得到了类似的结果:

symbol = -78 - ᄇ - 65458
symbol = 52 - 4 - 52
symbol = -91 - ᆬ - 65445
symbol = 80 - P - 80
symbol = -118 - ハ - 65418
symbol = 76 - L - 76
symbol = 122 - z - 122
symbol = 78 - N - 78
symbol = 112 - p - 112
symbol = 97 - a - 97
symbol = 56 - 8 - 56
symbol = -112 - ミ - 65424

所以我无法理解为什么减去?为什么当我想转换回来时,我得到65 ***。

如果我想将这些字节转换为字符,使用它们并再次写入文件,也许我必须阅读不同的内容。

感谢。

1 个答案:

答案 0 :(得分:2)

  

所以我无法弄清楚为什么会有减号?

在Java中,a byte can have values between -128 and 127。因此,您会看到负值。您可以使用0xff & fileBits[q]将其转换为0到256之间的整数值。

  

为什么当我想要转换回来时我得到这个65 ***

将字节转换为char是没有意义的,除非该字节恰好是ASCII兼容编码中ASCII字符串的一部分。会发生什么是Java将字节的第一位扩展为16位值。如果第一个比特恰好被设置(即数字为负),结果将是一个高16位数,通常采用65xxx的形式。

一切正常,只需将字节赋予图像处理/显示功能。请注意,您的函数容易出错,因为如果在您读取文件时文件大小发生变化,它将不必要地失败。如果要阅读字符串,请使用Reader对象,例如InputStreamReader