簡體   English   中英

從文件中讀取並在java中寫入文件

[英]reading from the file and writing to the file in java

我是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;
}
}

編輯! 重做。

好吧,所以要一次使用100行,你需要檢查null,否則嘗試將null寫入文件可能會導致錯誤。

您正在檢查文件是否在最后一次,然后收集99個更多的信息,而不檢查null。

如果調用此行,該怎么辦:

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

文件中只剩下1行? 然后你的內存數組包含99個null實例,並嘗試將99寫入該文件的null。 那是更糟糕的情況。

我真的不知道我們應該給尋求家庭作業幫助的人多少幫助,在大多數我熟悉的網站上甚至都不允許。

這是編寫第一個文件的一種方法的示例。

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();

希望這可以幫助。 請注意,我沒有提供完整的代碼,因為我已經了解到只是粘貼代碼會使復制和粘貼更有可能只使用代碼而不理解它。 希望對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM