Проблема в том, что char
не подписано, а byte
подписано.В основном, где находится определенный символ (0xffff
), который отображается на -1
при преобразовании в байт.Именно поэтому метод read()
в InputStream возвращает целое число, даже если вы получаете байт или символ.
Один из способов решения этой проблемы - проверить, вернул ли read()
-1
перед преобразованиемэто байт или символ.Затем, если read()
вернет -1
, вы можете выбросить EOFException и поймать это.например,
int cur = fileInputStream.read();
if(cur == -1) {
throw new EOFException("End of input reached");
}else {
return (char) cur;
}
Однако перехват исключений не предназначен для указания того, что операция завершилась нормально.Один из способов справиться с этим, который избегает этого, заключается в буферизации символа / байта и добавлении метода available()
, как показано ниже.
public class FileInputHelper implements Closeable {
private FileInputStream fileInputStream;
private BufferedReader fileBufferedReader;
private int next;
public FileInputHelper(File file) throws IOException {
fileInputStream = new FileInputStream(file);
fileBufferedReader = new BufferedReader(
new InputStreamReader(fileInputStream));
next = fileInputStream.read();
}
public byte readByte() throws IOException {
int cur = next;
next = fileInputStream.read();
if(cur == -1) {
throw new IOException("End of file reached");
}
return (byte) cur;
}
public char read() throws IOException {
int cur = next;
next = fileInputStream.read();
if(cur == -1) {
throw new IOException("End of file reached");
}
return (char) cur;
}
public String readLine() throws IOException {
return fileBufferedReader.readLine();
}
@Override
public void close() throws IOException{
fileInputStream.close();
}
// Returns true if there are more chars / bytes to read.
public boolean available() {
return next != -1;
}
}
Это будет иметь проблемы с тем, как файл читается, если вы используетеоба метода read()
/ readByte()
и readLine()
, так что имейте это в виду.