2017-04-03 41 views
0

讀它這是代碼如何放置文件罐子和用的FileInputStream

public static void readCharacters() { 

    try (FileInputStream fi = new FileInputStream("main/characters.dat"); ObjectInputStream os = new ObjectInputStream(fi)) { 

     characterList = (LinkedList<Character>) os.readObject(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

這是結構: enter image description here

這是錯誤

的Java。 io.FileNotFoundException:main \ characters.dat(系統找不到指定的路徑)

我想要的是在我的jar中包含characters.dat文件,並且能夠在程序運行時讀寫它。有沒有不同的方式來寫道路?或將.dat文件置於不同的位置。

而且書寫方法:

public static void writeCharacters() { 
    try (FileOutputStream fs = new FileOutputStream("main/characters.dat"); ObjectOutputStream os = new ObjectOutputStream(fs)) { 
     System.out.println("Writing Characters..."); 
     os.writeObject(characterList); 

    } catch (FileNotFoundException e) { 

     e.printStackTrace(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

} 
+0

嘗試用''src/main/characters.dat「' – moondaisy

+1

它的工作方式,當我從ide運行它,但不是當我運行jar時。 – Syarx

+1

@moondaisy號碼'src'目錄不存在於JAR文件中,並且你錯過了實際的問題。 – EJP

回答

2

你不能。你可以做一個或另一個。 JAR文件不是文件系統,它們的輸入不是文件。您可以用輸入流閱讀:

InputStream in = this.getClass().getResourceAsStream("/main/characters.dat"); 

繼續之前檢查是否有空。

+0

你是什麼意思,我可以做一個或另一個? – Syarx

+0

您可以使用'FileInputStream' *或*將資源放入JAR文件中。 – EJP

+0

FileInputStream的替代方法?我發佈了寫作代碼,如果它改變了什麼 – Syarx

1

該jar適用於只讀資源。您可以將它用作初始文件,作爲一種模板。

Path path = Paths.get(System.getProperty("user.home") + "/myapp/chars.dat"); 
Files.mkdirs(path.getParentPath()); 
if (!Files.exists()) { 
    try (InputStream in = 
      Controller.class.getResourceAsStream("/main/characters.dat")) { 
     Files.copy(in, path); 
    } 
} 

以上副本從罐子到用戶的家「的myapp」目錄,這是一種常見的解決方案initial.dat資源。

System.getProperty("user.dir")會運行的目錄。人們也可以採取罐子的路徑:

URL url = Controller.class.getResource("/main/characters.dat"); 
String s = url.toExternalForm(); // "jar:file:/.... /xxx.jar!/main/characters.dat" 

從那你也可以構造jar的目錄。介意檢查Windows,Linux,空間等。

URL url = Controller.class.getProtectionDomain().getCodeSource().getLocation(); 

上述解決方案的風險一個NullPointerException,以及作品有點differenly IDE內部運行或獨立。

+0

有沒有辦法可以將jar文件之外的.dat文件和jar放在不同的計算機上,並且爲了能夠在沒有爲每次移動進行額外配置的情況下運行該文件? – Syarx

+0

對於具有其數據的可移動應用程序,我添加了一些仍需要謹慎的方式。 –