آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

Cache یک json - چگونه؟ (حل شد.)

Mim  9 سال پیش  6 سال پیش
+2 0

سلام

 

یه برنامه از طریق json از سرور یه آرایه دریافت میکنه. چطور میشه این json یا آرایه رو cache کرد؟

ممنون میشم اگه کد بنویسید و توضیحات کامل باشه. سپاس

+1 0
بخش بیست و چهارم - این همه پروژه ، ماژول وب سرویس . این آموزش رو مطالعه کنید به صورت کامل در این مورد توضیح دادن استاد . (9 سال پیش)
0 0
خیلی ممنونم. اما یک مشکل هست، جیسونی که در این پروژه تولید میشه کوچیکه و میشه داخل String ذخیره کرد و مشکلی پیش نمیاد. اما من یه جیسون خیلی خیلی بزرگ دارم. چطور باید سورسو تغییر بدم؟ میشه راهنمایی کنید. ممنونم (9 سال پیش)
+1 0
خوب چه فرقی داره؟ در هر صورت شما اطلاعاتو تو یک فایل ذخیره میکنید حالا می خواهد کوچک باشه یا بزرگ (9 سال پیش)
0 0
ارور میده خب. Unterminated string at character 29734 . کاراکتر 29734 هم حرف i هست. از اونجا به بعد بقیه کاراکترهارو ؟؟؟؟؟؟؟؟؟؟؟ نشون میده تا آخر. من حدس میزنم مشکلش کمبود فضا باشه. (9 سال پیش)
0 0
نه احتمالا از سمت سرور این ارور باشه چون Unterminated به معنی ناقصه احتمالا اونور مشکلی دارید یک چکی بزنید (9 سال پیش)
0 0
برنامه بدون کش درست عمل میکنه. فقط وقتی از فایل کش استفاده میکنه این مشکل پیش میاد. (9 سال پیش)
0 0
وقتی طول جیسون رو کم میکنم برنامه درست کار میکنه. فقط موقعی که جیسون خیلی طولانی هست این اتفاق میوفته. (9 سال پیش)
+1 0
در واقع این ارور Unterminated string at character به شما میگه که در خونه 29734 یک کارکتری وجود داره که نمیشه ازش استفاده در جیسون استفاده کرد مثل \ , @ , & , # و ...برای رفع مشکل شما باید این کارکتر رو به hex تبدیل کنید و بعد ارسال کنید . (9 سال پیش)
0 0
ممنونم که پیگیری میکنین. ولی اگه مشکل این باشه. ینی یکی از این کاراکترا هست، چرا وقتی مستقیم از سرور میخونه درست اجرا میشه؟ ینی جیسون رو از سرور میگیره درست اجرا میشه. (9 سال پیش)
+1 0
احتمال داره موقع ذخیره کردن String در فایل ، رشته شکسته بشه و یکسری اطلاعات به صورت غلط ذخیره بشه شما بهتره قبل از ارسال به جای استفاده از کارکتر های خاص به صورت مستقیم از کد hex استفاده کنید . (9 سال پیش)
0 0
فکرمیکنم به جای ArrayList باید از ArrayList استفاده کنم! چون روی سرور یه آرایه دارم که داخلش آرایه هست! آیا ممکنه مشکل این باشه؟ (9 سال پیش)
0 0
به جای ArrayList_NameValuePair از ArrayList_String (9 سال پیش)
+1 0
من هیچ کاراکتر خاصی ندارم. محتوای آرایه ی روی سرور url هست. آیا تابع خاصی وجود داره برای استفاده و جلوگیری از این مشکل؟ (9 سال پیش)
 برای این سوال 5 پاسخ وجود دارد.
پاسخ به سوال 
Mim  9 سال پیش
+1 0

+1 0
اگه مشکل تون اینه که json قابل پردازش نیست و از کاراکتر های خاصی درش استفاده شده که قابل تجزیه نیست (همون مشکلی که محمدحسین اشاره کرد) باید اون کارکترهای خاص رو escape کنید.به این لینک هم سری بزنید خوبه. (9 سال پیش)
0 0
نه من هیچ کاراکتر خاصی ندارم. مطمئنم. (9 سال پیش)
0 0
جیسون خالص هست. فقط زمانی که در فایل cache ذخیره میشه و بعد از روی cache خونده میشه، خطا میده. (9 سال پیش)
0 0
لطفا بفرمایید که buffer و String یا هر نوع دیگه ای که برای ذخیره سازی توی این پروژه استفاده شده محدودیت اندازه نداره؟ چون طول جیسون من خیلی بالاست و نیاز دارم بیشتر هم بشه. (9 سال پیش)
0 0
منظورتون کدوم پروژه هست. اگه منظورتون بخش بیست و چهارم آموزش هاست که من هنوز وقت نکردم آموزش ها رو ببینم. (9 سال پیش)
0 0
آره بخش 24ام. (9 سال پیش)
0 0
طول json محدودیت خاصی نداره.فقط در بعضی زبان ها یا بعضی لایبراری های پردازش json ،محدودیت وجود داره. (9 سال پیش)
0 0
طول جیسون من در حال حاضر 29733 کاراکتر هست و خطایی که میگیره شماره کاراکتر 29734 رو نشون میده!!! (9 سال پیش)
0 0
مشکل به خاطر طول json نیست. شما میگید وقتی در فایل ذخیره می کنید مشکل به وجود میاد.پس مشکل مال خواندن و نوشتن در فایله احتمالا. به صورت باینری در فایل بخونید و بنویسید تا هیچ کاراکتری تغییر نکنه. (9 سال پیش)
پاسخ به سوال 
Mim  9 سال پیش
+1 0

