PDA

View Full Version : سوال: خواندن از یک فایل بصورت شیء



mansoor69
پنج شنبه 09 دی 1389, 23:29 عصر
من در یک فایل بصورت شیء نوشتم حالا می خوام از این فایل بصورت شیء بخونم .شی اول رو می خونم اما بلد نیستم شی دوم و سوم و ... رو بخونم. من از ObjectOutputStream استفاده می کنم.در اصل برنامه من اینه که یه چیزی رو با یه فیلد از فایلی که خوندم مقایسه کنه اگه برابر نبود بره شی بعدی رو بخونه تا این که یه جا به جواب برسه. لطفا کمک کنید....

javaphantom
جمعه 10 دی 1389, 09:30 صبح
من در یک فایل بصورت شیء نوشتم حالا می خوام از این فایل بصورت شیء بخونم .شی اول رو می خونم اما بلد نیستم شی دوم و سوم و ... رو بخونم. من از ObjectOutputStream استفاده می کنم.در اصل برنامه من اینه که یه چیزی رو با یه فیلد از فایلی که خوندم مقایسه کنه اگه برابر نبود بره شی بعدی رو بخونه تا این که یه جا به جواب برسه. لطفا کمک کنید....

آرایه ای از شعی ها رو توی او فایلت درست کن. یک لیست از شی هایی که می خوای رو توش بریز و در درون فایل ذخیره کن بعد وقتی می خونی توی list بیا عمل مقایسه انجام بده

mansoor69
جمعه 10 دی 1389, 09:55 صبح
آرایه ای از شعی ها رو توی او فایلت درست کن. یک لیست از شی هایی که می خوای رو توش بریز و در درون فایل ذخیره کن بعد وقتی می خونی توی list بیا عمل مقایسه انجام بده
میشه بیشتر توضیح بدید.
برنامم طوریه که کاربر چند تا فیلد پر می کنه بعد برنامه همون جا یه شی درست می کنه بعد میریزه تو فایل . این کار رو بدون arraylist انجام میده .مشکل من اینه که شی اول رو با objectreader می خونم اما شی های بعدی رو بلد نیستم بخونم. منظورم از مقایسه هم مقایسه یک رشته با یه فیلد از شی ای است که خوندم.
حالا مشکل از نوع خوندنمه یا نوشتنش؟
برنامه هم که بسته میشه باید شی هایی که وارد کردم بمونن.پس فکر نکنم از arraylist لازم باشه استفاده کنم.

javaphantom
جمعه 10 دی 1389, 13:13 عصر
میشه بیشتر توضیح بدید.
برنامم طوریه که کاربر چند تا فیلد پر می کنه بعد برنامه همون جا یه شی درست می کنه بعد میریزه تو فایل . این کار رو بدون arraylist انجام میده .مشکل من اینه که شی اول رو با objectreader می خونم اما شی های بعدی رو بلد نیستم بخونم. منظورم از مقایسه هم مقایسه یک رشته با یه فیلد از شی ای است که خوندم.
حالا مشکل از نوع خوندنمه یا نوشتنش؟
برنامه هم که بسته میشه باید شی هایی که وارد کردم بمونن.پس فکر نکنم از arraylist لازم باشه استفاده کنم.


من یک قسمت کد نوشتم خودت کمک کن بهم و بیشتر بهم توضیح بده تا یک راه حلی برای مشکلت با هم پیدا کنیم


public class Person implements Serializable {

private String name;
private String family;
private String tel;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getFamily() {
return family;
}

public void setFamily(String family) {
this.family = family;
}

public String getTel() {
return tel;
}

public void setTel(String tel) {
this.tel = tel;
}


public static void main(String[] s) throws Exception {

Person p = new Person();
p.setName("babak");
p.setFamily("babak");
p.setTel("123");
/**
* writing
*/
ObjectOutputStream outputStream =
new ObjectOutputStream(new FileOutputStream(new File("/home/zack/Public/person.data")));

outputStream.writeObject(p);
outputStream.close();
/**
* reading
*/

ObjectInputStream inputStream =
new ObjectInputStream(new FileInputStream(new File("/home/zack/Public/person.data")));

Person person = (Person) inputStream.readObject();

System.out.println("person.getName() = " + person.getName());
System.out.println("person.getFamily() = " + person.getFamily());
System.out.println("person.getTel() = " + person.getTel());


}
}

