رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
kamran_14

استفاده از بافر برای دانلود و ذخیره سازی در sd card


پست های پیشنهاد شده

سلام

در این برنامه یک فایلی از اینترنت دان و در sd کارد گوشی ذخیره میشود

چرا ما در هنگام خواندن فایل 10 کیلوبایت 10 کیلوبایت میخوانیم و موقع نوشتن 1 کیلو بایت 1کیلوبایت نوشته مشود. چرا از بافر استفاده میشود؟ 

 @Override
        protected String doInBackground(String... params) {
            try {
                URL url=new URL("http://s8.picofile.com/d/8349389850/06c69ac4-70fb-4d33-991f-ac01b8c5324f/b.mp3");
                URLConnection connection=url.openConnection();
                connection.connect();

                InputStream fis=new BufferedInputStream(url.openStream(),10*1024);
                FileOutputStream fos=new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/saeed.mp3");

                int c=0;
                byte[] d=new byte[1024];
                while ((c=fis.read(d))!=-1)
                {
                    fos.write(d,0,c);
                }

                fos.flush();
                fos.close();
                fis.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

 

در 2 ساعت قبل، kamran_14 گفته است :

چرا از بافر استفاده میشود

کلاس بافر یک Wrapper برای کلاس InputStream هست که امکان استفاده از یک بافر داخلی(آرایه داخلی) را به شما میده که میتونه سرعت بهتری نسبت به کلاس Base به شما بده!

در 2 ساعت قبل، kamran_14 گفته است :

چرا ما در هنگام خواندن فایل 10 کیلوبایت 10 کیلوبایت میخوانیم و موقع نوشتن 1 کیلو بایت 1کیلوبایت نوشته مشود

و اینکه چه مقادیری برای استریم های ارسالی و دریافتی تعیین میکنید بسته به شرایط ونوع فایل ها متفاوت هست! مثلا وقتی در کلاس بافر سایز تعریف میکنید باید به این نکته توجه کنید که درصورتی که یک بایت را بخواهید شیفت بدید کلاس بافر میاد از کلاس Array.copy استفاده میکنه وتمام بایت ها را دوباره مینویسه بنابراین در صورتی که این مقادیر را بیش از اندازه بزرگ تعریف کنید هزینه ی زیادی براتون داره در مصرف منابع حافظه. 

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

استریم بایت ها را به صورت بسته های خیلی کوچک در یک نخ کاربری background دریافت میکنن و در زمان مناسب همه بایت ها را به هم وصل میکنن!

توجه داشته باشید که برنامه نویسی در زبانهای جاوا و دات نت اتلاف منابع حافظه ای زیادی میتونه در بر داشته باشه بنابراین باید همیشه به این نکات توجه داشته باشید. 

پیشنهاد میکنم این مطالب راهم مطالعه کنید!

10 تکنیک کاربردی که باعث بهینه شدن عملکرد برنامه های جاوا می شود

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

و البته زمانی که از نخ ها مانند AsyncTask استفاده میکنید و عملیاتهای مختلف I/O انجام میدید بهتره که از همه اکسپشن ها را در یک Try ارسال نکنید و همچنین از یک خاصیت به نام autoclose هم می توانید برای کلاسهای جاوا استفاده کنید که نیازی به نوشتن متد close برای هر کلاس ورودی و خروجی نداشته باشید.

مثال ویرایش شده...

 @Override
        protected String doInBackground(String... params) {
        try(URL url=new URL("http://s8.picofile.com/d/8349389850/06c69ac4-70fb-4d33-991f-ac01b8c5324f/b.mp3")){
                URLConnection connection=url.openConnection();
                connection.connect();
                try( InputStream fis=new BufferedInputStream(url.openStream(),10*1024)){
                    try(FileOutputStream fos=new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/saeed.mp3")){
                         int c=0;
                         byte[] d=new byte[1024];
                          while ((c=fis.read(d))!=-1){
                             fos.write(d,0,c);
                          }
                          fos.flush();
                    } catch (IOException expOutPutStream) {
                         expOutPutStream.printStackTrace();
                    }
                } catch (IOException expInputStream) {
                    expInputStream.printStackTrace();
                }
        } catch (MalformedURLException e) {
                e.printStackTrace();
        }
                
    return null;
}

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...