2016-02-23 4 views
1

фонПредельное Android Размер файла

Веду относительно большой текстовый файл в андроида хранения, и добавление к нему periodically- ограничивая при этом размер файла до некоторого произвольного размера (скажем, 2MB)

Будем надеяться Я где-то пропускаю какую-либо функцию, или, надеюсь, есть лучший способ сделать этот процесс.

В настоящее время, когда файл a выходит за этот произвольный размер, создать временный файл b, скопируйте соответствующую часть файла a (более или менее подстроки файла a начиная с байта ххх, где ххх это номер слишком больших байтов файл a был бы, если бы я записал следующий бит данных в журнал), плюс текущие данные, затем перезапишите файл a со вторым файлом b.

Это, очевидно, очень неэффективен ...

Другое решение, что я не очень люблю, чтобы держать два файла, и переключаться между двумя из них, очищая следующий, когда ток полон, и переход на этот файл для вывода.

Однако, было бы удобно, если suuuuuper я мог бы просто сделать что-то вроде этого

File A = new File("output"); 
A.chip(500); 

или, может быть,

A.subfile(500,A.length()-500); 

TLDR;

Есть ли функция или, возможно, библиотека, доступная для Android, которая может удалить часть файла?

ответ

3

Вы уже ознакомились с RandomAccessFile? Хотя вы не можете удалить часть файла, вы можете искать любую позицию в файле и даже задавать длину. Поэтому, если вы обнаружите, что ваш файл слишком велик, просто возьмите соответствующую часть и перейдите в начало. Установите длину в 0 и напишите новые данные.

EDIT:

Я написал небольшую демонстрацию. Он показывает, ограничен ли размер файла до 10 байтов. Если вы передаете в значениях от 10 до 15 в виде строк, разделив их запятыми, после 10,11,12, файл записывается с самого начала, так что после 15 она читает 13,14,15

public class MainActivity extends Activity { 

    private static final String TAG = MainActivity.class.getSimpleName(); 
    private static final long MAX = 10; 
    private static final String FILE_TXT = "file.txt"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    for (int i = 10; i <= 15; i++) { 
     if (i > 10) { 
     writeToFile(","); 
     } 
     writeToFile(Integer.toString(i)); 
    } 
    } 

    private void writeToFile(String text) { 
    try { 
     File f = new File(getFilesDir(), FILE_TXT); 
     RandomAccessFile file = new RandomAccessFile(f, "rw"); 
     long currentLength = file.length(); 
     if (currentLength + text.length() > MAX) { 
     file.setLength(0); 
     } 
     file.seek(file.length()); 
     file.write(text.getBytes()); 
     file.close(); 
    } catch (IOException e) { 
     Log.e(TAG, "writeToFile()", e); 
    } 
    printFileContents(); 
    } 

    private void printFileContents() { 
    StringBuilder sb = new StringBuilder(); 
    try { 
     FileInputStream fin = openFileInput(FILE_TXT); 
     int ch; 
     while ((ch = fin.read()) != -1) { 
     sb.append((char) ch); 
     } 
     fin.close(); 
    } catch (IOException e) { 
     Log.e(TAG, "printFileContents()", e); 
    } 
    Log.d(TAG, "current content: " + sb.toString()); 
    } 
} 
+0

вам нужно однако сохранить позицию текущего конца/старта в файле. – njzk2

+0

отредактировал мой ответ, чтобы включить пример внедрения – Thomas

+0

Aha! Я определенно пропустил класс RandomAccessFile, который помогает! Я реализовал метод переключения плюс этот метод, и он отлично работает! Спасибо вам за помощь. – wizebin

Смежные вопросы