Я делаю игру Battle Royale в командной строке, и у меня есть имена и фамилии ботов в двух текстовых файлах. Теперь я пытаюсь прочитать эти два файла с помощью двух сканеров, затем помещаю имена в один массив и фамилии в другой массив.
Игра объектно-ориентированная, поэтому в ней 3 файла:
Файл №1 (приложение)
package tp2;
public class App {
public static void main(String[] args) throws InterruptedException {
Game game = new Game();
game.start();
}
}
Файл №2 (Игра)
package tp2;
public class Game {
private Level currentLevel;
private Player player;
public void start() throws InterruptedException {
World.createNameArrays();
World.printNamesArrays();
}
}
Файл №3 (Мир)
package tp2;
import java.io.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
public class World {
private static final int MAX_PLAYERS = 42;
private static String firstNamesArray[] = new String[MAX_PLAYERS];
private static String lastNamesArray[] = new String[MAX_PLAYERS];
private static Player players[] = new Player[MAX_PLAYERS];
private static Scanner scannerFirstNames;
private static Scanner scannerLastNames;
public static void printNamesArrays() {
System.out.println("");
System.out.println("First names available");
System.out.println("---------------------");
for (int i = 0; i < MAX_PLAYERS; ++i) {
System.out.println(firstNamesArray[i]);
}
System.out.println("");
System.out.println("Lats names available");
System.out.println("---------------------");
for (int i = 0; i < MAX_PLAYERS; ++i) {
System.out.println(lastNamesArray[i]);
}
}
public static void createNameArrays() {
openNameFiles();
int i = 0;
while (scannerFirstNames.hasNext() && scannerLastNames.hasNext()) {
System.out.println("**********Test*************");
firstNamesArray[i] = scannerFirstNames.nextLine();
lastNamesArray[i] = scannerLastNames.nextLine();
++i;
}
closeNameFiles();
}
public static void closeNameFiles() {
scannerFirstNames.close();
scannerLastNames.close();
}
public static void openNameFiles() {
try {
scannerFirstNames = new Scanner(new File("firstnames.txt"));
} catch(FileNotFoundException e) {
System.out.println("Error! File not found.");
}
try {
scannerLastNames = new Scanner(new File("lastnames.txt"));
} catch(FileNotFoundException e) {
System.out.println("Error! File not found.");
}
}
}
Для пояснения я сделал метод для печати имен и фамилий из двух массивов, но он просто печатает «NULL», когда я выполняю метод. Это просто означало бы, что сканеры не могут прочитать два файла по каким-то причинам...
Рекомендуется научиться отлаживать, например vogella.com/tutorials/EclipseDebugging/article.html
Попробуйте использовать объект FileReader вместо сканера. Хорошо, если вы только начинаете изучать Java.
Вы уверены, что файлы правильно отформатированы? Этот код работает (проверено).




Вы можете изменить функцию createNamesArray() и избавиться от closeNameFiles() и openNameFile().
Я обновил ваш World.java (если вы используете java:8)
public class World {
private static final int MAX_PLAYERS = 42;
private static String firstNamesArray[] = new String[MAX_PLAYERS];
private static String lastNamesArray[] = new String[MAX_PLAYERS];
private static int firstNameEntriesInFile;
private static int lastNameEntriesInFile;
public static void printNamesArrays() {
System.out.println("");
System.out.println("First names available");
System.out.println("---------------------");
for (int i = 0; i < MAX_PLAYERS && i < firstNameEntriesInFile; ++i) {
System.out.println(firstNamesArray[i]);
}
System.out.println("");
System.out.println("Lats names available");
System.out.println("---------------------");
for (int i = 0; i < MAX_PLAYERS && i < lastNameEntriesInFile; ++i) {
System.out.println(lastNamesArray[i]);
}
}
public static void createNameArrays() {
try {
String[] fNames = Files.lines(new File("fullpath/firstname.txt").toPath()).toArray(String[]::new);
if (fNames.length == 0) {
throw new RuntimeErrorException(null, "no first name entry found in the given file");
} else {
firstNameEntriesInFile=fNames.length;
firstNamesArray=fNames;
}
String[] lNames = Files.lines(new File("fullpath/lastname.txt").toPath()).toArray(String[]::new);
if (lastNamesArray.length == 0) {
throw new RuntimeErrorException(null, "no last name entry found in the given file");
}else {
lastNameEntriesInFile=lNames.length;
lastNamesArray=lNames;
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("file can't be accessed: cause " + e.getMessage());
}
}
}
Тем не менее, если вы хотите сделать это по-своему, я предлагаю использовать FileReader
Я бы порекомендовал использовать ArrayList, который обрабатывает динамические размеры, тогда как для массива потребуется заранее определенный размер, который вы можете знать или не знать. Глядя на ваш код, я вижу, что вы уже определили размер.
BufferedReader in = new BufferedReader(new FileReader("fullpath/firstnames.txt"));
String str;
List<String> list = new ArrayList<String>();
while((str = in.readLine()) != null){
list.add(str);
}
firstNamesArray = list.toArray(new String[list.size()]);
аналогично для массива фамилий.
Кроме того, нецелесообразно использовать статический в первую очередь по той причине, что безопасность потоков является второй объектно-ориентированной концепцией.
Не волнуйтесь, мы все когда-то были на вашем месте, а потом со временем научились. Не так уж и важно!
Обратите внимание, что static на самом деле не является объектно-ориентированным, особенно статические поля!