mansoor69
جمعه 10 دی 1389, 14:23 عصر
از زحمات شما بسیار ممنونم.
اولا بگم که خودم تونستم چند تا شی بخونم.این برمانه که زحمت کشیدید نوشتید یک شی توی فایل می نویسه ویک شی هم می خونه.اما من می خوام چند تا شی بنویسم و چند تا شی بخونم.
که برای نوشتن روی فایل خودم با استفاده از این کد کردم.




Stud[] s=new Stud[2];
s[0]=new Stud(sn,studnum,faculty,majority);
s[1]=new Stud("uuuu",studnum,faculty,majority);


out.writeObject(s);


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



Stud[] s=(Stud[]) d.readObject();

حالا مشکل اینه که admin هر دفعه که وارد میشه یه شی از کلاس stud باید ساخته شه و در فایل قرار بگیره .و چوم admin از برنامه خارج میشه پس ارایه بدرد نمی خوره.چون با هر دفعه ورود و خروج admin, این ارایه از صفر شروع میکنه به نوشتن.که تو شکم که تو فایل رو شی قبلی میریزه یا نه.چون اسم کلاس و شماره ارایه با قبلی یکیه.اگه هم بدون ارایه بنویسم بازم مشکل قبلی پیش میاد که نمی تونه چند تا شی همزمان بخونه.امیدوارم مشکل رو بفهمید.پیشاپیش از همکاریتون ممنون.:تشویق:

javaphantom
جمعه 10 دی 1389, 15:01 عصر
اول از همه به این کد نگاه کن برات هر چندتا person ی که بخوای با همه جزییات توی یک فایل ذخیره می کنه و وقتی هم بری یک ماه دیگه برگردی همه رو برات دوباره نشون میده.

