2013-03-29 13 views
5

Tôi muốn tuần tự hóa một số đối tượng trong mã Java của mình. Tôi không muốn đặt nó trong một số thư mục ngẫu nhiên trên ổ đĩa cứng. Tôi muốn nó ở bên trong A FOLDER trong thư mục project eclipse của tôi. Làm thế nào để làm cho thư mục này và lưu trữ các đối tượng của tôi trong đó?Làm thế nào để tạo một thư mục trong nhật thực để lưu trữ các đối tượng được tuần tự hóa?

Đây có phải là phương pháp hay không? Sẽ có vấn đề gì nếu tôi cố gắng tạo một JAR độc lập khỏi dự án này?

Trả lời

6

Dưới mã nguồn cho thấy làm thế nào để tạo thư mục con trong thư mục hiện hành:

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

Khi bạn chạy mã nguồn này và làm mới dự án Eclipse bạn sẽ thấy serialized thư mục trong cấu trúc dự án Eclipse. Bây giờ bạn có thể sử dụng nó và lưu trữ tất cả các tệp trong đó.

Trong ứng dụng của mình, khi tôi muốn lưu trữ một số dữ liệu trong ổ cứng, tôi luôn sử dụng đề xuất của người dùng. Tôi tạo tệp application.properties chứa khóa:

working.folder=/example/app-name 

Ứng dụng đọc tệp này lúc bắt đầu và tạo thư mục này nếu cần. Giải pháp thứ hai có thể là "tham số ứng dụng". Khi tôi chỉ cần một hoặc hai tham số từ người dùng, tôi đọc nó từ dòng lệnh. Ví dụ người dùng chạy ứng dụng của tôi sử dụng lệnh:

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

Khi người dùng không cung cấp bất kỳ thư mục tôi sử dụng thư mục mặc định - thư mục hiện.

liên kết hữu ích:

+1

+1 cho câu trả lời toàn diện với mã làm việc. –

3

Phụ thuộc vào thông tin mà các đối tượng có thể tuần tự hóa đó có.

Ngoài ra nếu bạn muốn có một thư mục bên trong codebase của bạn (nhưng triển khai như chỉ là một thư mục), bạn có thể viết mã, để viết hoặc đọc các file:

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

Lưu ý thư mục phải ở trong classpath.

+0

làm cách nào bạn thực hiện điều này trong nhật thực? Đó là tạo thư mục bên trong dự án java của bạn và sau đó cho phép mã của bạn viết và đọc từ thư mục này? –

+1

Tôi đoán bạn nhận thức được thực tế, bất kỳ thư mục nào bạn tạo bên trong nhật thực sẽ thực sự là một thư mục trong hệ thống thư mục. –

+0

Vì vậy, hãy nói dự án của bạn là ProjA, nguồn của bạn là ProjA/src ... Tạo một thư mục trong ProjA/res từ trình khám phá và làm mới trong nhật thực và bạn sẽ thấy thư mục ở đó (Ở đây bạn có thể giữ các đối tượng được tuần tự hóa của mình). –

2

Bạn không viết thư cho người dùng tốt hơn, ví dụ: trong thư mục con như .myApp/?

Bạn sẽ làm một cái gì đó như thế này để thiết lập/khởi tạo thư mục:

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

Có một cái nhìn here để tìm ra nơi userDir thường nằm (mặc dù bạn không nhất thiết cần phải quan tâm).

+0

Làm thế nào để bạn làm điều đó? Tôi cần các bước. –

3

bước:

  1. Nhấp chuột phải thư mục của dự án của bạn trong Package Explorer
  2. Xác định vị trí "mới" mục trình đơn và di chuột nó
  3. Xác định vị trí "Folder" trong mở và nhấp vào nó
  4. Đặt tên cho thư mục của bạn
  5. Nhấp vào Nút "Hoàn tất" ở dưới cùng

Điều này sẽ tạo thư mục có thể truy cập được từ thư mục làm việc của bạn khi chạy trong nhật thực.

Đó là một ý tưởng tồi để fiddle với các tệp nằm trong tệp JAR trong thời gian chạy. Hãy tưởng tượng một kịch bản khi có hai hoặc nhiều JVM chạy cùng một JAR, điều này cũng có nghĩa là chúng hoạt động với cùng một tệp và đọc/ghi các tệp đó có thể gây ra xung đột. Nói chung, bạn sẽ muốn tách các tệp đó khỏi nhau.

