Вывести данные из файла в массив

Мне нужно, чтобы этот файл печатался в массив, а не на экран. И да, я ДОЛЖЕН использовать массив - школьный проект - я очень новичок в java, поэтому любая помощь приветствуется. Любые идеи? Благодарность

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class HangmanProject
{
    public static void main(String[] args) throws FileNotFoundException
    {

        String scoreKeeper;     // to keep track of score
        int guessesLeft;        // to keep track of guesses remaining
        String wordList[];    // array to store words


        Scanner keyboard = new Scanner(System.in);    // to read user's input

        System.out.println("Welcome to Hangman Project!");

        // Create a scanner to read the secret words file
        Scanner wordScan = null;

        try {
            wordScan = new Scanner(new BufferedReader(new FileReader("words.txt")));
            while (wordScan.hasNext()) {
                System.out.println(wordScan.next());
            }
        } finally {
            if (wordScan != null) {
                wordScan.close();
            }
        }
    }
}

person Curly5115    schedule 24.08.2012    source источник
comment
Почему вы импортируете каждый класс отдельно?   -  person Cole Johnson    schedule 24.08.2012
comment
@ColeJohnson, возможно, IDE   -  person MadProgrammer    schedule 24.08.2012
comment
Что вы подразумеваете под print массивом? И в чем проблема, с которой вы столкнулись?   -  person Sujay    schedule 24.08.2012
comment
похоже, вы делаете приложение для палача... Ммм, вы читаете или пишете в/из файла? Похоже, это должно быть прочитано   -  person Daniel Haro    schedule 24.08.2012
comment
обратитесь к нему... было бы полезно, я думаю... stackoverflow.com/questions/12085421/   -  person karan    schedule 24.08.2012
comment
stackoverflow.com/questions/12085421/ обратитесь к ней   -  person karan    schedule 24.08.2012
comment
Есть идеи? Объясните, где вы застряли, и задайте конкретный вопрос.   -  person Andrew Thompson    schedule 24.08.2012
comment
@Cole Johnson - я не уверен - я новичок в Java, лол   -  person Curly5115    schedule 24.08.2012
comment
@Sujay, когда я говорю «печатать», я просто имею в виду сохранение в массиве. Поздней ночью я перепутал свои термины программирования ха   -  person Curly5115    schedule 24.08.2012
comment
@DanielHaro Мне удалось успешно прочитать файл. Мне просто нужно сохранить то, что было прочитано в массиве. Каждое слово в отдельный элемент. Я не собираюсь ничего писать ни в какие файлы   -  person Curly5115    schedule 24.08.2012
comment
@AndrewThompson Я застрял с частью массива. Я могу прочитать файл, но не могу понять, как сохранить данные в массив.   -  person Curly5115    schedule 24.08.2012


Ответы (3)


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

Что-то типа...

String[] wordArray = new String[10];
int index = 0;
String word = null; // word to be read from file...
// Use buffered reader to read each line...
    wordArray[index] = word;
    index++;

Честно говоря, этот пример мало что будет значить, поэтому я сделал эти два примера.

Первый использует концепцию, предложенную Алексом, которая позволяет прочитать неизвестное количество строк из файла.

Единственная ошибка, если строки разделены более чем одной строкой (т.е. между словами есть дополнительная строка)

public static void readUnknownWords() {

    // Reference to the words file
    File words = new File("Words.txt");
    // Use a StringBuilder to buffer the content as it's read from the file
    StringBuilder sb = new StringBuilder(128);

    BufferedReader reader = null;
    try {

        // Create the reader.  A File reader would be just as fine in this
        // example, but hay ;)
        reader = new BufferedReader(new FileReader(words));
        // The read buffer to use to read data into
        char[] buffer = new char[1024];
        int bytesRead = -1;
        // Read the file to we get to the end
        while ((bytesRead = reader.read(buffer)) != -1) {

            // Append the results to the string builder
            sb.append(buffer, 0, bytesRead);

        }

        // Split the string builder into individal words by the line break
        String[] wordArray = sb.toString().split("\n");

        System.out.println("Read " + wordArray.length + " words");

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            reader.close();
        } catch (Exception e) {
        }
    }

}

Второй демонстрирует, как читать слова в массив известной длины. Это, вероятно, ближе к тому, что вы на самом деле хотите

