[Programming] Giúp Em về lỗi Thao tác với File trong java! |
16/12/2008 06:39:33 (+0700) | #1 | 162621 |
hacdiepbvh
Member
|
0 |
|
|
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
|
|
Em đang học java.io thì gặp vướng mắc,Mong anh em giúp đỡ
//
xây dựng lớp Người
import java.io.*;
class Nguoi implements Serializable{
private String hoten;
private String diachi;
public Nguoi(){
this.hoten="";
this.diachi="";
}
public Nguoi(String hoten,String diachi){
this.hoten=hoten;
this.diachi=diachi;
}
public String getName(){
String s;
s=this.hoten;
return s;
}
public String getDC(){
String s;
s=this.diachi;
return s;
}
public String toString(){
String s;
s="Ho va Ten: "+this.hoten+"\nDia Chi: "+this.diachi;
return s;
}
}
//xây dựng lớp ThiSinh,Kế thừa Lớp Người
import java.io.*;
import java.util.*;
class ThiSinh extends Nguoi implements Serializable{
private int diem1;
private int diem2;
private int diem3;
public ThiSinh(){
super();
this.diem1=0;
this.diem2=0;
this.diem3=0;
}
public ThiSinh(String hoten,String diachi,int diem1,int diem2,int diem3){
super(hoten,diachi);
this.diem1=diem1;
this.diem2=diem2;
this.diem3=diem3;
}
public String toString(){
String s;
s=super.toString()+"\nDiem Mon 1: "+this.diem1+"\nDiem Mon 2: "+this.diem2+
"\nDiem Mon 3: "+this.diem3;
return s;
}
}
//Ghi vao File
import java.io.*;
class ghi{
public static void main(String args[])throws Exception{
FileOutputStream f=new FileOutputStream("C:\\an.doc",true);
ObjectOutputStream out=new ObjectOutputStream(f);
ThiSinh ts1=new ThiSinh("abc","dia chi",10,4,6);
ThiSinh ts=new ThiSinh("an","hong thai",1,10,10);
out.writeObject(ts);
out.close();
}
}
//Doc doi tuong tu File
import java.io.*;
class doc{
public static void main(String args[])throws Exception{
FileInputStream f1=new FileInputStream("C:\\an.doc");
ObjectInputStream in=new ObjectInputStream(f1);
try{
while(true){
ThiSinh ts=(ThiSinh)in.readObject();
System.out.println(ts);
}
}
catch(Exception e){
in.close();
}
}
}
*********************
vấn đề của Em là khi đọc File thì chỉ đọc được đối tượng đầu tiên trong File,Em muốn đọc hết các đối tượng trong file ra
thì phải làm sao?Em đã làm sai phần nao,Mong các bác chỉ giúp
cám ơn các bác nhiều! |
|
|
|
|
[Question] Re: Giúp Em về lỗi Thao tác với File trong java! |
16/12/2008 07:42:57 (+0700) | #2 | 162628 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
http://forums.sun.com/thread.jspa?forumID=62&threadID=5184703
tóm tắt thì thế này, bạn không thể thêm object vào file bằng cách append thông thường.
Trong 1 lần mở file và ghi một vài object vào đó, ObjectOutputStream sẽ ghi một header trước, sau đó là data của các object. Khi bạn mở file lại và append thêm các object vào, sẽ có thêm 1 header nữa ghi tiếp vào file. ObjetInputStream khi đọc đến header thứ 2 này sẽ bị lỗi (dữ liệu là header chứ không phải là object cần đọc).
Cách khắc phục là khi bạn cần append thêm dữ liệu, hãy đọc hết dữ liệu ra ngoài, thêm vào các object mới rồi overwrite lại data file với dữ liệu đã cập nhật. |
|
|
|
|
[Question] Re: Giúp Em về lỗi Thao tác với File trong java! |
16/12/2008 09:02:21 (+0700) | #3 | 162635 |
hacdiepbvh
Member
|
0 |
|
|
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
|
|
Cám ơn Bạn nhé!
Mình không thể trở thành Programmer được rồi,buồn quá! |
|
|
|
|
[Question] Re: Giúp Em về lỗi Thao tác với File trong java! |
16/12/2008 12:24:29 (+0700) | #4 | 162656 |
hacdiepbvh
Member
|
0 |
|
|
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
|
|
Tiện thể bạn cho mình hỏi luôn cái này:
Mình đang làm một chương trình nhỏ có sủ dụng Socket
Server:
ObjectInputStream ino=new ObjectInputStream(new FileInputStream("C:\\an.doc"));
try{
while(true){
ThiSinh ts1=(ThiSinh)ino.readObject();
out.writeObject(ts1);
}
}
catch(Exception e){
ino.close();
}
Client :
try{
while(true){
ThiSinh thi=(ThiSinh)in.readObject();
arr.add(thi);
}
}
catch(Exception e){
in.close();
}
Object a[]=arr.toArray();
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
Client Yêu cấu Server trả về Các đối tượng được Lưu trong File an.doc. Mình Làm như trên và thấy bên Client Không hiển thị gì cả.
Mình đã làm sai phần nào?Hướng dẫn mình với!
thanks! |
|
|
|
|
[Question] Re: Giúp Em về lỗi Thao tác với File trong java! |
16/12/2008 18:24:03 (+0700) | #5 | 162674 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
Tránh "tiện thể". Mỗi chủ đề riêng cho một vấn đề cần hỏi.
Tôi chỉ có một đề nghị nhỏ: tránh các vòng lặp kiểu while (true). Điều kiện "true" hay "false" nên được tạo ra (khi nào true, khi nào false, khi nào nên true, khi nào nên false) trước khi đưa nó vào vòng lặp. Nếu áp đặt "true" như thế mà thành thói quen thì về sau sẽ... chảy mỡ não ra đấy. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Re: Giúp Em về lỗi Thao tác với File trong java! |
17/12/2008 00:57:11 (+0700) | #6 | 162685 |
hacdiepbvh
Member
|
0 |
|
|
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
|
|
Vâng,Cám ơn bác đã nhắc nhở,Lần sau Em sẽ không "tiện thể " nữa.
Bình thường Em vẫn dùng while(true) để đọc dữ liệu từ File, va sau khi dọc đến cuối File thì kết thúc vòng lặp mà,nhưng đọc từ socket thì sau khi dọc hết đối tượng đươc Server gửi đến thì vẫn không thoát khỏi vòng lặp,cũng không thấy báo lỗi,khai sáng cho Em với!
thanks! |
|
|
|
|
[Question] Re: Giúp Em về lỗi Thao tác với File trong java! |
17/12/2008 01:14:13 (+0700) | #7 | 162687 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
hacdiepbvh wrote:
Vâng,Cám ơn bác đã nhắc nhở,Lần sau Em sẽ không "tiện thể " nữa.
Bình thường Em vẫn dùng while(true) để đọc dữ liệu từ File, va sau khi dọc đến cuối File thì kết thúc vòng lặp mà,nhưng đọc từ socket thì sau khi dọc hết đối tượng đươc Server gửi đến thì vẫn không thoát khỏi vòng lặp,cũng không thấy báo lỗi,khai sáng cho Em với!
thanks!
OK, một ví dụ xác thực cho cái "input stream" ở trên.
Code:
try {
FileInputStream fis = new FileInputStream(args[0]);
DataInputStream in = new DataInputStream(fis);
while (in.available() !=0) {
System.out.println (in.readUTF());
}
in.close();
}
catch (Exception e) {
System.err.println("File input error");
}
Đoạn trên cho thấy, while(in.available() != 0) là điều kiện cách cụ thể rằng: nếu data input có giá trị != 0 (không empty) thì mới tiếp tục "while". Còn nếu cứ while(true) khơi khơi thì bắt nó đọc mãi mãi sao?
Vòng lặp được tạo ra như con dao hai lưỡi. Nó tiện dụng nhưng nguy hiểm. Nguy hiểm ở chỗ nếu không kiểm soát vòng lặp đúng với điều kiện đưa ra thì nó sẽ thực thi mãi mãi --> hết mem, hết CPU, hết đĩa, treo máy.... |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
|