2017-04-03 1 views
0

でそれを読むためにどのようにこれはコードjarファイル用のファイルを置いて、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の」ディレクトリにjarファイルから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ファイルとjarファイルの外に.datファイルを持ち、各移動ごとに余分な設定をせずに実行できる方法がありますか? – Syarx

+0

データがある可動アプリケーションの場合、いくつかの注意が必要なマナーを追加しました。 –

関連する問題