این دوتا کار نوشتن و خوندن رو انجام میدن

     private void saveToCache(long when, String data) {
ObjectOutputStream outputStream = null;
try {
outputStream = new ObjectOutputStream(new FileOutputStream(cacheDir + "/" + cacheFileName));
outputStream.writeLong(when);
outputStream.writeInt(data.length());

outputStream.write(data.getBytes());
}
catch (StreamCorruptedException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.flush();
}
catch (IOException e) {
e.printStackTrace();
}
try {
outputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}

private String readFromCache() {
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new FileInputStream(cacheDir + "/" + cacheFileName));
long when = inputStream.readLong();
long now = System.currentTimeMillis();
if (now - when > cacheExpireTime * 1000) {
new File(cacheDir + "/cache.dat").delete();
return null;
}

int bytesLength = inputStream.readInt();
byte[] buffer = new byte[bytesLength];
inputStream.read(buffer, 0, bytesLength);
String output = new String(buffer);
return output;
}
catch (StreamCorruptedException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
+2 0
خوب اولین ایرادی که داره اینه که شما فایل اشتباهی رو دارید پاک می کنید توی قسمت پاک کردن فایل به جای cache.dat همون cacheFineName روبدید (9 سال پیش)
0 0
سپاس. ارور اصلی همچنان وجود داره! (9 سال پیش)
0 0
مشکل حل شد. با اضافه کردن یه .dot درست شد. در تابع readFromCache بعد از اسم فایل کش. مشکل عجیبی بود! (9 سال پیش)
0 0
کامنت بالا که کلا اشتباهه. (9 سال پیش)
پاسخ به سوال 
Mim  9 سال پیش
+8 0

من جدا کلافه شدم.

فایل کش رو بررسی کردم و دیتا درست ذخیره میشه، فکرمیکنم مشکل از تابع read باشه. و جالب اینکه برای جیسون هایی که طول کمتر از 1012 کاراکتر دارن، درست اجرا میشه و مشکلی نداره. اما بالای این رقم نمیتونه دیتا رو بخونه!

 لطفا کمک کنید!

 


حل شد! تابع read فقط 1024 کاراکتر اول رو میخونه. بجای read() باید از readFully() استفاده کرد.

 

0 0
دقیقا منم همین مشکل داشتم ، مرسی مرتضی جان (8 سال پیش)
0 0
آقا خیلی ممنون منم این مشکل رو داشتم کلی گشتم نفهمیدم چرا اینجوریه. ممنون (6 سال پیش)
پاسخ به سوال 
Pooya  8 سال پیش
+2 0

با تشکر از مرتضی، برای توضیح بیشتر : در متد readFromCache  به صورت زیر تغییر رو ایجاد کنید.

inputStream.read(buffer, 0, bytesLenght);
تغییر کند به
inputStream.readFully(buffer, 0, bytesLenght);
0 0
یک سوال؟اطلاعتی که در کش ذخیره میشه بعد اینکه یه شرط قرار میدم میخام از کش بخونه ولی چیزی نمیخونه و لیست خالی نمایش میده.مشکل از کجاست ؟ این قضیه کش هم داستانی داره :| (8 سال پیش)
+1 0
اگه کد کامل خوندن کش و آپدیتشو بزارین شاید بتونم کمکتون کنم . من یه مقدار کدهای استادو تغییر دادم چون باعث می شد همچین موردی پیش بیاد. (8 سال پیش)
0 0
بچه ها نیاز نیست چک کنیم که فضای خالی رو مموری وجود داره بعد ذخیره کنه؟ (8 سال پیش)
پاسخ به سوال 
شهریار توکلی  8 سال پیش
0 0

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

 
privatevoid saveToCache(longwhen,String data){
ObjectOutputStream outputStream =null;
try{
outputStream =newObjectOutputStream(newFileOutputStream(cacheDir +"/"+ cacheFileName));
outputStream.writeLong(when);
outputStream.writeInt(data.length());

outputStream.write(data.getBytes());
}
catch(StreamCorruptedException e){
e.printStackTrace();
}
catch(FileNotFoundException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}finally{
if(outputStream !=null){
try{
outputStream.flush();
}
catch(IOException e){
e.printStackTrace();
}
try{
outputStream.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
privateString readFromCache(){
ObjectInputStream inputStream =null;
try{
inputStream =newObjectInputStream(newFileInputStream(cacheDir +"/"+ cacheFileName));
longwhen= inputStream.readLong();
long now =System.currentTimeMillis();
if(now -when> cacheExpireTime *1000){
newFile(cacheDir +"/cache.dat").delete();
returnnull;
}

int bytesLength = inputStream.readInt();
byte[] buffer =newbyte[bytesLength];
inputStream.read(buffer,0, bytesLength);
String output =newString(buffer);
return output;
}
catch(StreamCorruptedException e){
e.printStackTrace();
}
catch(FileNotFoundException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}finally{
try{
if(inputStream !=null){
inputStream.close();
}
}
catch(IOException e){
e.printStackTrace();
}
}
returnnull;
}

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .