Lire un fichier binaire dans android
J'ai créé un objet personnalisé de type Task
et je veux l'enregistrer dans un fichier binaire dans la mémoire de stockage interne. Ici, c'est la classe que j'ai créé:
public class Task{
private String title;
private int year;
private int month;
private int day;
private int hour;
private int minute;
public Task(String inputTitle, int inputYear, int inputMonth, int inputDay, int inputHour, int inputMinute){
this.title = inputTitle;
this.year = inputYear;
this.month = inputMonth;
this.day = inputDay;
this.hour = inputHour;
this.minute = inputMinute;
}
public String getTitle(){
return this.title;
}
public int getYear(){
return this.year;
}
public int getMonth(){
return this.month;
}
public int getDay(){
return this.day;
}
public int getHour(){
return this.hour;
}
public int getMinute(){
return this.minute;
}
}
Dans une activité, j'ai créé une méthode qui permettra de sauver mon objet dans un fichier. C'est le code que j'ai utilisé:
public void writeData(Task newTask){
try {
FileOutputStream fOut = openFileOutput("data",MODE_WORLD_READABLE);
fOut.write(newTask.getTitle().getBytes());
fOut.write(newTask.getYear());
fOut.write(newTask.getMonth());
fOut.write(newTask.getDay());
fOut.write(newTask.getHour());
fOut.write(newTask.getMinute());
fOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
}
Maintenant, je voudrais créer une méthode qui va extraire les données du fichier. En lisant sur internet, beaucoup de gens utilisent FileInputStream
mais j'ai de la difficulté à extraire les octets d'elle et de savoir combien de temps une Chaîne de caractères peut être. En outre, j'ai utilisé une méthode simple pour trouver en ligne mais j'ai la permission denied. Comme je l'ai dit, je suis très nouveau à développement Android.
public void readData(){
FileInputStream fis = null;
try {
fis = new FileInputStream("data");
System.out.println("Total file size to read (in bytes) : "
+ fis.available());
int content;
while ((content = fis.read()) != -1) {
//convert to char and display it
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Toute aide sera appréciée.
OriginalL'auteur miszu | 2014-02-16
Vous devez vous connecter pour publier un commentaire.
Pour les problèmes d'autorisation, je vous encourage à utiliser un stockage externe comme une carte SD.
vous pouvez créer un dossier et enregistrer vos fichiers. Vous pouvez également utiliser "/data/local/" si votre système permet à l'utilisateur les fichiers à sauvegarder.
Vous pouvez vous référer à ce page sur les différentes façons que vous pouvez enregistrer des fichiers de stockage interne et externe,
Pour le deuxième problème, je vous suggère d'utiliser DataInputStream,
Vous pouvez coder quelque chose comme cela,
Vous pouvez également Utiliser Serializable interface pour la lecture et l'écriture des objets sérialisables. En fait, j'ai utilisé cette fois quand j'ai essayé d'écrire directement les valeurs des données pour les fichiers au lieu de traditionnelle des bases de données (Dans mon tout premier de premier cycle des années, je n'étais pas familier avec les bases de données). Un bon exemple est ici,
Comme je l'ai mentionné précédemment, vous pouvez enregistrer dans /data/local la plupart du temps, il est accessible en mode utilisateur. Si vous souhaitez un répertoire personnalisé, vous avez à la racine du téléphone et de modifier les autorisations du répertoire. sinon, vous devrez utiliser les données de la région affecté à l'application. developer.android.com/training/basics/data-storage/files.html et aussi developer.android.com/training/basics/data-storage/index.html
OriginalL'auteur P basak
De ce que je vois, vous êtes à essayer de vider le contenu de l'objet dans un fichier et ensuite le lire. Mais la façon dont vous le faites maintenant, c'est juste l'écriture de toutes les données dans le fichier, sans aucune structure, qui est une idée terrible.
Je vous conseillerais d'essayer de mettre en œuvre la L'interface Serializable puis il suffit d'utiliser la writeObject() et readObject() méthodes.
Sinon, vous pouvez générer les données dans un fichier XML ou quelque chose qui a une structure.
OriginalL'auteur Vlad Schnakovszki
Android constitue une structure de répertoire pour chaque application exactement pour ce genre de données. Vous n'avez pas besoin de permissions spéciales pour y accéder. Le seul inconvénient (qui est généralement une bonne mise en garde), c'est que seulement votre application peut accéder. (Ce principe fait partie de la sécurité qui empêche les autres apps de faire de mauvaises choses pour vous.)
Si cette rencontre vous avez besoin pour le stockage, il suffit d'appeler
getFilesDir()
à partir de quel que soit le contexte est facilement disponible (généralement votre activité). Il ressemble dans votre cas, vous voulez passer par le contexte comme un paramètre dereadData()
etwriteData()
. Ou vous pouvez appelergetFilesDir()
pour obtenir le répertoire de stockage et de passer ensuite que tant que paramètre àreadData()
etwriteData()
.Une mise en garde d'autres (appris à la dure). Bien que les sans-papiers, j'ai trouvé que, parfois, Android va créer des fichiers dans ce répertoire de l'application. Je recommande fortement que plutôt que de stocker des fichiers directement dans ce dossier de l'application vous au lieu de créer votre propre répertoire de stockage dans le répertoire de l'application retourné par
getFilesDir()
, puis stocker vos fichiers. De cette façon, vous n'aurez pas à vous soucier d'autres fichiers qui peuvent se présenter, par exemple, si vous essayez à la liste des fichiers dans le répertoire de stockage.(Je suis d'accord avec P basak que
DataInputStream
etDataOutputStream
sont votre meilleure option pour la lecture et l'écriture des données. Je disrecommend la Sérialisation, sauf dans un très petit ensemble d'applications où la portabilité est un facteur car il est très inefficace. Dans mon cas, les objets qui a pris 15 secondes pour charger via la Sérialisation chargé en moins de 2 secondes à l'aide d'DataInputStream
.)OriginalL'auteur TechnalyticSteve