чтение из файла и запись в файл в Java - PullRequest
3 голосов
/ 30 октября 2011

Я начинающий с Java.

Это мой подход:

Я пытаюсь прочитать два файла и затем получить их объединение.Я должен использовать массив размером 100. (допускается только одна array, чтение и запись построчно или arrayList или другие структуры не допускаются.)

Сначала я читаю все записи из file1 и записать их в выходной файл третий.Для этого я читаю 100 записей за раз и записываю их в третий файл, используя итерацию.

После этого, как и в первом файле, на этот раз я читаю второй файл как 100 записей за раз и записываюих к memory[].Затем я нахожу общие записи: если запись, которую я прочитал из File2, отсутствует в File1, я записываю ее в выходной файл.Я делаю это до тех пор, пока reader2.readLine() не получит null и не открою file1 в каждой итерации.

Это то, что я сделал до сих пор, почти что сделал.Буду признателен за любую помощь.

Редактировать: хорошо, теперь он не дает никаких исключений, но он не может найти различные записи и не может их записать.Я думаю, что последнее для цикла и логических не работает, почему?Мне действительно нужна помощь.Спасибо за ваше терпение.

import java.io.*;

public class FileUnion
{
private static long startTime, endTime;

public static void main(String[] args) throws IOException 
{
    System.out.println("PROCESSING...");
    reset();
    startTimer();

    String[] memory = new String[100];
    int memorySize = memory.length;

    File file1 = new File("stdlist1.txt");
    BufferedReader reader1 = new BufferedReader(new FileReader(file1));

    File file3 = new File("union.txt");
    BufferedWriter writer = new BufferedWriter(new FileWriter(file3));

    int numberOfLinesFile1 = 0;
    String line1 = null;
    String line11 = null;


    while((line1 = reader1.readLine()) != null)
    {
        for (int i = 0; i < memorySize; )
        {
            memory[i] = line1;
            i++;

            if(i < memorySize)
            {
                line1 = reader1.readLine();
            }
        }

        for (int i = 0; i < memorySize; i++)
        {
            writer.write(memory[i]);
            writer.newLine();
            numberOfLinesFile1++;
        }
    }

    reader1.close();

    File file2 = new File("stdlist2.txt");
    BufferedReader reader2 = new BufferedReader(new FileReader(file2));

    String line2 = null;
    while((line2 = reader2.readLine()) != null)
    {
        for (int i = 0; i < memorySize; )
        {
            memory[i] = line2;
            i++;

            if(i < memorySize)
            {
                line2 = reader2.readLine();
            }
        }

        for (int k = 0; k < memorySize; k++ )
        {
            boolean found = false;
            File f1 = new File("stdlist1.txt");
            BufferedReader buff1 = new BufferedReader(new FileReader(f1));

            for (int m = 0; m < numberOfLinesFile1; m++)
            {
                line11 = buff1.readLine();

                if (line11.equals(memory[k]) && found == false);
                {
                    found = true;
                }

            }
            buff1.close();

            if (found == false)
            {
                writer.write(memory[k]);
                writer.newLine();
            }


        }       
    }

    reader2.close();
    writer.close();

    endTimer();
    long time = duration();
    System.out.println("PROCESS COMPLETED SUCCESSFULLY");
    System.out.println("Duration: " + time + " ms");

}

public static void startTimer()
{
    startTime = System.currentTimeMillis();
}
public static void endTimer()
{
    endTime = System.currentTimeMillis();
}
public static long duration()
{
    return endTime - startTime;
}
public static void reset()
{
    startTime = 0;
    endTime = 0;
}
}

1 Ответ

0 голосов
/ 30 октября 2011

EDIT!Повторить.

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

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

Что если при вызове этой строки:

while((line2 = reader2.readLine()) != null)

в файле остается только 1 строка?Затем ваш массив памяти содержит 99 экземпляров null, и вы пытаетесь записать null в файл 99 раз.Это худший сценарий.

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

здесь приведен пример одного из способов записи первого файла.

String line1 = reader1.readLine();

boolean end_of_file1 = false;
while(!end_of_file)
{
    for (int i = 0; i < memorySize)
    {
        memory[i] = line1;
        i++;

        if(i < memorySize)
        {
            if((line1 = reader1.readLine()) == null)
            {
                end_of_file1 = true;
            }
        }
    }

    for (int i = 0; i < memorySize; i++)
    {
        if(!memory[i] == null)
        {
            writer.write(memory[i]);
            writer.newLine();
            numberOfLinesFile1++;
        }
    }
}

reader1.close();

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

public static boolean isUsed(String f1, String item, int dist)
{
    BufferedReader buff1 = new BufferedReader(new FileReader(f1));

    for(int i = 0;i<dist;i++)
    {
        String line = buff1.readLine()
        if(line == null){
            return false;
        }
        if(line.equals(item))
        {
            return true;
        }
    }
    return false;
}

Затем используйте тот же метод, что и для записи файла 1, только перед написанием каждой строки проверьте, не является ли! isUsed ()

boolean end_of_file2 = false;
memory = new String[memorySize];// Reset the memory, erase old data from file1
int numberOfLinesFile2=0;
String line2 = reader2.readLine();
while(!end_of_file2)
{
    for (int i = 0; i < memorySize; )
    {
        memory[i] = line2;
        i++;

        if(i < memorySize)
        {
            if((line2 = reader2.readLine()) == null)
            {
                end_of_file2 = true;
            }
        }
    }

    for (int i = 0; i < memorySize; i++)
    {
        if(!memory[i] == null)
        {
            //Check is current item was used in file 1.
            if(!isUsed(file1, memory[i], numberOfLinesFile1)){//If not used already
                writer.write(memory[i]);
                writer.newLine();
                numberOfLinesFile2++;
            }
        }
    }
}
reader2.close();
writer.close();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...