ورود

View Full Version : سوال: how to read a String array from InputStream



pro_mvb
یک شنبه 17 دی 1391, 15:44 عصر
یه آرایه دارم که String هست و به صورت حلقه روی سوکت داره نوشته میشه.
حالا سمت کلاینت چطوری می تونم اینو به صورت همون آرایه بخونم؟؟
با StringBuilder که کار میکنم چون .append میکنه همرو کنار هم قرار میده و از مفهوم در میاد.
چطوری به صورت آرایه بخونمش؟ :اشتباه:

Hybrid
یک شنبه 17 دی 1391, 16:13 عصر
سلام ، راه حل که زیاده ببین با کدومشون راحتتری و بهرته واست ،

1 ) میتونی از همون StringBuilder استفاده کنید و متد append با این تفاوت با هر بار استفاده از این متد یک کاراکتر خالی یعنی " " رو هم به آخرش اضافه کن تا بعداب بتونی با استفاده از متد Split جداشون کنی و داخل یک آرایه قرارش بدی.

2 ) از ساختار داده های آماده مثل ArrayList استفاده کن که کار باهاش بسیار راحته و میتونی با استفاده از متد add اون رشته های دریافتی رو داخلش قرار بدی.

3 ) خودش دست به کار شو و یک کلاس بساز که این کار رو واست انجام بده ( این میتونه بهتر باشه چون خودت طراحی و میدونی چه کار کردی ولی اگه حوصله نداری از همون روش دوم یا اول استفاده کن ! )

pro_mvb
یک شنبه 17 دی 1391, 16:51 عصر
آره بعد پست خودم به فکر split افتادم اومدم موقع send از سمت سرور یه کاراکتر ^ بهش اضافه کردم که این ور با split جداش کنم و بریزم توی آرایه! اما مشکل اینجاست که زمانی میریزه درون آرایه باز ^ رو هم بهش اضافه میکنه! ( البته این یه حسن هست چون سری قبل واقعا نیاز داشتم که کارکتر جدا کننده رو نگه داره). در آخر دیدم اینجوری اومدم فعلا تبدیلش کردم به String و با متد relpace جای ^ از \n استفاده کردم.
(چون بیشتر برام مهم خوانایی بود )
اما خوب الان روش arrayList رو امتحان میکنم.
مرسی

pro_mvb
یک شنبه 17 دی 1391, 17:39 عصر
مستر اول اینکه در مورد arrayList نفهمیدم چطوری عمل کنم دوم اینکه سعی کردم باز با StringBuilder کار کنم به این ترتیب که مقداری که درونش هست رو با استفاده از متد toString به String تبدیل کردم (که درون این مقدار یه علامتی مثل ^ هست) سپس بعد از تبدیل String رو گفتم split کنه نسبت به ^ آما چییزی که جالبه اینه که split اصلا به صورت آرایه نمیسازه:

StringBuilder sb= new StringBuilder();
int c;
while((c=is.read())!= -1){
sb.append((char)c);

}
String temp=sb.toString();
String result[]= temp.split("^");
System.out.println("az shanse gand ehtemalan bayad 1 bashe:"+result.length);

for(int i=0;i<result.length;i++){
result[i].replace("^","");
System.out.println("khorojie systtem: "+result[i]);
System.out.println(i);
}


تازه اینم بگم replace که کردم کار نمیده یعنی انگار نه انگار باز ^ رو نشون میده.

ممنون میشم یه خوره توضیح بدین

spiderman200700
یک شنبه 17 دی 1391, 22:28 عصر
میتونی از ObjectOutputStream و ObjectInputStream استفاده کنی. و آرایه رو به صورت ArrayList بفرستی و در اون سمت ArrayList تحویل بگیری.
به طور کلی هر Objectی که رابط Serializable رو پیاده سازی کرده باشه رو میتونی Stream کنی.

pro_mvb
دوشنبه 18 دی 1391, 11:59 صبح
چقدر کار سخت شد :لبخند:
یه خورده کدم کثیف شده چون کارای قبلی رو کامنت کردم ولی امیدوارم بفهمینش.

کدم با مشکل برخورد کرده میشه یه نگاه بندازین ببینین کجاهاش مشکل داره! ؟
من هم کد سمت کلاینت هم سرور رو براتون قرار میدم:

کلاینت:

InputStream is=server_socket.getInputStream();
ObjectInputStream objin=new ObjectInputStream(is);


