2012-06-06 4 views
1

Можно создать дубликат:
Compare the content of 2 text files in java languageСтрока сравнения текстовых файлов

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

try { 
    URL url = new URL("httpurl");        
    URLConnection ucon = url.openConnection(); 
    InputStream is = ucon.getInputStream(); 
    BufferedInputStream bis = new BufferedInputStream(is); 
    ByteArrayBuffer baf = new ByteArrayBuffer(50); 
    int current = 0; 
    while ((current = bis.read()) != -1) { 
      baf.append((byte) current); 
    } 

    FileOutputStream fos = new FileOutputStream("/mnt/sdcard/random.txt"); 
    fos.write(baf.toByteArray()); 
    fos.close(); 
} catch (IOException e) { 
    Log.d("ImageManager", "Error: " + e); 
} 
+0

так просто конвертировать оба файла в строку и сравнивать строки с использованием equals ... –

+0

Вы не хотите сравнивать два файла но найти часть текста, равную в обоих файлах? – Arseniy

+0

Нет, я хочу, чтобы часть, которая не похожа в обоих файлах – user1437027

ответ

2
 File dir = Environment.getExternalStorageDirectory(); 

     File yourFile1 = new File(dir, "path/to/the/file/inside/the/textfile1.txt"); 
     File yourFile2 = new File(dir, "path/to/the/file/inside/the/textfile2.txt"); 

     put the check for file exists .......... 

     FileInputStream fstream1 = new FileInputStream(yourFile1); 
     FileInputStream fstream2 = new FileInputStream(yourFile2); 

    DataInputStream in1 = new DataInputStream(fstream1); 
     BufferedReader br1 = new BufferedReader(new InputStreamReader(in1)); 

    DataInputStream in2 = new DataInputStream(fstream2); 
     BufferedReader br2 = new BufferedReader(new InputStreamReader(in2)); 

    String strLine1, strLine2; 
    boolean isSame = true; 
    while ((strLine1 = br1.readLine()) && strLine2 = br2.readLine())) != null) { 
      if(strLine1.equals(strLine2)) 
       System.out.println(strLine1) 
      else{      //optional just try to optimize can remove 
        //not same 
        isSame = false; 
        break; 
       } 
    } 
+1

Выглядит хорошо. Кроме того, я бы рекомендовал использовать AsyncTask для этой операции, чтобы избежать блокировки потока пользовательского интерфейса. – Arseniy

4

Вы не должны читать файлы целиком в память, а затем сравнить их!

Вы можете читать оба файла по блоку, сравнивать каждую парную пар и останавливать чтение, если блоки разные. Также вы должны повторно использовать буфер памяти для блоков.

Этот подход дает раннюю остановку (хорошо для производительности), и управляет памятью (так что вы можете сравнить очень большие файлы)

Помните, что это отнимает много времени работы, так вы не должны делать это в UI потоке. Для этого используйте AsyncTask.

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

+0

+1 в моем новом ответе Я стараюсь сделать то же самое ... правильно? –

+1

+1, чтение полных файлов сразу переполняется. Я не знаю, доступна ли она на Android, но commons-io имеет вспомогательный класс для этого: http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html#contentEquals % 28java.io.File,% 20java.io.File% 29 – ftr

+0

commons-io доступно для Android, так что это действительно хорошая практика для повторного использования этого кода – Arseniy

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