banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Giúp Em về lỗi Thao tác với File trong java!  XML
  [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

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
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!
[Up] [Print Copy]
  [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
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
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.
[Up] [Print Copy]
  [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

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
Cám ơn Bạn nhé!
Mình không thể trở thành Programmer được rồi,buồn quá! smilie
[Up] [Print Copy]
  [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

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
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!
[Up] [Print Copy]
  [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
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
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.
[Up] [Print Copy]
  [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

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
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!
[Up] [Print Copy]
  [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
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

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.
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 17/12/2008 02:17:10 (+0700) | #8 | 162691
hacdiepbvh
Member

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
Vâng,Em đã hiểu,Cám ơn Bác!
đúng là nói chuyện với người hiểu biết có mấy câu mà hơn đọc sách cả tháng. Thấy bác cũng tương đối dễ tính Em liều hỏi bác câu nữa:
làm sao để lấy được số byte mà server gửi cho client? Em dùng hàm socket.getInputStream().available() thì nó luôn cho kết quả là 0.
dù thế nào thì bác cũng đừng chửi Em đấy!
thanks!
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 17/12/2008 17:42:03 (+0700) | #9 | 162789
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

hacdiepbvh wrote:
Vâng,Em đã hiểu,Cám ơn Bác!
đúng là nói chuyện với người hiểu biết có mấy câu mà hơn đọc sách cả tháng. Thấy bác cũng tương đối dễ tính Em liều hỏi bác câu nữa:
làm sao để lấy được số byte mà server gửi cho client? Em dùng hàm socket.getInputStream().available() thì nó luôn cho kết quả là 0.
dù thế nào thì bác cũng đừng chửi Em đấy!
thanks! 


Mơ hồ quá. Dùng hàm socket.getInputStream().available() cụ thể như thế nào? Thảy đoạn code lên xem?
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 17/12/2008 23:20:16 (+0700) | #10 | 162802
[Avatar]
0xdeadbeef
Member

[Minus]    0    [Plus]
Joined: 19/11/2005 03:51:16
Messages: 6
Offline
[Profile] [PM]

hacdiepbvh wrote:
Vâng,Em đã hiểu,Cám ơn Bác!
đúng là nói chuyện với người hiểu biết có mấy câu mà hơn đọc sách cả tháng. Thấy bác cũng tương đối dễ tính Em liều hỏi bác câu nữa:
làm sao để lấy được số byte mà server gửi cho client? Em dùng hàm socket.getInputStream().available() thì nó luôn cho kết quả là 0.
dù thế nào thì bác cũng đừng chửi Em đấy!
thanks! 

Nếu không có trao đổi trên socket thì dĩ nhiên socket.getInputStream().available() == 0. Nếu không ngại blocking thì xài InputStream.read.
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 02:59:27 (+0700) | #11 | 162850
hacdiepbvh
Member

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
Là như Thế này:
Bên phía Server Em đọc các đối tượng từ File,sau đó gửi qua Client

ObjectInputStream ino=new ObjectInputStream(new FileInputStream("C:\\an.doc"));
try{
while(true){
ThiSinh ts2=(ThiSinh)ino.readObject();
out.writeObject(ts2);
System.out.println(ts2);
}
}
catch(Exception e){
ino.close();
}

Phía Client:

try{
while(sc.getInputStream().available()!=0){
ThiSinh thi=(ThiSinh)in.readObject();
System.out.println(thi);
}
}
catch(Exception e){
in.close();
}

Em đã thử nếu dùng while(true):

try{
while(true){
ThiSinh thi=(ThiSinh)in.readObject();
System.out.println(thi);
break;
}
}
catch(Exception e){
in.close();
}
Nếu làm như trên thì vẫn đọc được một đối tượng đầu tiên ra mà
Có nghĩa là Server đã gửi được đối tượng đến Client
Nhưng
sc.getInputStream().available()!=0 không đúng.

Em sai ở Chỗ nào ạ?
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 03:25:26 (+0700) | #12 | 162854
[Avatar]
4hfoo
Elite Member

[Minus]    0    [Plus]
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
[Profile] [PM]
Bạn thử cho chương trình delay một chút xíu, trước khi gọi hàm available() xem có khá hơn không.
Delay thì bạn dùng lệnh Thread.sleep(1000); // -> delay 1s...
Nếu mà thành công thì lúc đó tìm cách cải tiến chương trình của bạn.

Thân
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 03:34:59 (+0700) | #13 | 162856
hacdiepbvh
Member

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
Mình không hiểu ý bạn lắm,delay để làm gì?có phải ý bạn là delay để chắc chắn Socket đã nhận dữ liệu từ Server? Như mình nói ở trên,nếu mình dùng while(true) thì đọc được mà.
Bạn nói rõ ý được không? thanks!
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 05:03:39 (+0700) | #14 | 162865
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
sc.getInputStream() ở đâu ra vậy?
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 05:32:22 (+0700) | #15 | 162869
hacdiepbvh
Member

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
sc=new Socket("localhost",port);
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 06:08:35 (+0700) | #16 | 162874
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

hacdiepbvh wrote:
sc=new Socket("localhost",port);
 


Gởi trọn bộ code giùm. Nếu không, phí thời gian.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 07:24:50 (+0700) | #17 | 162897
[Avatar]
0xdeadbeef
Member

[Minus]    0    [Plus]
Joined: 19/11/2005 03:51:16
Messages: 6
Offline
[Profile] [PM]

hacdiepbvh wrote:
...
Phía Client:

try{
while(sc.getInputStream().available()!=0){
ThiSinh thi=(ThiSinh)in.readObject();
System.out.println(thi);
}
}
catch(Exception e){
in.close();
}

Em đã thử nếu dùng while(true):

try{
while(true){
ThiSinh thi=(ThiSinh)in.readObject();
System.out.println(thi);
break;
}
}
catch(Exception e){
in.close();
}
Nếu làm như trên thì vẫn đọc được một đối tượng đầu tiên ra mà
Có nghĩa là Server đã gửi được đối tượng đến Client
Nhưng
sc.getInputStream().available()!=0 không đúng.

Em sai ở Chỗ nào ạ?
 

sc.getInputStream().available()!=0 không phù hợp với non-blocking call của socket và sai hoàn toàn trong ngữ cảnh của vòng lập trên (Lý do đã đưa ra trong post trước). Nếu không cần hiểu mà chỉ cần làm so cho code chạy thì
Code:
try{
  while((thi=(ThiSinh)in.readObject()) != null) {
    System.out.println(thi);
  }
} catch(Exception e){
...
}
[Up] [Print Copy]
  [Question]   Re: Giúp Em về lỗi Thao tác với File trong java! 18/12/2008 07:47:02 (+0700) | #18 | 162898
hacdiepbvh
Member

[Minus]    0    [Plus]
Joined: 15/03/2007 16:04:54
Messages: 14
Offline
[Profile] [PM]
" non-blocking call của socket "
mình sẽ tìm hiểu thêm,Cám ơn sự giúp đỡ của mọi người!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|