2012-02-29 6 views
3

У меня есть этот код для шифрования видеофайлов.Ускорение шифрования?

public static void encryptVideos(File fil,File outfile) 
{ 
    try{ 
    FileInputStream fis = new FileInputStream(fil); 
    //File outfile = new File(fil2); 
    int read; 
    if(!outfile.exists()) 
     outfile.createNewFile(); 
    FileOutputStream fos = new FileOutputStream(outfile); 
    FileInputStream encfis = new FileInputStream(outfile); 
    Cipher encipher = Cipher.getInstance("AES"); 
    KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
    //byte key[] = {0x00,0x32,0x22,0x11,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 
    SecretKey skey = kgen.generateKey(); 
    //Lgo 
    encipher.init(Cipher.ENCRYPT_MODE, skey); 
    CipherInputStream cis = new CipherInputStream(fis, encipher); 
    while((read = cis.read())!=-1) 
     { 
     fos.write(read); 
     fos.flush(); 
     } 
    fos.close(); 
    }catch (Exception e) { 
    // TODO: handle exception 
    } 
} 

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

+0

Encyrption - ресурсоемкий. Вся идея состоит в том, что вы затрудняете содержание сложным образом. – mcfinnigan

+0

Какую скорость вы делаете? Пробовали ли вы * сопоставление * файла и выполнение шифрования на возвращаемом ByteBuffer (ps dunno, если это возможно для android, пропущенного тега)? –

+0

Я новичок Я не знаю, что его возможно – Navdroid

ответ

5

Ну это выглядит очень медленно, чтобы начать с:

while((read = cis.read())!=-1) 
{ 
    fos.write(read); 
    fos.flush(); 
} 

Вы чтения и записи одного байта в то время и промывки поток. Сделайте это в буфер в то время:

byte[] buffer = new byte[8192]; // Or whatever 
int bytesRead; 
while ((bytesRead = cis.read(buffer)) != -1) 
{ 
    fos.write(buffer, 0, bytesRead); 
} 
fos.flush(); // Not strictly necessary, but can avoid close() masking issues 

отметить также, что вы только закрытия fos (не cis или fis), и вы должны закрыть все из них в finally блоков.

+0

Мой файл около 300mb этот метод сделал его более медленным, чем раньше – Navdroid

+2

@Navdroid: Это * медленнее * чем чтение и запись одного байта за раз? Я считаю, что трудно поверить. –

+0

Я новичок в этом сэр .. Я также считаю это запутанным, но более старый метод был быстрее, чем ваш метод ... – Navdroid

2

Вы можете использовать андроид NDK, чтобы написать эту часть своего приложения с C++, чтобы получить значительное повышение производительности. Это похоже на ситуацию, которая выиграет от этого. И уже может быть что-то подобное с NDK.