//System.out.print(is.available());
// StringBuilder sb= new StringBuilder();

int c;
while(objin.readObject()!= -1){
//sb.append((char)c);
ArrayList<String[]> o=(ArrayList) objin.readObject();
System.out.println(o.size());
}
// String temp=sb.toString();
//String result[]= temp.split("^");
//System.out.println("az shanse gand ehtemalan bayad 1 bashe:"+result.length);

/*or(int i=0;i<result.length;i++){
result[i].replace("^","");
System.out.println("khorojie systtem: "+result[i]);
System.out.println(i);
}*/

is.close();
server_socket.close();
objin.close();



ایندم کد سمت سرور:

ArrayList<String[]> arr2=new ArrayList();

arr2.add(myFile.list());

if(arr2 != null){
System.out.println("masire shoma ine: "+myFile.getPath());
// String arr_result[]= new String[names.length];
System.out.print(arr2.size());
// int counter=0;
/* for(int i=0;i<arr2.size();i++){
for(int j=counter;j<=i;j++){

arr_result[j]=names[i];

System.out.println(arr_result[j]);
counter++;
}

}*/
is.close();

socket.close();
Socket socket_to_client=new Socket("127.0.0.1",1367);

OutputStream ot_to_client= socket_to_client.getOutputStream();
ObjectOutputStream obj=new ObjectOutputStream(ot_to_client);
obj.writeObject(obj);


//ArrayList<String[]> arr= new ArrayList();

//PrintStream printstream= new PrintStream(ot_to_client);
// for(int k=0;k<arr_result.length;k++){
// printstream.print(arr_result[k]+"^");
//arr.add(arr_result[k]);
obj.writeObject(arr2);
//}
System.out.println("result roo socket rikhte shode....... server bye bye");
obj.close();
ot_to_client.close();



نمیدونم اصلا casting هایی که انجام دادم چقدرشون درست هستن و اصلا دارم درست عمل میکنم یا نه؟
:متفکر:

ممنون میشم یادم یدین در حقیقت برنامم اصلا به این نیازی نداره ولی گفتم برای یادگیریم خوبه!

spiderman200700
دوشنبه 18 دی 1391, 14:19 عصر
درسته.
فقط اینکه در سمت کلاینت باید حلقه while رو اینطوری بنویسی:
while(true){
....
}

یا جای True یه flag بذاری که هر جا falseش کردی حلقه شکسته بشه

pro_mvb
دوشنبه 18 دی 1391, 14:53 عصر
مستر آخه این یه تیکش مشکل داره :

ArrayList<String[]> arr2=new ArrayList();

arr2.add(myFile.list());

در واقع خروجی مناسب رو نمیریزه توش حتی محتواش تبدیل به این میشه:
Ljava.lang.String;@15f5897

myFile.list درواقع خروجیش از نوع String[] هست نمیدونم چرا اینجوری میکنه!
و اینکه ArrayList رو نگاه کردم Serializable نبود! مشکلی پیش نمیاد؟

pro_mvb
دوشنبه 18 دی 1391, 15:34 عصر
هیچی اوکیش کردم
الان مشکل در سمت کلاینت موقع cast کردن Obj به array هست !

pro_mvb
دوشنبه 18 دی 1391, 17:03 عصر
آین اررورش هست:

java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.pee kByte(ObjectInputStream.java:2571)
at java.io.ObjectInputStream.readObject0(ObjectInputS tream.java:1315)
at java.io.ObjectInputStream.readObject(ObjectInputSt ream.java:369)
at jspy.Jclient.main(Jclient.java:43)

spiderman200700
دوشنبه 18 دی 1391, 17:13 عصر
الآن دقیقا کدتو بزار ببینم چکار کردی

pro_mvb
دوشنبه 18 دی 1391, 21:30 عصر
نه حله اوکیش کردم مشکل سر حلقست که چجوری بگم تا کی while رو اجرا بکنه !
flag که گفتی رو میشه توضیح بدی؟
شرطشم الان یه چیز به ذهنم رسید :D

spiderman200700
دوشنبه 18 دی 1391, 23:14 عصر
منم flag رو برای شرط while گفتم.
به این طریق که یه متغییر boolean سراسری تعریف میکنی. این متغییر میشه شرط اتمام while . یعنی تا وقتی مثلا متغییر boolean برابر با true باشه ، حلقه ادامه پیدا کنه
اینم یه مثال
boolean flag=true;
while(flag){
.....
}