2016-04-26 7 views
0

Also hier ist mein Problem (ich habe die anderen Antworten gelesen, aber nicht ganz verstanden).Daten lesen in einem Jar Datei (in Java) und Dateien zählen

In einer Gruppe von 4 haben wir ein Spiel in Java als ein Universitätsprojekt erstellt. Ein Teil davon ist das Erstellen einer * .jar-Datei über Ant. In GameBoardx.txt Data sind mehrere GameBoards gespeichert, wobei x die Nummer ist. Wir wollen eine davon zufällig auswählen. Jedes Mal, wenn ein GameBoard geladen wird, werden daher die Dateien im GameBoard-Verzeichnis gezählt, um eine Zufallszahl im richtigen Bereich zu erzeugen. Unser Code funktioniert einwandfrei, wenn er von Eclipse ausgeführt wird. Es kann nicht aus der * .jar-Datei ausgeführt werden und wird mit einer NullPointerException beendet.

int number = 0; 
int fileCount = new File(new File("").getAbsolutePath()+"/GameBoards/").listFiles().length; 
Random rand = new Random(); 
number = rand.nextInt(fileCount); 

Diese Dateien werden später lesen Sie über die Verwendung:

static String fileName = new File("").getAbsolutePath(); 
static String line = null; 

boolean verticalObstacles[][] = new boolean[16][17]; 
    int currentLine = 1; 
    try { 
     FileReader fileReader = new FileReader(fileName+"/GameBoards/Board"+boardNumber+".txt"); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     while ((line = bufferedReader.readLine()) != null){ 
      if (currentLine <17){ 
       for (int i=0; i<17; i++){ 
        if (line.charAt(i) == '1'){ 
         verticalObstacles[currentLine-1][i] = true; 
        } else { 
         verticalObstacles[currentLine-1][i] = false; 
        } 

       } 
      } 
      currentLine ++; 
     } 
     bufferedReader.close(); 

Der Rest des Codes arbeitet mit der * .jar-Datei und die * .txt-Dateien sind darin enthalten.

Die Lösungen, die ich gefunden habe, waren nicht gut für uns, weil der Code mit der * .jar-Datei arbeiten und nur von Eclipse starten muss, um den Test zu bestehen.

Was ist die Lösung hier zu machen in der Arbeit in beiden?

+0

Sie sollten Ihr GameBoards-Verzeichnis mit Dateien außerhalb des Jar – Sanjeev

+0

aufbewahren Das ist nicht anwendbar. Der Grund, warum wir aufgefordert werden, jar-Dateien zu erstellen, besteht darin, dass wir eine einzige Datei haben, die gesendet werden kann und von Personen ohne zusätzliche Arbeit verwendet werden kann. – Shadol

Antwort

1

Problem hier ist, dass Sie den Inhalt eines Glases mit File nicht lesen können, verwenden Sie java.nio Klassen, um damit umzugehen.

Zunächst einmal können Sie Anzahl der Dateien aus Jar/normaler Ordner gelesen/erhalten, indem mit FileSystem, Path und FileVisitor Klassen:

Code für beide jar arbeiten Nach sowie IDE

ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader(); 
    URI uri = sysClassLoader.getResource("GameBoards").toURI(); 
    Path gameBoardPath = null; 
    if (uri.getScheme().equals("jar")) { 
     FileSystem fileSystem = FileSystems.newFileSystem(uri, 
       Collections.<String, Object> emptyMap()); 
     gameBoardPath = fileSystem.getPath("/GameBoards"); 
    } else { 
     gameBoardPath = Paths.get(uri); 
    } 

    PathVisitor pathVistor = new PathVisitor(); 
    Files.walkFileTree(gameBoardPath, pathVistor); 

    System.out.println(pathVistor.getFileCount()); 

Es folgt der Code für PathVisitor Klasse

class PathVisitor extends SimpleFileVisitor<Path> { 
    private int fileCount = 0; 

    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
      throws IOException { 
     fileCount++; 
     return FileVisitResult.CONTINUE; 
    } 

    public int getFileCount() { 
     return fileCount; 
    } 
} 

Und dann werden Sie Inhalte bestimmter Datei lesen von ClassLoader#getResourceAsStream

// ADD your random file picking logic here based on file Count to get boardNum 
    int boardNum = 1; 
    InputStream is = sysClassLoader.getResourceAsStream("GameBoards/Board" + boardNum + ".txt"); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    String line = null; 
    while((line=reader.readLine())!=null) { 
     System.out.println(line); 
    } 

Hoffnung mit diesem Ihre Bedenken löst und hilft Ihnen in die richtige Richtung.

+0

Wow, das ist großartig und hilft sehr! Jetzt funktioniert es. Vielen Dank. Ihre Hilfe wird wirklich geschätzt :) – Shadol

+0

Froh, dass es Ihnen geholfen hat .. Prost – Sanjeev