Java: прочитайте и напишите файл вместе
Вопрос
Я пытаюсь прочитать файл Java и изменять его одновременно. Это то, что мне нужно сделать: мой файл имеет формат:
aaa
bbb
aaa
ccc
ddd
ddd
Мне нужно прочитать через файл и получить счет № вхождений и изменить дубликаты, чтобы получить следующий файл:
aaa - 2
bbb - 1
ccc - 1
ddd - 2
Я пытался использовать RandomAccessFile
сделать это, но не мог это сделать. Может кто-нибудь помочь мне с кодом для этого?
Решение
Это гораздо легче, если вы не делаете две вещи одновременно. Лучший способ - пройти через весь файл, подсчитать все вхождения каждой строки в хэш, а затем записать все результаты в другой файл. Затем, если вам нужно, переместите новый файл на старый.
Вы никогда не хотите читать и писать в тот же файл одновременно. Ваши смещения в файле будут смещены каждый раз, когда вы делаете запись, и курсор чтения не будет отслеживать это.
Другие советы
Я бы сделал это таким образом: - анализ оригинального файла и сохранить все записи в новый файл. Используйте блоки данных с фиксированной длиной для записи записей в новый файл (так, скажем, ваша длинная строка длиной 10 байтов, возьмите 10 + x в виде длины блока, X предназначен для дополнительной информации, которую вы хотите сохранить вдоль записей. Так что 10-я запись В файле будет в байтовом положении 10 * (10 + x)). Тебе также придется знать количество записей для создания (поэтому размер файла nofegentries * BloadLength, используйте RandomacceFile и Setlength, чтобы установить эту длину файла). - Теперь используйте алгоритм Quicksort для сортировки записей в файле (моя идея состоит в том, чтобы иметь отсортированный файл в конце, что делает вещи гораздо проще и быстрее, наконец, тоже. Хешинг теоретически тоже работал, но вам придется иметь дело с переходными дубликатами Тогда все дубликаты сгруппированы - не совсем выбор здесь). - Проанализируйте файл с текущими записями. Сохраните указатель на запись первого представления о входе. Увеличение количества дубликатов, пока не появится новая запись. Измените первую запись и добавьте эту добавку информации, которую вы хотите иметь в новом файле «окончательный результат». Продолжайте этот путь со всеми остальными записями в отсортированном файле.
Выводы: Я думаю, что это должно быть достаточно быстрым и использовать разумное количество ресурсов. Тем не менее, это зависит от имеющих вас данных. Если у вас очень большое количество дубликатов, производительность QuickSort будет унижать. Кроме того, если ваша самая длинная запись данных находится дольше, чем в среднем, она также будет отпущена файловым пространством.
Если вам нужно, есть способы, которыми вы можете манипулировать тот же файл и обновлять счетчики, без необходимости открывать другой файл или сохранять все в памяти. Однако самый простой из подходов будет очень медленным.
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){}
}
}
}