Vì vậy, trừ các tập tin là chỉ đọc, bạn không nên đưa vào JAR của bạn (nếu không nó là tốt)

+0

cần một số mã có thể tìm ra tên đường dẫn đầy đủ của thư mục đó bằng cách chỉ cung cấp tên của thư mục và tên tệp. Vui lòng thêm. –

0

Bạn có thể bỏ qua Eclipse và tạo thư mục (và các file trong đó) lập trình, hoặc bằng tay.

Sau đó, làm mới chế độ xem trình thám hiểm dự án của bạn trong Eclipse, và thì đấy, thư mục và tệp là một phần của chế độ xem.

2

Nếu bạn khởi động chương trình của mình trong Eclipse, thì theo mặc định, thư mục làm việc hiện tại của quy trình sẽ là thư mục gốc của dự án. Sau đó, bạn có thể khởi tạo và sử dụng một thư mục có tên serialized trong thư mục gốc của dự án của bạn như thế này:

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

đường dẫn tương đối trong mã của bạn sẽ tương đối thư mục làm việc, đó là gốc của dự án theo mặc định. Bạn có thể thay đổi thư mục làm việc mặc định trong cấu hình trình khởi chạy.

Nó phụ thuộc vào dự án của bạn cho dù đây là một giải pháp tốt hay không. Nếu bạn không muốn/cần phải chia sẻ các đối tượng serialized với những người khác sau đó tôi thấy không có gì sai với điều này.

Khi sử dụng chức năng Xuất của Eclipse để tạo một cái bình từ dự án, hãy nhớ rằng thư mục sẽ được chọn theo mặc định. Bạn phải bỏ chọn nó một cách rõ ràng để loại trừ khỏi lọ. (Trong bất kỳ trường hợp nào, tốt hơn là sử dụng Maven hoặc Ant để tạo ra các jars thay vì Eclipse, mà bạn chỉ phải cấu hình một lần, vì vậy không cần phải lo lắng về việc thư mục được đưa vào một cách ngẫu nhiên.)

Bạn cũng có thể muốn loại trừ thư mục khỏi kiểm soát phiên bản.

2

Để thực hiện việc này, bạn cần hai thứ: A) Truy cập/Tạo thư mục cụ thể B) Thực tế sắp xếp các đối tượng của bạn và lưu chúng vào đĩa.

Đối với A) điều này chắc chắn được trả lời bằng các câu trả lời khác tại đây cho biết cách thực hiện: 1) Kiểm tra xem thư mục có tồn tại không. 2) Tạo thư mục nếu nó không tồn tại. Ngoài ra, các dự án được khởi chạy trong nhật thực có như thư mục làm việc của thư mục dự án eclipse.

Đối với B), bạn cần phải sắp đặt từng hàng các đối tượng của mình bằng FileOutputStream. Xem http://www.tutorialspoint.com/java/java_serialization.htm. Bạn có thể sắp xếp từng đối tượng vào một tệp riêng biệt hoặc tạo một lớp với một ArrayList (hoặc một số cấu trúc dữ liệu khác) có chứa tham chiếu đến tất cả các đối tượng.

Bên dưới một ví dụ Lớp làm đúng những gì bạn đã hỏi bằng cách sử dụng Phương thức tĩnh vì tôi không muốn khởi tạo đối tượng. Ngoài ra, bạn cần nhấn F5 trong dự án eclipse của bạn để làm mới gói thám hiểm và xem thư mục và tệp mới.

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

} 

Khi câu hỏi được đề cập đến trong dự án, ở trên là mã trong dự án nhật thực. Nếu bạn muốn tương tác với Eclipse, chúng ta đang nói về phát triển plugin eclipse, đó là một câu chuyện hoàn toàn khác, do đó bạn cần phải xác định điều đó.

Cuối cùng, bạn cũng có thể tạo một lớp tùy chỉnh chứa bất kỳ biến nào bạn muốn và khởi tạo một đối tượng đơn để chứa tất cả các đối tượng khác của bạn. Tuy nhiên, có một số hạn chế khi sắp xếp các đối tượng, ví dụ: : - Tham chiếu đối tượng với công cụ sửa đổi tĩnh không thể tuần tự hóa được.

Xem phần này để biết một số quy tắc/mẹo cho một số quy tắc có thể tuần tự hóa: http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208

Các vấn đề liên quan