Se fosse você usaria a classe Scanner do java, com o fluxo de entrada do arquivo é mais seguro
Então significa que fica repetindo infinitamente IMPRIMINDO os dados e nunca termina ou termina e o programa trava?
Ele imprime todos os dados uma unica vez, mas o programa continua rodando! nunca finaliza a execução nem imprime mas nada!
Então coloca no final do método
System.out.println("Terminou leitura");
Isso quer dizer que o problema não é mais aí.
Se não quiser, pode tentar colocar isso no fim do loop, se ele for -1 na leitura, no lugar de lido = ds.read();
if(ds.available() == 0 || (lido = ds.read()) == -1 ) break;
Fiz a correção, Se no fim da ultima leitura, não existir outra o break para o while e continua a execução do bloco de código
Solucionado! Obrigado pela ajuda!
Se ainda estiverem dispostos a ajudar, me deparei com outra questão agora:
Preciso ler um arquivo binário que contém n objetos serializados dentro do mesmo, e preciso somar os atributos que cada um deles tem para obter médias e etc.
Qual seria a melhor forma de fazer essa leitura?
Segue o código que tentei usar, mas pelo que parece ele só itera uma vez antes de encerrar.
JFileChooser jfc = new JFileChooser();
int returnVal = jfc.showOpenDialog(null);
ClimaDoDia c = null;
ArrayList<ClimaDoDia> objetos = new ArrayList<ClimaDoDia>();
boolean cont = true;
if (returnVal == JFileChooser.APPROVE_OPTION) {
FileInputStream fs = null;
try {
File file = jfc.getSelectedFile();
fs = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fs);
int dias = 0;
int somachuva = 0;
float ventomedio = 0;
while (cont) {
try {
c = (ClimaDoDia) ois.readObject();
if (c != null) {
objetos.add(c);
} else {
cont = false;
}
} catch (EOFException fim) {
ois.close();
break;
}
}
for (ClimaDoDia d : objetos) {
dias++;
somachuva += d.getIndicePluviometrico();
}
System.out.println(somachuva);
System.out.println(dias);
E sem o catch da EOFException, ela é lançada logo após a primeira iteração
Aqui uma forma eficiente de resolver
JFileChooser jfc = new JFileChooser();
// Arquivo selecionado
if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
try {
File file = jfc.getSelectedFile();
FileInputStream fs = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fs);
int dias = 0;
int somachuva = 0;
float ventomedio = 0;
// Enquanto tiver bytes no fluxo de leitura
while(ois.available() != 0) {
Object obj = ois.readObject();
// Verifica se é um objeto valido
if(obj != null && obj instanceof ClimaDoDia) {
// Converte objeto primitivo na instancia da classe
ClimaDoDia d = (ClimaDoDia) obj;
// Incrementa os dias
dias++;
// soma a chuva
somachuva += d.getIndicePluviometrico();
}
}
// Fecha a entrada de dados
ois.close();
// Debug
System.out.println(somachuva);
System.out.println(dias);
} catch (Exception ex) {
// Trata todas as exceções
ex.printStackTrace(System.err);
break;
}
}
``
Muito obrigado Gleison! Sanou todas as dúvidas.