PDA

View Full Version : ایجاد فرمت خاص برای برنامه



dasssnj
پنج شنبه 25 اردیبهشت 1393, 10:06 صبح
سلام می خواستم بدونم چطوری برنامه هایی مثل فتوشاپ و... برای ذخیره ی اطلاعاتشون یه فرمت خاص می سازند . مثلا psd .
حالا من می خوام تنظیمات برنامه ام را توی فایلی مثلا با فرمت kvl ذخیره کنم که فایل txt نباشه و به صورت باینری در بیاد.یعنی کاربر نتونه تغییرش بده.
لطفا کمکم کنید . اگه سورسی هم دارید بذارید.
ممنون.

persianshadow
پنج شنبه 25 اردیبهشت 1393, 11:42 صبح
خب یه حالت ساده اینه که شما توی برنامه خودتون یه کلاس دارید که وظیفه اش نگهداری پارامترهای برنامه است. کافیه اون کلاس رو serialize کنید و روی دیسک با هر extension ی که دوست دارید ذخیره کنید و بعد برای باز کردن اون فایل رو deserialize کنید و خب طبعآ کلاس رو دارید و ادامه ماجرا. روش های دیگه ای هم هست...

dasssnj
پنج شنبه 25 اردیبهشت 1393, 11:48 صبح
خب یه حالت ساده اینه که شما توی برنامه خودتون یه کلاس دارید که وظیفه اش نگهداری پارامترهای برنامه است. کافیه اون کلاس رو serialize کنید و روی دیسک با هر extension ی که دوست دارید ذخیره کنید و بعد برای باز کردن اون فایل رو deserialize کنید و خب طبعآ کلاس رو دارید و ادامه ماجرا. روش های دیگه ای هم هست...

میشه یه سورس بدید .
چجوری سریالیز کنم؟

vahid-p
پنج شنبه 25 اردیبهشت 1393, 14:31 عصر
کافیه اون کلاسی که اطلاعاتی داره که باید ذخیره بشه رو به صورت زیر بنویسید :
import java.io.Serializable;

public class Test implements Serializable{
private String name;
private int width;
private int height;
private byte[][] red;
private byte[][] green;
private byte[][] blue;

// توابع getter و setter و...

}


( در پرانتز اینکه فکر کنم این اینترفیس بود که یه محدودیتی داشت ولی یادم نمیاد چی بود! :لبخند:)

هر کلاسی رو میتونید به این صورت کاری کنید که بتونید فیلدهاشو ذخیره کنید ( متد ذخیره نمیشه و دلیلش هم واضحه چرا ). ضمنا اینجا مثلا کلاسی مخصوص ذخیره اطلاعات استفاده کردیم، ولی حتی اگر یک کلاس دیگری بود که در برنامه ازش استفاده میکنید و میخواهید ذخیره کنید و از طرفی بعضی فیلد ها مثل FileIn/outputStream ها و کانتر ها و... که نمیخواید ذخیره بشن و اطلاعات استفاده در حالت Runtime است رو قبلش transient بنویسید. مثلا private transient int count;
حالا با هر فرمتی .kvl یا هر چیزی که دوست دارید خروجی بدید. توسط کلاس ObjectOutputStream . به این صورت :

try {
ObjectOutputStream outputStream=new ObjectOutputStream(new FileOutputStream("output.kvl"));
outputStream.writeObject(yourObject); //آبجکتی که میخواهید در فایل ذخیره شود
outputStream.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(Test.class.getName()).log(Level.S EVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Test.class.getName()).log(Level.S EVERE, null, ex);
}

این فایل رو دخیره کرد.
حالا هر وقت خواستید فایل رو باز کنید و کل اون آبجکت رو دوباره داشته باشید به سادگی همون قبلی :

try {
try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("output.kvl"))) {
Test test=(Test) inputStream.readObject();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(Test.class.getName()).log(Level.S EVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Test.class.getName()).log(Level.S EVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Test.class.getName()).log(Level.S EVERE, null, ex);
}


نکتش همون Casting هست.یعنی شما دارید به برنامه میگید، من میدونم این فایل از فلان کلاس ساخته شده و اگر کلاس ها همخوانی نداشت Exception میده!

موفق باشید

dasssnj
شنبه 27 اردیبهشت 1393, 11:18 صبح
ممنون ولی من یه List داشتم ولی بعد از دوباره لود کردن کلاس خودش هست ولی ابجکت هایی که توش اضافه کرده بودم نیست.