O arquivo que estou tentando ler tem esta ordem de tipos: String, String, Int, Int, Double e depois repete!
Provavelmente está lendo errado, para cada ds.read*
crie um System.out.println
para identificar o que está errado. Não tenho como verificar aqui.
Mas no código está lendo
String char char int double
Aparentemente está lendo tudo corretamente! São dados de diversos dias, por isso são tantos.
Saída:
ds.available() : 459
readData : 4/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 20
Pluviometro: 0
Temperatura: 27.0
ds.available() : 429
readData : 5/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 58
Pluviometro: 14
Temperatura: 25.2
ds.available() : 399
readData : 6/1/2018
Direção do vento (char + char): E
Velocidade do vento: 65
Pluviometro: 5
Temperatura: 18.2
ds.available() : 369
readData : 7/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 50
Pluviometro: 13
Temperatura: 17.4
ds.available() : 339
readData : 8/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 17
Pluviometro: 6
Temperatura: 23.0
ds.available() : 309
readData : 9/1/2018
Direção do vento (char + char): W
Velocidade do vento: 64
Pluviometro: 0
Temperatura: 21.0
ds.available() : 279
readData : 10/1/2018
Direção do vento (char + char): E
Velocidade do vento: 27
Pluviometro: 9
Temperatura: 24.6
ds.available() : 248
readData : 11/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 36
Pluviometro: 2
Temperatura: 17.7
ds.available() : 217
readData : 12/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 48
Pluviometro: 18
Temperatura: 22.1
ds.available() : 186
readData : 13/1/2018
Direção do vento (char + char): W
Velocidade do vento: 65
Pluviometro: 1
Temperatura: 17.4
ds.available() : 155
readData : 14/1/2018
Direção do vento (char + char): E
Velocidade do vento: 35
Pluviometro: 4
Temperatura: 22.8
ds.available() : 124
readData : 15/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 12
Pluviometro: 17
Temperatura: 23.0
ds.available() : 93
readData : 16/1/2018
Direção do vento (char + char): W
Velocidade do vento: 37
Pluviometro: 0
Temperatura: 23.6
ds.available() : 62
readData : 17/1/2018
Direção do vento (char + char): NW
Velocidade do vento: 22
Pluviometro: 4
Temperatura: 23.1
ds.available() : 31
readData : 18/1/2018
Direção do vento (char + char): E
Velocidade do vento: 14
Pluviometro: 0
Temperatura: 27.3
Onde está ocorrendo a exceção?
Se for na “String readData = ds.readUTF();” seria impossível imprimir esse resultado pois antes dessa linha tem "System.out.println("ds.available() : “+ds.available());”
Então o final seria:
ds.available() : 31
readData : 18/1/2018
Direção do vento (char + char): E
Velocidade do vento: 14
Pluviometro: 0
Temperatura: 27.3
ds.available() : ?? <-- faltou essa linha
A exceção ocorre justamente nessa linha!
pelo que parece o programa nunca termina de ler o arquivo, porém pelo teste que fizemos antes, ele imprime todo o conteúdo do mesmo!
ds.available() : 459
readData : 4/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 20
Pluviometro: 0
Temperatura: 27.0
ds.available() : 429
readData : 5/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 58
Pluviometro: 14
Temperatura: 25.2
ds.available() : 399
readData : 6/1/2018
Direção do vento (char + char): E
Velocidade do vento: 65
Pluviometro: 5
Temperatura: 18.2
ds.available() : 369
readData : 7/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 50
Pluviometro: 13
Temperatura: 17.4
ds.available() : 339
readData : 8/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 17
Pluviometro: 6
Temperatura: 23.0
ds.available() : 309
readData : 9/1/2018
Direção do vento (char + char): W
Velocidade do vento: 64
Pluviometro: 0
Temperatura: 21.0
ds.available() : 279
readData : 10/1/2018
Direção do vento (char + char): E
Velocidade do vento: 27
Pluviometro: 9
Temperatura: 24.6
ds.available() : 248
readData : 11/1/2018
Direção do vento (char + char): NE
Velocidade do vento: 36
Pluviometro: 2
Temperatura: 17.7
ds.available() : 217
readData : 12/1/2018
Direção do vento (char + char): SE
Velocidade do vento: 48
Pluviometro: 18
Temperatura: 22.1
ds.available() : 186
readData : 13/1/2018
Direção do vento (char + char): W
Velocidade do vento: 65
Pluviometro: 1
Temperatura: 17.4
ds.available() : 155
readData : 14/1/2018
Direção do vento (char + char): E
Velocidade do vento: 35
Pluviometro: 4
Temperatura: 22.8
ds.available() : 124
readData : 15/1/2018
Direção do vento (char + char): SW
Velocidade do vento: 12
Pluviometro: 17
Temperatura: 23.0
ds.available() : 93
readData : 16/1/2018
Direção do vento (char + char): W
Velocidade do vento: 37
Pluviometro: 0
Temperatura: 23.6
ds.available() : 62
readData : 17/1/2018
Direção do vento (char + char): NW
Velocidade do vento: 22
Pluviometro: 4
Temperatura: 23.1
ds.available() : 31
readData : 18/1/2018
Direção do vento (char + char): E
Velocidade do vento: 14
Pluviometro: 0
Temperatura: 27.3
Mas não imprime o “ds.available()” ?
Então acrescente um “catch”:
} catch (EOFException ex) {
// fim
} catch (FileNotFoundException ex) {
Logger.getLogger(ClimaFrame.class.getName()).log(Level.SEVERE, null, ex);
}
Isso deve sumir com a exceção, mas acho que não resolveria o problema
A exceção só ocorria com o código para teste que você sugeriu antes!
while (ds.available() > 0) {
System.out.println("ds.available() : "+ds.available());
String readData = ds.readUTF();
System.out.println("readData : "+readData);
Porém, quando fiz o código para imprimir todos os dados, não ocorre a exceção, somente fica no loop infinito!
while (ds.available() > 0) {
try {
System.out.println("ds.available() : " + ds.available());
String readData = ds.readUTF();
System.out.println("readData : " + readData);
System.out.println("Direção do vento (char + char): " + Character.toString(ds.readChar()) + Character.toString(ds.readChar()));
System.out.println("Velocidade do vento: " + ds.readInt());
System.out.println("Pluviometro: " + ds.readInt());
System.out.println("Temperatura: " + ds.readDouble());
} catch (EOFException fim) {
ds.close();
break;
}
}
Para que complicar tanto, pode usar essa minha classe como base para seu projeto
Esse é um dos melhores jeito de se escrever um arquivo e ler
package com.gleisonmv.engine.util;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
*
* @author Gleison Morgado Vasconcelos
*
*/
public class FileUtil {
/**
* Read context of file
* @param file
*
* */
public static String read(File file)
{
// Current char
int c = -1;
// Build String
StringBuilder sb = new StringBuilder();
try
{
// Read text from file
BufferedReader br = new BufferedReader(new FileReader(file));
// Read
while((c = br.read()) != -1)
{
// Append char in String
sb.append((char) c);
}
// Close the inputstream of file
br.close();
// Return the text
return sb.toString();
}
catch (Exception e)
{
// Error on read file
e.printStackTrace(System.err);
}
// File error not has content
return null;
}
public static void write(File file, String content)
{
// Create the buffered writer
try
{
// Writer of file
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
// Write the content
bw.write(content);
// Flush the writer content
bw.flush();
// Close the writer
bw.close();
}
catch (IOException e)
{
// Error on write the file
e.printStackTrace(System.err);
}
}
}
Cara, agradeço de verdade por isso! mas como é um trabalho pra faculdade, eu provavelmente teria problemas com o professor caso usasse uma classe pra fazer essa leitura! Hahahahaha
mas obrigado de qualquer forma!
Por acaso você não teria nenhum palpite do que poderia estar ocasionando esse loop infinito? é só esse problema que me impede de terminar o trabalho!
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.