JAVA: читать и писать файл вместе - PullRequest
6 голосов
/ 23 ноября 2010

Я пытаюсь прочитать файл Java и изменить его одновременно. Вот что мне нужно сделать: Мой файл имеет формат:

aaa
bbb
aaa
ccc
ddd
ddd

Мне нужно прочитать файл и получить количество # случаев и изменить дубликаты, чтобы получить следующий файл:

aaa -  2
bbb -  1
ccc -  1
ddd -  2

Я пытался использовать RandomAccessFile для этого, но не смог. Может кто-нибудь помочь мне с кодом для этого?

Ответы [ 4 ]

8 голосов
/ 23 ноября 2010

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

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

1 голос
/ 22 февраля 2011

Я бы сделал это следующим образом: - Разобрать оригинальный файл и сохранить все записи в новый файл.Используйте блоки данных фиксированной длины для записи записей в новый файл (например, длина самой длинной строки составляет 10 байт, длина блока 10 + x, x - дополнительная информация, которую вы хотите сохранить вдоль записей. Итак, 10-я записьв файле будет в байтовой позиции 10 * (10 + х)).Вам также необходимо знать количество записей для создания (чтобы размер файла не равнялся noOfEntries * blocklength, используйте RandomAccesFile и setLength, чтобы установить длину этого файла).- Теперь используйте алгоритм быстрой сортировки для сортировки записей в файле (моя идея состоит в том, чтобы в конце иметь отсортированный файл, что в конечном итоге делает вещи намного проще и быстрее. Хеширование теоретически тоже будет работать, но вам придется иметь дело с перестановкой дублирующихся записейзатем сгруппировать все дубликаты - на самом деле это не лучший выбор).- Разбор файла с теперь отсортированными записями.Сохраните указатель на запись о первом появлении записи.Увеличивайте количество дубликатов, пока не появится новая запись.Измените первую запись и добавьте эту дополнительную информацию, которую вы хотите иметь там, в новый файл «конечного результата».Продолжайте в том же духе со всеми оставшимися записями в отсортированном файле.

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

0 голосов
/ 18 августа 2013
 import java.util.*;
 import java.io.*;
 import java.util.*;
 class WordFrequencyCountTest
 {
 public static void main( String args[])
 {
System.out.println(" enter the file name");
Scanner sc = new Scanner(System.in);
String fname= sc.next();    
     File f1 = new File(fname);


    if(!f1.exists())
    {
        System.out.println(" Source file doesnot exists");
        System.exit(0);
    }
    else{
        try{                
            FileReader fis = new FileReader(f1);
            BufferedReader br = new BufferedReader(fis);
            String str = "";
            int count=0;  
        Map<String, Integer> map = new TreeMap<String, Integer>(); 
            while((str = br.readLine()) != null )
            {
                String[] strArray = str.split("\\s");
                count=1;
                for(String token : strArray)   // iteration of strArray []
                {                       
                if(map.get(token)!=null )
            {
                        count=map.get(token);
                        count++;
                        map.put(token, count);
                        count=1;
                    }else{
                        map.put(token, count);

                    }
                }
            }

            Set set=map.entrySet();
            Iterator itr = set.iterator();    
            System.out.println("========");

            while(itr.hasNext())
            {
                Map.Entry entry = (Map.Entry)itr.next();

                System.out.println( entry.getKey()+ " "+entry.getValue());
            }               
            fis.close();            
        }catch(Exception e){}
           }
        }
    }
0 голосов
/ 23 ноября 2010

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

...