i can’t figure out about working with I/O.
I am using this code to read from file:
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);
}
When i read txt file then everything is nice but when i read not txt for example image i get similar result:
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
So i can’t figure why there are minus ? And why when i want to convert back i get this 65***.
Maybe i have to read different if i want to convert these bytes to chars, work with them and write again to file.
Thanks.
In Java, a byte can have values between -128 and 127. Therefore, you’re seeing negative values. You can use
0xff & fileBits[q]to convert that to an integer value between 0 and 256.Converting a byte into a char is meaningless unless the byte happens to be part of a string of ASCII characters in an ASCII-compatible encoding. What happens is that Java extends the byte’s first bit to a 16bit value. If the first bit happens to be set (i.e. the number is negative), the result will be a high 16 bit number, typically in the form of
65xxx.Everything is working fine, just give the bytes to an image processing/display function. Note that your function is error-prone since it will needlessly fail if the file size changes while you’re reading the file. If you want to read a string, use a
Readerobject, for example anInputStreamReader.