Je travaille sur un projet de collège où je dois extraire des données de célébrités de l'API TVMaze vers Java.Java DataInputStream Chaîne hors limites: 0
Je stocke les résultats recherchés dans un fichier binaire en utilisant 'DIS' et comme j'ai des objets, je remballe et dépouille le fichier en lecture/écriture.
Je reçois une erreur lorsque j'essaie de recharger le fichier dans la HashMap.
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: index de chaîne hors de la plage: 0
L'erreur est dirigé dans la méthode de charge et Depad Méthode.
Cela a fonctionné pour moi hier, mais pour une raison inconnue, il a cessé de fonctionner.
Enregistrer le code:
private static void save(HashMap<String, ArrayList<Person>> persons) throws IOException
{
try
{
ArrayList<Person> p = convertFileData(persons);
File f = new File("person.dat");
if(!f.exists())
{
f.createNewFile();
}
DataOutputStream dos = new DataOutputStream(new FileOutputStream(f));
Iterator<Person> iter = p.iterator();
while(iter.hasNext())
{
Person s = iter.next();
dos.writeDouble(s.getScore());
dos.writeBytes(pad(s.getQueryName(), 30));
dos.writeBytes(pad(s.getName(), 30));
dos.writeInt(s.getId());
List<String> images = s.getImageUrls();
for(String image : images)
{
dos.writeBytes(pad(image, 80));
}
dos.writeBytes(pad(s.getPersonUrl(), 50));
dos.writeDouble(s.getMyRating());
ArrayList<String> comments = s.getMyComments();
int commentSize = comments.size();
System.out.println(commentSize);
dos.writeInt(commentSize);
for(String comment : comments)
{
dos.writeBytes(pad(comment, 40));
}
}
dos.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
Code charge:
public static HashMap<String, ArrayList<Person>> load() throws FileNotFoundException, IOException
{
File f = new File("person.dat");
HashMap<String, ArrayList<Person>> persons = new HashMap<>();
if(f.exists())
{
DataInputStream dis = new DataInputStream(new FileInputStream(f));
ArrayList<Person> x = new ArrayList<>();
while(dis.available() > 0)
{
double score = dis.readDouble();
System.out.println(score);
byte[] queryNameBytes = new byte[30];
dis.read(queryNameBytes);
String queryName = depad(new String(queryNameBytes));
System.out.println(queryName);
byte[] nameBytes = new byte[30];
dis.read(nameBytes);
String name = depad(new String(nameBytes));
System.out.println(name);
int id = dis.readInt();
System.out.println(id);
ArrayList<String> imageUrls = new ArrayList<>();
byte[] mediumImage = new byte[80];
dis.read(mediumImage);
String mImage = depad(new String(mediumImage));
imageUrls.add(mImage);
byte[] originalImage = new byte[80];
dis.read(originalImage);
String oImage = depad(new String(originalImage));
imageUrls.add(oImage);
System.out.println(imageUrls);
byte[] personLinkBytes = new byte[50];
dis.read(personLinkBytes);
String personLink = depad(new String(personLinkBytes));
System.out.println(personLink);
double myRating = dis.readDouble();
System.out.println(myRating);
ArrayList<String> myComments = new ArrayList<>();
int commentCount = dis.readInt();
System.out.println(commentCount);
for(int i = 0; i < commentCount; i++)
{
byte[] myCommentsBytes = new byte[40];
dis.read(myCommentsBytes);
String myComment = depad(new String(myCommentsBytes));
myComments.add(myComment);
}
System.out.println(myComments);
x.add(new Person(score, queryName, name, id, imageUrls, personLink, myRating, myComments));
persons.put(queryName, x); // -> Add person to Map
}
dis.close();
}
return persons;
}
Code Pad:
public static String pad(String s, int size)
{
while (s.length() < size)
{
s = (char)0 + s;
}
return s;
}
code Depad:
public static String depad(String s)
{
while(s.charAt(0) == (char)0)
{
s = s.substring(1);
}
return s;
}
Oh, d'accord. Merci d'avoir signalé mon défaut. Je ne suis nouveau que pour les flux d'entrée/sortie de données. Merci pour le tuyau! – RidiculousBeans
Content de vous aider! Apprenez à utiliser votre débogueur, et vous trouverez ces types de problèmes beaucoup plus faciles à résoudre. Si vous pouvez accepter ma réponse, vous me feriez aussi un solide. Merci. – DCON
Je vais devoir attendre pour accepter la réponse. J'ai réalisé que la taille de remplissage dans mon code me donne des problèmes. – RidiculousBeans