我无法理解使用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 ***。
如果我想将这些字节转换为字符,使用它们并再次写入文件,也许我必须阅读不同的内容。
感谢。
答案 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
。