2013-03-29 8 views
5

Javaコード内のいくつかのオブジェクトをシリアル化したいです。私はそれをハードドライブ上のいくつかのランダムなフォルダに入れたくありません。私はそれが私のEclipseプロジェクトフォルダ内のフォルダ内にあることを望みます。このフォルダを作成してオブジェクトを保存するにはどうすればよいですか?シリアル化されたオブジェクトを格納するためにeclipseでフォルダを作成するにはどうすればいいですか?

これは良い方法ですか?このプロジェクトから自己完結型のJARを作成しようとすると問題はありますか?

答えて

6

カレントディレクトリにサブフォルダを作成する方法を示しています。

import java.io.File; 

public class SourceCodeProgram { 

    public static void main(String argv[]) throws Exception { 
     File currentFolder = new File("."); 
     File workingFolder = new File(currentFolder, "serialized"); 
     if (!workingFolder.exists()) { 
      workingFolder.mkdir(); 
     } 
     System.out.println(workingFolder.getAbsolutePath()); 
    } 
} 

あなたは、このソースコードを実行し、Eclipseプロジェクトの構造にserializedディレクトリが表示されるはずEclipseプロジェクトを更新すると。今すぐあなたはそれを使用して、その中のすべてのファイルを格納することができます。

私のアプリでは、データをハードドライブに保存する場合、私は常にユーザーの推奨を使用します。

working.folder=/example/app-name 

アプリケーションは起動時にこのファイルを読み込み、それを必要とする場合、このフォルダを作成します。私は、キーが含まれapplication.propertiesファイルを作成します。 2番目の解決策は「appパラメータ」です。ユーザーから1つまたは2つのパラメータだけが必要なときは、コマンドラインから読み込みます。例えば、ユーザがそのコマンドを使用して私のアプリを実行します。

java -jar app.jar -dir /example/app-name 

ユーザーが、私はデフォルトのフォルダを使用任意のフォルダを提供していない場合は - カレントディレクトリを。

役立つリンク:

+1

作業コードの包括的な答えは+1です。 –

3

これらのシリアル化可能オブジェクトにはどのような情報があるかによって異なります。

あなたのコードベース内のフォルダを持つようにしたい(だけフォルダとして配備)場合にも、あなたはファイルの書き込みや読み取りに、コードを書くことができます。

URL dir_url = ClassLoader.getSystemResource(dir_path); 
// Turn the resource into a File object 
File dir = new File(dir_url.toURI()); 
// List the directory 
String files = dir.list() 

注ディレクトリはクラスパスにする必要があります。

+0

あなたは日食でこれをどのように行うのですか?それはあなたのJavaプロジェクトの中にフォルダを作成して、あなたのコードをこのフォルダに書き込み、そこから読むことができるようにしますか? –

+1

私はあなたが実際に気づいていると思います。あなたがEclipse内で作成するフォルダは、実際にはフォルダシステムのフォルダになります。 –

+0

あなたのプロジェクトがProjAだと、あなたのソースはProjA/srcにあります...エクスプローラからProjA/resでフォルダを作成してeclipseでリフレッシュすると、そこにフォルダが表示されます(ここではシリアル化されたオブジェクトを保持できます)。 –

2

あなたのユーザーディレクトリに書き込むほうがいいですか?サブフォルダ内にあります。.myApp/

あなたは/ディレクトリを初期設定するためにこのような何かをするだろう:

File userDir = new File(System.getProperty("user.home")); 
File storageDir = new File(userDir, ".myApp"); 
if (!storageDir.exists()) 
    storageDir.mkdir(); 
// store your file in storageDir 

は(あなたは、必ずしも気にする必要はありませんが)userDirが通常配置されている場所を見つけるために見hereを持っています。ソースコードの下

+0

どうやってそれをしますか?私はステップが必要です。 –

3

ステップ:

  1. 右パッケージエクスプローラ
  2. でプロジェクトのフォルダをクリックし、「新規」メニュー項目を見つけて、それが
  3. 開かれた中で「フォルダ」を見つけてホバーメニューをクリックしてそれをクリックしてください
  4. フォルダに名前を付けてください
  5. 下の「Finish」ボタン

これは、eclipseから実行するときに作業ディレクトリからアクセス可能なフォルダを作成します。

実行時にJARファイル内のファイルを操作するのは悪い考えです。 2つ以上のJVMが同じJARを実行しているシナリオを想像してみましょう。これは同じファイルで作業することを意味し、それらのファイルへの読み書きは衝突を引き起こす可能性があります。一般的には、これらのファイルを互いに分離したいと考えています。

