Нужна помощь в поиске, где начать искать, чтобы исправить мой код. При чтении больших файлов застревает - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь прочитать большой текстовый файл, содержащий около 7516 строк текста. Когда я читаю файл меньшего размера (9 строк), программа работает нормально. Но с большим файлом он, похоже, что-то зацепил и просто продолжает работать без чего-либо на самом деле. Я не уверен, с чего начать искать проблему.

Код читает текстовый файл и затем превращает его в массив. Затем он передает массив в случайном порядке и записывает его в другой текстовый файл. Или, по крайней мере, я этого хочу.

package Rn1;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Read2 {
    static void randomShuffle( int arr[], int n) 
    { 
// Creating a object for Random class 
        Random r = new Random(); 
// Start from the last element and swap one by one. We don't 
// need to run for the first element that's why i > 0 
        for (int i = n-1; i > 0; i--) { 

// Pick a random index from 0 to i 
            int j = r.nextInt(i+1); 

// Swap arr[i] with the element at random index 
            int temp = arr[i]; 
            arr[i] = arr[j]; 
            arr[j] = temp; 
} 
// Prints the random array 

System.out.println(Arrays.toString(arr)); 
} 


    public static String readString(String file) {
        String text = "";
        try {
            Scanner s = new Scanner(new File(file));
            while(s.hasNext()) {
                text = text + s.next() + " ";
            }
        }
        catch(FileNotFoundException e) {
            System.out.println("Not Found");
        }

        return text;
    }

    public static String[] readArray(String file) {
        //Step 1:
    //Count how many elements in the file (lines)
        //Step 2
        //Create array
        int ctr = 0;
        try {
            Scanner s1 = new Scanner(new File(file));
            while (s1.hasNextLine()) {
                ctr = ctr +1;
                if (s1.hasNext()) {
                s1.next();
                }
            }
            String[] words = new String[ctr];

            Scanner s2 = new Scanner(new File(file));
            for(int i = 0; i < ctr; i = i+1){
                words[i] = s2.next();
        }
        return words;
        }

        catch (FileNotFoundException e) {

        }
            return null;
    }


    public static void main(String[] args) throws Exception 
    { 
        //String text = readString("C:\\Users\\herna\\Desktop\\Test.txt");
        //System.out.println(text);

        String[] words = readArray("C:\\Users\\herna\\Desktop\\ErdosCA.txt");
        int n = words.length;
        int [] arr = new int [n];

        PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
        for (int i=0; i < words.length; i = i + 1 )
        {
            arr[i] = Integer.parseInt(words[i]);

            //writer.println(words[i]);


    }

        //System.out.println(Arrays.toString(arr));
        randomShuffle(arr, n);
        writer.println(Arrays.toString(arr));
        //writer.println(Arrays.toString(words));
        //writer.println("Update*");
        writer.close();


    }

}

1 Ответ

1 голос
/ 12 февраля 2020

Программа также воспроизводится с небольшими файлами, например:

1
2
3

Программа вводит бесконечный l oop, когда последняя строка файла пуста. Плохая часть такова:

            Scanner s1 = new Scanner(new File(file));
            while (s1.hasNextLine())
            {
                ctr = ctr + 1;
                if (s1.hasNext())
                {
                    s1.next();
                }
            }

Если вы находитесь перед пустой строкой, то s1.hasNextLine() - это истина, а s1.hasNext() - ложь. Таким образом, вы не читаете следующий элемент. Тогда в следующей итерации l oop, s1.hasNextLine() все еще имеет значение true, и, следовательно, l oop никогда не заканчивается.

Кстати, вы никогда не должны перехватывать исключения, не обрабатывая их. Вы должны хотя бы вывести сообщение об ошибке, а затем вызвать e.printStackTrace().

...