2016-04-26 32 views
0

所以這裏是我的問題(我讀了其​​他答案,但沒有完全得到它)。數據在jar中讀取文件(在Java中)和計數文件

在一組4人中,我們創建了一個Java遊戲作爲大學項目。其中的一部分是通過Ant創建* .jar文件。 GameBoardx.txt數據中保存了幾個GameBoard,其中x是數字。我們想隨機選擇其中之一。因此,每次加載GameBoard時,GameBoard目錄中的文件都會被計數,以便生成正確範圍內的隨機數。從Eclipse運行它時,我們的代碼工作得很好。它無法從* .jar文件運行,並以NullPointerException退出。

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

這些文件讀取以後使用此:

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

的代碼的其餘部分的工作原理與* .jar文件和* .txt文件都包含在裏面。

我找到的解決方案對我們來說並不好,因爲代碼必須與* .jar文件一起工作,並且只需從Eclipse啓動它即可通過測試。

這兩種工作都有什麼解決方法?

+0

你應該保留你的GameBoards目錄以外的jar文件 – Sanjeev

+0

這是不適用的。我們被要求創建jar文件的原因是,我們有一個單獨的文件,可以被髮送並被人們使用,而無需額外的工作。 – Shadol

回答

1

這裏的問題是你無法使用File讀取Jar的內容,你應該使用java.nio類來處理這個問題。

都可以讀/使用FileSystemPathFileVisitor類獲得的文件的數量從JAR /普通文件夾的第一:

下面的代碼將兩個jar工作,以及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()); 

以下是PathVisitor類的代碼

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

然後你應使用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); 
    } 

希望這樣可以解決您的問題,並幫助您在正確的方向讀取特定文件的內容。

+0

哇,這很棒,幫助很大!現在很有用,非常感謝。你的幫助真的很感謝:) – Shadol

+0

很高興它幫助你..乾杯 – Sanjeev