public class Person implements Serializable {

private String name;
private String family;
private String tel;

private List<Person> persons;

public List<Person> getPersons() {
return persons;
}

public void setPersons(List<Person> persons) {
this.persons = persons;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getFamily() {
return family;
}

public void setFamily(String family) {
this.family = family;
}

public String getTel() {
return tel;
}

public void setTel(String tel) {
this.tel = tel;
}


public static void main(String[] s) throws Exception {

LinkedList<Person> persons = new LinkedList<Person>();

Person p1 = new Person();
p1.setName("babak");
p1.setFamily("babak");
p1.setTel("123");

Person p2 = new Person();
p2.setName("ali");
p2.setFamily("ali");
p2.setTel("321");

persons.add(p1);
persons.add(p2);

p1.setPersons(persons);
/**
* writing
*/
ObjectOutputStream outputStream =
new ObjectOutputStream(new FileOutputStream(new File("/home/zack/Public/person.data")));

outputStream.writeObject(p1);
outputStream.close();
/**
* reading
*/

ObjectInputStream inputStream =
new ObjectInputStream(new FileInputStream(new File("/home/zack/Public/person.data")));

Person person = (Person) inputStream.readObject();

/*
System.out.println("person.getName() = " + person.getName());
System.out.println("person.getFamily() = " + person.getFamily());
System.out.println("person.getTel() = " + person.getTel());
*/

System.out.println("person.getPersons().size() = " + person.getPersons().size());

for (Person per : person.getPersons()) {
System.out.println("per.getName() = " + per.getName());
System.out.println("per.getFamily() = " + per.getFamily());
System.out.println("per.getTel() = " + per.getTel());
}


}
}

اما مشکل کار شما توی مدل کردن اطلاعاتتون هست. یک داستان از کارتو برامون توضیح بده تا بشه یک مدل درست در بیاریم.
اما اینکه شما دوباره داری روی فایل می نویسی و قدیمی پاک می شه بله کاملا درسته خوب اول بخون همرو قبلی رو هم بهش اضافه کن دوباره تو فایل بنویس. این برای مثال بود این راه حل.مشکل چندتا شی خوندنم که همین الان برات کد نوشتم که می شه این کار رو کرد با همون List ی که بهت گفتم . گفتی نمی شه. ولی من کرد و شد.

mansoor69
جمعه 10 دی 1389, 15:24 عصر
اول از همه به این کد نگاه کن برات هر چندتا person ی که بخوای با همه جزییات توی یک فایل ذخیره می کنه و وقتی هم بری یک ماه دیگه برگردی همه رو برات دوباره نشون میده.

public class Person implements Serializable {

private String name;
private String family;
private String tel;

private List<Person> persons;

public List<Person> getPersons() {
return persons;
}

public void setPersons(List<Person> persons) {
this.persons = persons;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getFamily() {
return family;
}

public void setFamily(String family) {
this.family = family;
}

public String getTel() {
return tel;
}

public void setTel(String tel) {
this.tel = tel;
}


public static void main(String[] s) throws Exception {

LinkedList<Person> persons = new LinkedList<Person>();

Person p1 = new Person();
p1.setName("babak");
p1.setFamily("babak");
p1.setTel("123");

Person p2 = new Person();
p2.setName("ali");
p2.setFamily("ali");
p2.setTel("321");

persons.add(p1);
persons.add(p2);

p1.setPersons(persons);
/**
* writing
*/
ObjectOutputStream outputStream =
new ObjectOutputStream(new FileOutputStream(new File("/home/zack/Public/person.data")));

outputStream.writeObject(p1);
outputStream.close();
/**
* reading
*/

ObjectInputStream inputStream =
new ObjectInputStream(new FileInputStream(new File("/home/zack/Public/person.data")));

Person person = (Person) inputStream.readObject();

/*
System.out.println("person.getName() = " + person.getName());
System.out.println("person.getFamily() = " + person.getFamily());
System.out.println("person.getTel() = " + person.getTel());
*/

System.out.println("person.getPersons().size() = " + person.getPersons().size());

for (Person per : person.getPersons()) {
System.out.println("per.getName() = " + per.getName());
System.out.println("per.getFamily() = " + per.getFamily());
System.out.println("per.getTel() = " + per.getTel());
}


}
}


به کد هایی که شما نوشتید و من قرمز کردم توجه کنید نوشتید من نمیتونم هر دفعه بیام p1 رو تبدیل به p2 کنم.تا شی جدید رو شی قدیم قرار نگیره.از طرفی هم باید اسم شی جدید با اسم شی قبلی فرق داشته باشه تا شی جدید رو شی قدیم قرار نگیره.این جا رو اگه می تونید یه ترفندی رو ارایه کنید بسیار از زحماتتون ممنونم

javaphantom
جمعه 10 دی 1389, 16:13 عصر
به کد هایی که شما نوشتید و من قرمز کردم توجه کنید نوشتید من نمیتونم هر دفعه بیام p1 رو تبدیل به p2 کنم.تا شی جدید رو شی قدیم قرار نگیره.از طرفی هم باید اسم شی جدید با اسم شی قبلی فرق داشته باشه تا شی جدید رو شی قدیم قرار نگیره.این جا رو اگه می تونید یه ترفندی رو ارایه کنید بسیار از زحماتتون ممنونم

اول از همه این چیزی که من برای شما کد کردم فقط یک ماکت کوچیکی بود که به شما نشون بدم که می تونید آرایه ای از Object ها رو هم در فایل ذخیره کنید. اینکه شما می گید من نمی تونم این کارو بکنم یا اون کارو بکنم، که در پست اول هم گفتید من نمی تونم این کار رو انجام بدم و من فقط خواستم بگم که می شه انجام داد. کد گذاشته شده اصلا مدل درستی نیست برای اینکه من خودم اولش گفتم که این کد رو نوشتم که بدونم مشکل کار شما کجاست. من هنوزم نفهمیدم که شما دقیقا چی می خواین تا وقتی که تعریف کلی از کاری که می خواهین انجام بدین رو نفهمم نمی تونم کمکتون کنم.

admin می خواد دانشجو ثبت نام کنه؟ ۴ تا ثبت نام کرد رفت فردا اومد بازم خواست ثبت نام کنه قبلی ها پاک می شه؟ کلا بیشتر توضیح بدین. همین.

mansoor69
جمعه 10 دی 1389, 20:31 عصر
اول از همه این چیزی که من برای شما کد کردم فقط یک ماکت کوچیکی بود که به شما نشون بدم که می تونید آرایه ای از Object ها رو هم در فایل ذخیره کنید. اینکه شما می گید من نمی تونم این کارو بکنم یا اون کارو بکنم، که در پست اول هم گفتید من نمی تونم این کار رو انجام بدم و من فقط خواستم بگم که می شه انجام داد. کد گذاشته شده اصلا مدل درستی نیست برای اینکه من خودم اولش گفتم که این کد رو نوشتم که بدونم مشکل کار شما کجاست. من هنوزم نفهمیدم که شما دقیقا چی می خواین تا وقتی که تعریف کلی از کاری که می خواهین انجام بدین رو نفهمم نمی تونم کمکتون کنم.

admin می خواد دانشجو ثبت نام کنه؟ ۴ تا ثبت نام کرد رفت فردا اومد بازم خواست ثبت نام کنه قبلی ها پاک می شه؟ کلا بیشتر توضیح بدین. همین.
شرمنده عصبانیتون کردم.برنامم پرژه پایانی درس java هستش برا همین نمی تونم همش رو تو سایت بزنم اگه ایمیلتون رو بدید براتون می فرستمش تا این تیکه رو کمکم کنید حالا چند قسمت که مربوط به مشکلم میشه رو میگم. این برنامه که برنامه آموزش دانشگاه هستش دو position داره مدیر
(admin) ودیگری دانشجو.که مدیر کار بیشتری رو میتونه انجام بده. دو تا هم فایل داره که یه فایل اسمش login هستش که user و pass رو نگهداری میکنه کهبرای دانشجو همون اسم و شماره دانشجوییشه. فایل دوم که من روش گیر دارم اسمش stud هستش که اسم دانشجو و شماره دانشجویی و ... رو بصورت object توش میشه ذخیره کرد.حالا مدیر که سطح دسترسی بیشتری تو برنامه داره (یعنی کار بیشتری میتونه انجام بده) باید با دادن user و pass (خودش که این user و pass از قبل تو فایل login که توش user و pass هر position قرار داره ) عبور کنه و وارد option خودش بشه که در این option هاش یکی شون ثبت دانشجو جدیده .
حالا میرم سر اصل مشکل : تو یه فریمی که مدیر دانشجو ثبت میکنه چند تا textfeild هست یه اسم و شماره دانشجو و .... هست تو این فریم دکمه create رو گذاشتم که کارش اینه که این فیلد ها رو میگیره اسم و شمارش رو تو فایل login به عنوان user و pass . که ما به login کار نداریم.
همچنین کار دیگه create اینه که مدیر این فیلد ها رو که گرفته در شی ای به اسم مثلا p از کلاس person قرار میده و بصورت شی در فایل stud قرارمیده.حالا اینجایی که شی در فال stud قرار میگیره مدیر هر دفعه که یه دانشجو ثبت میکنه این دکمه هم هر دفعه شی ای به اسم p رو تو ایل قرار میده یعنی با همون اسم شی قبلی در همون فایل stud که باعث میشه برای خواندن این شی ها
objectreader شی ها رو از هم تشخیص نده و همه شی ها رو که به اسمه p ذخیره شدن یه شی اول رو بتونه بخونه و شی های دیگه رو نمیشناسه . حالا اگه با آرایه هم بنویسمش با هر بار ورود و خروج مدیر این آرایه ازصفر شروع می کنه به نوشتن چون هربار که فریمش new شد آرایه هم دوباره تعریف واز صفر شروع می کنه به نوشتن. حالا باید کاریکرد که هربارشی با اسمه متفاوتینسبت به قبل ذخیره بشه .راه هایی هم که گفتید همه رو امتحان کردم کردم اما نشد.کمکم کنید یه دنیا ممنونتونم تا حالا خیلی زحمتتون دادم اگه طولانی شد هم شرمنده چون دیگه می خواستم کامل متوجه بشید

javaphantom
شنبه 11 دی 1389, 08:56 صبح
سلام من عصبانی نشدم. ببین من از صبح تا حالا بعد گرفتار شدم ولی این چیزی که برات نوشتم کار می کنه و حس می کنم همون چیزی هست که تو می خوای اگر نفهمیدی چه جوری کار می کنه بازم بگو تا بیشتر راهنماییت کنم ولی تما م مشکلات قبلیت رو حل کرده من تستشم برات گذاشتم.


public class Students implements Serializable {

public List<Student> students;

public List<Student> getStudents() {
return students;
}

public void setStudents(List<Student> students) {
this.students = students;
}
}



public class Student implements Serializable{

private String id;
private String name;
private String family;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getFamily() {
return family;
}

public void setFamily(String family) {
this.family = family;
}
}




public class Business {

public static String PATH = "C:\\student.dat";
private File file = new File(Business.PATH);

public Students getAllStudents() throws Exception {

if (!this.checkFileForExist()) throw new Exception();

if (file.length() == 0) {
return new Students();
}

ObjectInputStream in = new ObjectInputStream(new FileInputStream(Business.PATH));
Students students = (Students) in.readObject();
in.close();

return students;
}


public List<Student> distinctStudent(List<Student> newStudentList) throws Exception {

Students students = this.getAllStudents();

Collection<Student> oldStudentList = students.getStudents();


if (oldStudentList == null || oldStudentList.size() == 0) {
students.setStudents(newStudentList);
return students.getStudents();
}

System.out.println("oldStudentList.size() = " + oldStudentList.size());
LinkedList<Student> studentLinkedList = new LinkedList<Student>();


for (Iterator<Student> it = oldStudentList.iterator(); it.hasNext();) {
Student oldStudent = it.next();
for (Student newStudent : newStudentList) {
if (newStudent.getId().equals(oldStudent.getId())) {
it.remove();
break;
}
}
}


System.out.println("oldStudentList.size() = " + oldStudentList.size());

for (Student oldStudent : oldStudentList) {
studentLinkedList.add(oldStudent);
}

for (Student newStudent : newStudentList) {
studentLinkedList.add(newStudent);
}

students.setStudents(studentLinkedList);

return students.getStudents();
}

public Students addOneStudent(Student newStudent) throws Exception {
if (newStudent.getId() == null || newStudent.getId().isEmpty()) {
throw new Exception();
}

LinkedList<Student> studentLinkedList = new LinkedList<Student>();
studentLinkedList.add(newStudent);

List<Student> distinctList = this.distinctStudent(studentLinkedList);

Students students = new Students();
students.setStudents(distinctList);

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(Business.PATH));
out.writeObject(students);
out.close();

return students;

}

public boolean checkFileForExist() throws Exception {
if (!file.exists()) {
boolean b = file.createNewFile();
return b;
}
return true;
}
}


این هم تستش که می تونی ببینی کار می کنه من چرت ننوشتم


public class BusinessTest {

private Business biz = new Business();

@Ignore
@Test
public void testGetAllStudents() throws Exception {
Students students = biz.getAllStudents();
System.out.println("students.getStudents().size() = " + students.getStudents().size());
Assert.assertNotNull(students);
}


// @Ignore
@Test
public void testAddOneStudent() throws Exception {
Student st1 = new Student();
st1.setName("babak");
st1.setFamily("azarmi");
st1.setId("1");

Students students = biz.addOneStudent(st1);
Assert.assertEquals(1,students.getStudents().size( ));
}


}


من فقط یک توضیح کوتاه بهت بدم که بدونی

student یک فیلد داره به نام ID که باید unique باشه یعنی یکتا تا اینکه دانشجوی تکراری نداشته باشی.

اگر دانشجوی تکراری بفرسی یعنی خواستی قبلی رو edit کنی و چیزی به لیست دانشجوهات اضافه نمی شه.
هر وقتم که اضافه می کنی قبلی ها سرجاشونن