Java 读取文件(按位),然后再次写入文件

Java 读取文件(按位),然后再次写入文件,java,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 input

我不知道如何使用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);
    }
所以我不明白为什么会有负数?为什么当我想转换回我得到这个65***

如果我想将这些字节转换成字符,使用它们并再次写入文件,可能我必须读取不同的内容

谢谢

所以我不明白为什么会有负数

在Java中。因此,您看到的是负值。您可以使用
0xff&fileBits[q]
将其转换为0到256之间的整数值

为什么当我想换回来的时候我会得到这个65***

除非字节恰好是ASCII兼容编码中ASCII字符字符串的一部分,否则将字节转换为字符是没有意义的。结果是Java将字节的第一位扩展为16位值。如果恰好设置了第一位(即数字为负数),则结果将是一个高16位数字,通常为
65xxx


一切正常,只需将字节分配给图像处理/显示功能即可。请注意,您的函数很容易出错,因为如果在读取文件时文件大小发生更改,它将不必要地失败。如果要读取字符串,请使用对象,例如。

尝试将其包装到InputStreamReader中。这可以很好地处理角色。如果我需要处理角色,你建议我应该怎么做?有什么方法可以转换吗?是的,使用
读卡器
。更新了答案。如果我使用此选项,如何再次转换为字节:0xf&fileBits[q]Oops,答案中有一个错误;我的意思是
0xff&
,而不是
0xf
。你不需要再把它转换回来;原始的
文件位[q]
已经是正确的表示形式。但是,如果您确实必须将该int转换为字节,只需将其转换为
字节
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