File.renameTo()方法实例

tech2023-09-19  8

File.renameTo()方法实例

今天写了个例子来实验一下这个方法的工作机制,看看多次renameTo会怎么样,顺便也实验了一下之前代码bug的问题,代码如下: 下载图片到内存:

private void downloadImage(Context context){ RequestQueue requestQueue = Volley.newRequestQueue(this); ImageRequest imageRequest = new ImageRequest("https://xxxxx.jpg", new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { if(null == ROOT_PATH){ ROOT_PATH = context.getFilesDir().getAbsolutePath(); } File imgDir = new File(ROOT_PATH); if(imgDir.exists()){ file = new File(imgDir+File.separator+"12.jpg"); FileOutputStream fos = null; try { fos = new FileOutputStream(file,false); response.compress(Bitmap.CompressFormat.JPEG,50,fos); fos.close(); showToast("Download end!"); }catch (IOException e) { e.printStackTrace(); } } } }, 0, 0, ImageView.ScaleType.CENTER,Bitmap.Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { showToast("Error Download!"); } }); requestQueue.add(imageRequest); }

然后把 内存files文件夹下的图片移动到failed子目录下,网上很多都说要在同一目录才能移动:

private void renameToFailed(){ File failedFile = new File(ROOT_PATH + File.separator + "failed"+ File.separator + file.getName()); if (!failedFile.getParentFile().exists()) { failedFile.getParentFile().mkdirs(); } boolean f = file.renameTo(failedFile); }

在下载图片存入文件输入流时new FileOutputStream(file,false);,如果参数2 append为true,则会累加,文件会越来越大,之前没有注意。如图,本来是347.5KB的图,下载两次就时两倍大小了。 而且在移动时,也会把累加的图存入failed文件夹,之前看网上说如果存在则不会移动的说法就有点问题吧,如下图: 其实renameTo每次都会移动,file.renameTo(failedFile); 把之前的文件(file)删除,移动到了(failedFile),而且(failedFile)的文件是覆盖,不是不移动。 还有在压缩图片的时候做了个实验: response.compress(Bitmap.CompressFormat.JPEG,100,fos);100的时候不压缩图片,图片清晰 ,大小为4MB,50的时候为347.5KB,10的时候为113.7KB,而且图片有些模糊

所以压缩到50还是能接受,而且节省内存,主要看你的需求。

再来验证一下非同一目录的移动:我从内存移动到外存,失败!如图:

private void renameToFailed(){ if(null == PATH){ PATH = Objects.requireNonNull(getApplicationContext().getExternalFilesDir("")).getAbsolutePath(); } showToast("renameToFailed!"+file.getName()); File failedFile = new File(PATH + File.separator + "failed"+ File.separator + file.getName()); if (!failedFile.getParentFile().exists()) { failedFile.getParentFile().mkdirs(); } boolean f = file.renameTo(failedFile); }

最新回复(0)