public static void readKnownWords() 

    // This is just the same as the previous example, except we
    // know in advance the number of lines we will be reading    
    File words = new File("Words.txt");

    BufferedReader reader = null;
    try {

        // Create the word array of a known quantity
        // The quantity value could be defined as a constant
        // ie public static final int WORD_COUNT = 10;
        String[] wordArray = new String[10];

        reader = new BufferedReader(new FileReader(words));
        // Instead of reading to a char buffer, we are
        // going to take the easy route and read each line
        // straight into a String
        String text = null;
        // The current array index
        int index = 0;
        // Read the file till we reach the end
        // ps- my file had lots more words, so I put a limit
        // in the loop to prevent index out of bounds exceptions
        while ((text = reader.readLine()) != null && index < 10) {

            wordArray[index] = text;
            index++;

        }

        System.out.println("Read " + wordArray.length + " words");

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            reader.close();
        } catch (Exception e) {
        }
    }

}

Если вы найдете какой-либо из них полезным, я бы присвоил его, вы бы проголосовали за меня и проверили ответ Алекса как правильный, поскольку это его идея, которую я адаптировал.

Теперь, если вы действительно параноик о том, какой разрыв строки использовать, вы можете найти значения, используемые системой, через значение System.getProperties().getProperty("line.separator").

person MadProgrammer    schedule 24.08.2012
comment
Большое спасибо за Вашу помощь. Я бы хотел проголосовать за вас, но у меня даже нет достаточного количества представителей, чтобы проголосовать за вас, лол. Я сделаю это, как только смогу :) - person Curly5115; 25.08.2012
comment
@NickCarfagno, если вы хорошенько подтолкнете Алекса, приняв его ответ, это поможет вашей репутации;) - person MadProgrammer; 25.08.2012

Вам нужна дополнительная помощь с чтением файла или преобразованием строки в проанализированный массив? Если вы можете прочитать файл в строку, просто выполните:

String[] words = readString.split("\n");

Это разделит строку на каждом разрыве строки, поэтому предположим, что это ваш текстовый файл:

Слово1

Слово2

Слово3

слова будут: {слово1, слово2, слово3}

person Alex Coleman    schedule 24.08.2012
comment
+1 хорошая идея: D - Вам не нужно настраивать Scanner или вы просто прочитаете файл как один длинный String - person MadProgrammer; 24.08.2012
comment
@MadProgrammer Я думал сначала прочитать все целиком, а затем разделить его, так как вы можете прочитать его построчно, но вы не знаете, насколько большой массив вам понадобится тогда. Сплит здесь кажется более эффективным. Но спасибо :D - person Alex Coleman; 24.08.2012
comment
@AlexColeman: я думаю, вам нужно будет использовать StringBuilder и добавлять \n к каждому прочитанному слову? - person npinti; 24.08.2012
comment
@AlexColeman Вот о чем я подумал (после того, как вы опубликовали свой ответ), хорошо - person MadProgrammer; 24.08.2012
comment
Я бы заменил \r ничем перед разделением, чтобы \rtest не было 5 символов. - person Cole Johnson; 24.08.2012
comment
@npinti Да, это один из возможных способов чтения сканера. - person Alex Coleman; 24.08.2012
comment
@ColeJohnson На самом деле, возможно, замените \r на \n, как, поправьте меня, если я ошибаюсь, но я считаю, что они оба являются разделителями строк и просто используются по-разному в разных приложениях. - person Alex Coleman; 24.08.2012
comment
Вы правы, замените \r на \n и разделите на \n и удалите пустые строки. В Mac OS 9 и более ранних версиях используется \r, в Unix и OS X используется \n, а в Windows используется \r\n. - person Cole Johnson; 24.08.2012
comment
@MadProgrammer Проблема заключается в том, чтобы поместить строки в массив. Это для программы-палача, поэтому каждое слово в текстовом файле нужно поместить в массив. Я в значительной степени понимаю чтение файла. Но меня смущает его хранение в массиве. Я все же попробую. Спасибо! И извините за неясность изначально - ночное программирование запутало мою голову... И я знаю, что массив будет содержать 10 слов, несмотря ни на что. Я не знаю, делает ли это проще... или, может быть, хуже, ха-ха - person Curly5115; 24.08.2012

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

Что касается использования только массива, у вас есть два варианта:

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

Обычно рекомендуется использовать динамическую коллекцию, такую ​​как ArrayList. (). Затем вы можете использовать toArray() для преобразования списка в массив.

person npinti    schedule 24.08.2012
comment
Спасибо. Я знаю размер массива. Он должен быть размером 10 элементов. (В импортируемом файле десять слов). И я хотел бы использовать ArrayList(), но мой профессор специально проинструктировал не использовать ArrayList. Просто потому, что мы их не покрыли. - person Curly5115; 24.08.2012