View Full Version : سوال: ورودی و خروجی فایل ها
lesner
سه شنبه 05 خرداد 1394, 22:08 عصر
سلام خدمت تمامی اساتید عزیز
دوستان ما یه برنامه داریم که توش از وکتورهایی از object ها استفاده شده حالا این object ها هم خودشون شامل یک سری فیلد ان از نوع String و یا حتی Integer
سوال اینجاست که چطور میشه تمامی این اطلاعات رو ذخیره کرد طوری که از دست نرن و دفعه ی بعدی که برنامه اجرا میشه از همونا استفاده کرد ؟
هدف فقط از دست نرفتن مقادیر این متغیر هاست.
آیا از چنین متودی میشه استفاده کرد ؟
public void write(String S){
FileOutputStream fout;
try
{
// Open an output stream
fout = new FileOutputStream ("myfile.txt");
// Print a line of text
new PrintStream(fout).println (S);
// Close our output stream
fout.close();
}
// Catches any error conditions
catch (IOException e)
{
System.err.println ("Unable to write to file");
System.exit(-1);
}
}
مشکلی که در مورد متود بالا وجود داره اینه که فقط آخرین رشته ای رو که بهش بدی ذخیره میکنه و اطلاعات قبلی از بین میره . حالا من خیلی آشنا نیستم با این کلاس های ورودی و خروجی :افسرده: بهترین کار چیه ؟!
kingtak
چهارشنبه 06 خرداد 1394, 02:28 صبح
اگه درست متوجه شده باشم.شما میخواهید آبجکت هایی که توشن خاصیت های استرینگ و عددی و... هست رو بخونی و ذخیره کنی....
خوب شما میتونی یک آرایه از نوع اون کلاس ایجاد کنی و هر بار کل آرایه رو بخونی و یا توی فایل بنویسی.
مثلا من چندین شیء از نوع کتاب دارم که کد کتاب نام کتاب و...رو توش نگه میداره.حالا یک آرایه از نوع کتاب ایجاد میکنم و هر بار که خواستم بخونم کل آرایه رو از روی فایل میخونم و موقع نوشتن کل آرایه رو مینویسم..:
مثلا:
Book[] bookList=new Book[1000];
public void readFile()
{
//Scanner scan=null;
try{
File file=new File("Book.txt");
scan=new Scanner(file);
}catch(FileNotFoundException e)
{
System.err.println("File not found!");
}
while(scan.hasNext())
{
int id=scan.nextInt();
String name=scan.next();
int page=scan.nextInt();
String author=scan.next();
String publisher=scan.next();
String loanDate=scan.next();
String returnDate=scan.next();
boolean status=scan.nextBoolean();
int borrowerId=scan.nextInt();
bookList[id]=new Book(id,name,page,author,publisher,loanDate,return Date,status,borrowerId);
}
scan.close();
}
یعنی من همیشه با آرایه ای که لیست اشیاء رو نگه میداره کار دارم ودر آخر برنامه یا هر جایی که لازم بود کل آرایه رو توی فایل مینویسم و یا میخونم...
کد نوشتن توی فایل هم اینه:
public void writeFile()
{
try{
File file=new File("Book.txt");
pw=new PrintWriter(file);
}catch(FileNotFoundException e)
{
System.err.println("File not found!");
}
for (int i = 0; i < bookList.length; i++) {
if(bookList[i]!=null)
pw.println(bookList[i].getId()+" "+bookList[i].getName()+" "
+bookList[i].getPage()+" "+bookList[i].getAuthor()+" "+bookList[i].getPublisher()
+" "+bookList[i].getLoanDate()+" "+bookList[i].getReturnDate()+" "+bookList[i].getStatus()+" "+bookList[i].getBorrowerId());
}
pw.close();
}
این کد واسه برنامه ای بود که قبلا نوشته بودم...ولی میتونه کمکت کنه.
lesner
چهارشنبه 06 خرداد 1394, 14:53 عصر
* خیلی مممنون من سیستم مشابه رو با vector پیاده سازی کردم که با یه مقدار تغیرات عملکرد مد نظرم رو گرفتم . بازم ممنون :تشویق:
محمد فدوی
چهارشنبه 06 خرداد 1394, 15:51 عصر
سلام.
کاری که شما میخواید انجام بدید اصطلاحا سریالی کردن شیء (Serialization) گفته میشه. لزومی نداره که سریالی کردن یه شیء دستی انجام بشه و جاوا خودش ابزار لازم برای اینکار رو داره. مثلا برای کار شما میشه از این کلاس استفاده کرد:
import java.io.*;
public class SerialUtils {
private SerialUtils() { }
public static void serialize(Object data, String path) throws IOException {
try(FileOutputStream fos = new FileOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(data);
}
}
public static <T> T desrialize(String path) throws IOException, ClassNotFoundException {
try(FileInputStream fis = new FileInputStream(path);
ObjectInputStream ois = new ObjectInputStream(fis)) {
return (T)ois.readObject();
}
}
}
برای اینکه ببینیم چجوری میشه ازش استفاده کرد هم این مثال رو ببینید:
public static void main(String[] args) {
final String FILE_PATH = "filename.dat";
// 1. Serialize
{
// java.utils.Vector is obsoleted
ArrayList<String> data = new ArrayList();
data.addAll(Arrays.asList("Foo", "Bar", "Baz", "Qux", "Norf"));
try {
SerialUtils.serialize(data, FILE_PATH);
} catch (IOException ex) {
System.out.println("Exception: " + ex.getMessage());
}
}
// 2. De-serialize
{
ArrayList<String> data;
try {
data = SerialUtils.desrialize(FILE_PATH);
for (String str : data) {
System.out.println(str);
}
} catch (IOException | ClassNotFoundException ex) {
System.out.println("Exception: " + ex.getMessage());
}
}
}
فکر میکنم هم عملکردش و هم نحوهی استفادهش دیگه روشن باشه.
پ.ن: من توی نمونهای که نوشتم از ArrayList به جای Vector استفاده کردم. کلاس java.utils.Vector خیلی وقته که دیگه منسوخ شدهست و معمولا بهترین جایگزین براش کلاس java.utils.ArrayList هست.
موفق باشید.
ahmad.mo74
چهارشنبه 06 خرداد 1394, 19:35 عصر
سلام. روش های زیادی برای ذخیره کردن داده ها هست.
xml معمولا بیشتر از بقیه روش ها استفاده میشه و محبوب تره. روش های دیگه ای هم مثل serialize کردن آبجکت، JSON و Properties file (http://www.mkyong.com/java/java-properties-file-examples/) ها و یا حتی میتونید از Preferences API (http://stackoverflow.com/questions/4017137/how-do-i-save-preference-user-settings-in-java) هم استفاده کنید.
بستگی به خود شما و داده ای که میخواید ذخیره کنید داره. باید ببینید با کدومش راحت ترید.
من یه لایبرری تقریبا کامل برای همین منظور نوشتم.
دانلود سورس (http://bit.ly/1cZwghc)
مثال هم توش هست میتونید استفاده کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.