Чтение двоичного файла в android

Я создал пользовательский объект типа Task и я хочу сохранить его в двоичном файле во внутреннем хранилище. Вот класс, который я создал:

 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; } } 

В своей работе я создал метод, который сохранит мой объект в файле. Это код, который я использовал:

 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(); } } 

Теперь я хотел бы создать метод, который будет извлекать данные из файла. Читая в Интернете, многие люди используют FileInputStream но у меня возникают проблемы с извлечением из него байтов и зная, как долго может быть String. Кроме того, я использовал простой метод, найденный в Интернете, но я получил разрешение на отказ. Как я уже сказал, я очень новичок в разработке 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(); } } } 

Любая помощь будет оценена по достоинству.

Для получения разрешений я рекомендую использовать внешнее хранилище, такое как SD-карта.

 Environment.getExternalStorageDirectory() 

Вы можете создать там папку и сохранить свои файлы. Вы также можете использовать «/ data / local /», если ваша система позволяет сохранять файлы пользователя. Вы можете ссылаться на эту страницу о различных способах сохранения файлов во внутреннее и внешнее хранилище,

Для второй проблемы я предлагаю вам использовать DataInputStream ,

 File file = new File("myFile"); byte[] fileData = new byte[(int) file.length()]; DataInputStream dis = new DataInputStream(new FileInputStream(file)); dis.readFully(fileData); dis.close(); 

Вы можете закодировать что-то вроде этого,

 import java.io.*; public class Sequence { public static void main(String[] args) throws IOException { DataInputStream dis = new DataInputStream(System.in); String str="Enter your Age :"; System.out.print(str); int i=dis.readInt(); System.out.println((int)i); } } 

Вы также можете использовать интерфейс Serializable для чтения и записи сериализуемых объектов. Фактически, я использовал это один раз, когда пытался записать значения данных непосредственно в файлы, а не какие-либо традиционные базы данных (в мои первые годы обучения я не был знаком с базами данных). Хороший пример здесь ,

 import java.io.*; import java.util.*; import java.util.logging.*; /** JDK before version 7. */ public class ExerciseSerializable { public static void main(String... aArguments) { //create a Serializable List List<String> quarks = Arrays.asList( "up", "down", "strange", "charm", "top", "bottom" ); //serialize the List //note the use of abstract base class references try{ //use buffering OutputStream file = new FileOutputStream("quarks.ser"); OutputStream buffer = new BufferedOutputStream(file); ObjectOutput output = new ObjectOutputStream(buffer); try{ output.writeObject(quarks); } finally{ output.close(); } } catch(IOException ex){ fLogger.log(Level.SEVERE, "Cannot perform output.", ex); } //deserialize the quarks.ser file //note the use of abstract base class references try{ //use buffering InputStream file = new FileInputStream("quarks.ser"); InputStream buffer = new BufferedInputStream(file); ObjectInput input = new ObjectInputStream (buffer); try{ //deserialize the List List<String> recoveredQuarks = (List<String>)input.readObject(); //display its data for(String quark: recoveredQuarks){ System.out.println("Recovered Quark: " + quark); } } finally{ input.close(); } } catch(ClassNotFoundException ex){ fLogger.log(Level.SEVERE, "Cannot perform input. Class not found.", ex); } catch(IOException ex){ fLogger.log(Level.SEVERE, "Cannot perform input.", ex); } } // PRIVATE //Use Java's logging facilities to record exceptions. //The behavior of the logger can be configured through a //text file, or programmatically through the logging API. private static final Logger fLogger = Logger.getLogger(ExerciseSerializable.class.getPackage().getName()) ; } 

Из того, что я вижу, вы пытаетесь сбросить содержимое объекта в файл и затем прочитать его обратно. Но то, как вы сейчас это делаете, просто записывает все данные в файл без какой-либо структуры, что является ужасной идеей.

Я бы порекомендовал вам попробовать реализовать интерфейс Serializable, а затем просто использовать методы writeObject () и readObject ().

Кроме того, вы могли бы выгрузить данные в файл XML или что-то, что имеет к нему какую-то структуру.

Android предоставляет частную структуру каталогов для каждого приложения для именно такого рода данных. Вам не нужны специальные разрешения для доступа к нему. Единственное предостережение (которое обычно является хорошим предостережением) заключается в том, что только ваше приложение может получить к нему доступ. (Этот принцип является частью безопасности, которая препятствует другим приложениям делать плохие вещи для вас.)

Если это вам необходимо для хранения, просто вызовите getFilesDir () из любого контекста, который легко доступен (обычно ваша активность). Похоже, в вашем случае вы хотели бы передать контекст как параметр readData () и writeData (). Или вы можете вызвать getFilesDir (), чтобы получить каталог хранения, а затем передать это как параметр readData () и writeData ().

Еще одно предостережение (усердно учился). Несмотря на недокументированное, я обнаружил, что иногда Android будет создавать файлы в этом каталоге приложения. Я настоятельно рекомендую вместо хранения файлов непосредственно в этой папке приложения вместо этого создать свой собственный каталог хранения в каталоге приложения, возвращаемом getFilesDir (), а затем сохранить там свои файлы. Таким образом вам не придется беспокоиться о других файлах, которые могут отображаться, например, если вы попытаетесь перечислить файлы в каталоге хранилища.

Файл myStorageFolder = новый файл (context.getFilesDir (), "myStorageFolder");

(Я согласен с P basak в том, что DataInputStream и DataOutputStream – ваш лучший вариант для чтения и записи данных. Я не рекомендую сериализацию, за исключением очень узкого набора приложений, где переносимость является фактором, поскольку он очень неэффективен. В моем случае объекты, которые заняли 15 Секунд для загрузки через Serialization, загруженный менее чем за 2 секунды с использованием DataInputStream.)

Intereting Posts
RxJava с презентатором и сохраненным фрагментом для изменений конфигурации Как динамически выделять SIDE дороги (или нарисовать линию рядом) с картами google или mapquest на Android Размер текста заголовка окна Изменение настроек настройки виджета Android после создания? Настройка Http Proxy в Android Studio Кодирование и декодирование byte с ZXing OnRestart против OnResume – вопрос жизненного цикла Android Android прокручивается в нижней части списка Разработка Android в IntelliJ IDEA заставляет компьютер замораживать NullPointerException: с ActionBar.setDisplayHomeAsUpEnabled (boolean) 'в ссылке на нулевой объект Для Android требуется уровень соответствия компилятора 5.0 или 6.0. Вместо этого найдено «1.7». Используйте Android Tools> Fix Project Properties Это ключевое слово в android Кордова создает скрипт / Ant не выполняет команду aapt Лучше ли использовать AsyncTask или Service для загрузки файла в фоновом режиме? Как вы декомпилируете, редактируете в eclipse и перекомпилируете apk? Шаг за шагом?