だから、それらのファイルは読み取り専用されていない限り、あなたはあなたのJARに含めるべきではありません(それ以外の場合は結構です)

+0

には、フォルダ名とファイル名のみを指定するだけで、そのフォルダのフルパス名を知ることができるコードが必要です。追加してください。 –

0

あなたは、プログラム、または手動でEclipseを無視して、(それにしてファイル)のディレクトリを作成することができます。

Eclipseでプロジェクトエクスプローラビューを更新すると、ディレクトリとファイルがビューの一部になります。

2

Eclipseでプログラムを起動すると、デフォルトでプロセスの現在の作業ディレクトリがプロジェクトのルートディレクトリになります。そして、あなたはこのようなプロジェクトのルートにserializedという名前のディレクトリを初期化して使用することができます:あなたのコード内

File serializedDir = new File("serialized"); 
if (!serializedDir.exists()) { 
    serializedDir.mkdir(); 
} 

相対パスは、デフォルトでは、プロジェクトのルートで作業ディレクトリ、相対になります。ランチャー設定でデフォルトの作業ディレクトリを変更することができます。

これは良い解決策であるかどうかは、プロジェクトによって異なります。シリアライズされたオブジェクトを他の人と共有したくない/必要がない場合は、これに何も問題はありません。

Eclipseのエクスポート機能を使用してプロジェクトからjarを作成する場合、デフォルトでフォルダが選択されることに注意してください。あなたは明示的に選択を解除して瓶から除外しなければなりません。 (いずれにしても、MavenやAntをEclipseの代わりにjarファイルを生成するために使用する方が良いです。一度設定するだけで、ディレクトリが偶然に含まれる心配がありません)。

バージョンコントロールからディレクトリを除外します。

2

A)特定のフォルダへのアクセス/作成 B)実際にオブジェクトをシリアル化してディスクに保存します。 Aについては

)が、これは確かにどのように表示され、ここで他の回答で答えている: 1)フォルダが存在するかどうかを確認してください。 2)フォルダが存在しない場合は作成します。 はまた、日食に発売されたプロジェクトは、Eclipseプロジェクトフォルダの作業ディレクトリとして持っています。

B)では、FileOutputStreamを使用してオブジェクトをシリアル化する必要があります。 http://www.tutorialspoint.com/java/java_serialization.htmを参照してください。 各オブジェクトを別々のファイルにシリアル化することも、すべてのオブジェクトへの参照を含むArrayList(またはその他のデータ構造)を持つクラスを作成することもできます。

以下のサンプルクラスでは、静的メソッドの使用を頼んだだけで、オブジェクトをインスタンス化する必要はありませんでした。また、eclipseプロジェクトでF5キーを押してパッケージエクスプローラーを更新し、新しいフォルダーとファイルを表示する必要があります。 Eclipse内のプロジェクトと呼ばれる質問として

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.util.ArrayList; 


public class CreateDirAndSerialize { 


    public static void main(String args[]) 
    { 
     ArrayList<String> sampleString = new ArrayList<String>(); 
     sampleString.add("Test1"); 
     sampleString.add("Test2"); 
     sampleString.add("Test2"); 
     //Get the directory 
     File directory = getSerializedDirectory(); 
     writeObjects(directory, sampleString); 
    } 

    public static void writeObjects(File directory, Object object) 
    { 
     try 
      { 
      FileOutputStream fileOut = 
      new FileOutputStream(directory+"//serializedData"); 
      ObjectOutputStream out = 
           new ObjectOutputStream(fileOut); 
      out.writeObject(object); 
      out.close(); 
       fileOut.close(); 
      }catch(IOException i) 
      { 
       i.printStackTrace(); 
      } 
    } 

    public static File getSerializedDirectory() 
    { 
     File serializedDir = new File("serialized"); 
     if (!serializedDir.exists()) { 
      serializedDir.mkdir(); 
     } 
     return serializedDir; 
    } 

} 

は、上記Eclipseプロジェクト内のコードのためのものです。 Eclipse自体と対話したいのであれば、Eclipseプラグインの開発について話しています。これは別の話ですので、それを指定する必要があります。

最後に、任意の変数を保持するカスタムクラスを作成し、他のすべてのオブジェクトを格納するためのシングルトンオブジェクトをインスタンス化することもできます。ただし、オブジェクトを直列化するときにはいくつかの制限があります。 : - スタティック修飾子付きのオブジェクト参照はシリアル化できません。

は、いくつかの直列化可能のためのいくつかのルール/ヒントについては、これを参照してください:http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208

関連する問題