当前位置:   article > 正文

【安卓常用】文件工具类FileUtils【Uri】【安卓常用文件储存】_fileutils 通过uri获取文件

fileutils 通过uri获取文件

工作中用到的一些工具类,做一个笔记,以便日后回顾~

  1. 1,路径为:data/data/包名/app_+APP_CONFIG /APP_CONFIG ,其中包名后面的app_是为调用时,系统自己加上的
  2. Context context ;
  3. private final String APP_CONFIG ="config";
  4. File dirConf= context.getDir(APP_CONFIG, Context.MODE_PRIVATE);
  5. File conf = new File(dirConf, APP_CONFIG);
  6. 2,/data/data/<application package>/cache目录
  7. context.getCacheDir().getAbsolutePath();
  8. 3,/data/data/<application package>/files目录
  9. context.getFilesDir().getAbsolutePath();
  10. 4,取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
  11. context.getExternalFilesDir().getAbsolutePath();
  12. 5,取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
  13. context.getExternalCacheDir().getAbsolutePath();
  14. 6,/storage/sdcard/0这个储存路径需要申请权限
  15. Environment.getExternalStorageDirectory();
  16. 7,以第一个常量为例,音乐类别的公共目录绝对路径为:/storage/emulated/0/Music。
  17. 如果你使用文件管理器打开设备的外部存储空间的话,均可以看到这些公共目录文件夹。 
  18. Environment.getExternalStoragePublicDirectory(String type);
  19. Envinonment 类提供诸多 type 参数的常量,比如:
  20. DIRECTORY_MUSIC:Music
  21. DIRECTORY_MOVIES:Movies
  22. DIRECTORY_PICTURES:Pictures
  23. DIRECTORY_DOWNLOADS:Download

 

  1. /**
  2. * 文件工具类
  3. *
  4. * @author mazhanzhu 2019年8月19日17:04:11
  5. */
  6. public class FileUtils {
  7. public static final int SIZETYPE_B = 1;//获取文件大小单位为B的double值
  8. public static final int SIZETYPE_KB = 2;//获取文件大小单位为KB的double值
  9. public static final int SIZETYPE_MB = 3;//获取文件大小单位为MB的double值
  10. public static final int SIZETYPE_GB = 4;//获取文件大小单位为GB的double值
  11. public static final String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
  12. /**
  13. * 格式转换文件大小
  14. *
  15. * @param context
  16. * @param fileSize
  17. * @return
  18. */
  19. @SuppressLint("NewApi")
  20. public static String formatFileSize(Context context, long fileSize) {
  21. return Formatter.formatFileSize(context, fileSize);
  22. }
  23. /**
  24. * 判断该文件是否存在
  25. *
  26. * @return
  27. */
  28. public static boolean isExist(String path) {
  29. try {
  30. File f = new File(path);
  31. if (f.exists()) {
  32. return true;
  33. }
  34. } catch (Exception e) {
  35. return false;
  36. }
  37. return false;
  38. }
  39. /**
  40. * 根据文件,读取里面的内容
  41. *
  42. * @param context 上下文
  43. * @param filename 文件的名字
  44. * @return 返回文件所包含的信息
  45. */
  46. public static String getLocalFile(Activity context, String filename) {
  47. String result = null;
  48. //内置sd卡路径
  49. File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + "/" + filename);
  50. Log.e("fd", "这是文件储存的路径: " + file.toString());
  51. if (file.exists()) {
  52. try {
  53. FileInputStream fis = new FileInputStream(file);
  54. // 把字节流转换为字节流
  55. BufferedReader br = new BufferedReader(new InputStreamReader(
  56. fis));
  57. result = br.readLine();
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. Log.e("fd", "文件读取错误: " + e.toString());
  61. }
  62. } else {
  63. ToastUtils.showToast("信息获取失败");
  64. context.finish();
  65. }
  66. return result;
  67. }
  68. /**
  69. * 判断手机是否安装某个应用
  70. *
  71. * @param context
  72. * @param appPackageName 应用包名
  73. * @return true:安装,false:未安装
  74. */
  75. public static boolean isApplicationAvilible(Context context, String appPackageName) {
  76. // 获取packagemanager
  77. PackageManager packageManager = context.getPackageManager();
  78. // 获取所有已安装程序的包信息
  79. List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
  80. if (pinfo != null) {
  81. for (int i = 0; i < pinfo.size(); i++) {
  82. String pn = pinfo.get(i).packageName;
  83. if (appPackageName.equals(pn)) {
  84. return true;
  85. }
  86. }
  87. }
  88. return false;
  89. }
  90. /**
  91. * 保存异常信息到文件
  92. *
  93. * @param data
  94. * @param file_name
  95. * @param isAppend 是否是追加, true为追加。 false为覆盖
  96. */
  97. public static void saveFile(String data, String file_name, boolean isAppend) {
  98. //内置sd卡路径
  99. File sdPath = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
  100. if (!sdPath.exists()) {
  101. sdPath.mkdirs();
  102. }
  103. Log.e("fd", "saveFile: " + sdPath.toString());
  104. File file = new File(sdPath, file_name);
  105. FileOutputStream fos = null;
  106. try {
  107. fos = new FileOutputStream(file, isAppend);
  108. fos.write(data.getBytes("UTF-8"));
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. } finally {
  112. if (fos != null) {
  113. try {
  114. fos.close();
  115. } catch (IOException e) {
  116. e.printStackTrace();
  117. }
  118. }
  119. }
  120. }
  121. /**
  122. * 获取文件指定文件的指定单位的大小
  123. *
  124. * @param filePath 文件路径
  125. * @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
  126. * @return double值的大小
  127. */
  128. public static double getFileOrFilesSize(String filePath, int sizeType) {
  129. File file = new File(filePath);
  130. long blockSize = 0;
  131. try {
  132. if (file.isDirectory()) {
  133. blockSize = getFileSizes(file);
  134. } else {
  135. blockSize = getFileSize(file);
  136. }
  137. } catch (Exception e) {
  138. e.printStackTrace();
  139. Log_Ma.e("获取文件大小", "获取失败!");
  140. }
  141. return FormetFileSize(blockSize, sizeType);
  142. }
  143. /**
  144. * 调用此方法自动计算指定文件或指定文件夹的大小
  145. *
  146. * @param filePath 文件路径
  147. * @return 计算好的带B、KB、MB、GB的字符串
  148. */
  149. public static String getAutoFileOrFilesSize(String filePath) {
  150. File file = new File(filePath);
  151. long blockSize = 0;
  152. try {
  153. if (file.isDirectory()) {
  154. blockSize = getFileSizes(file);
  155. } else {
  156. blockSize = getFileSize(file);
  157. }
  158. } catch (Exception e) {
  159. e.printStackTrace();
  160. Log_Ma.e("获取文件大小", "获取失败!");
  161. }
  162. return FormetFileSize(blockSize);
  163. }
  164. /**
  165. * 获取指定文件大小
  166. */
  167. public static long getFileSize(File file) {
  168. try {
  169. long size = 0;
  170. if (file.exists()) {
  171. FileInputStream fis = null;
  172. fis = new FileInputStream(file);
  173. size = fis.available();
  174. } else {
  175. file.createNewFile();
  176. Log_Ma.e("获取文件大小", "文件不存在!");
  177. }
  178. return size;
  179. } catch (Exception e) {
  180. return 0;
  181. }
  182. }
  183. /**
  184. * 获取指定文件夹
  185. *
  186. * @param f
  187. * @return
  188. * @throws Exception
  189. */
  190. public static long getFileSizes(File f) throws Exception {
  191. long size = 0;
  192. File flist[] = f.listFiles();
  193. for (int i = 0; i < flist.length; i++) {
  194. if (flist[i].isDirectory()) {
  195. size = size + getFileSizes(flist[i]);
  196. } else {
  197. size = size + getFileSize(flist[i]);
  198. }
  199. }
  200. return size;
  201. }
  202. /**
  203. * 将long类型的数据转成相应大小的字符串
  204. * <p>
  205. * (例:30.05MB、1.25GB、40.87KB)
  206. *
  207. * @param fileS 参数
  208. * @return 文件的大小描述
  209. */
  210. public static String FormetFileSize(long fileS) {
  211. DecimalFormat df = new DecimalFormat("0.00");
  212. String fileSizeString = "";
  213. String wrongSize = "0B";
  214. if (fileS == 0) {
  215. return wrongSize;
  216. }
  217. if (fileS < 1024) {
  218. fileSizeString = df.format((double) fileS) + "B";
  219. } else if (fileS < 1048576) {
  220. fileSizeString = df.format((double) fileS / 1024) + "KB";
  221. } else if (fileS < 1073741824) {
  222. fileSizeString = df.format((double) fileS / 1048576) + "MB";
  223. } else {
  224. fileSizeString = df.format((double) fileS / 1073741824) + "GB";
  225. }
  226. return fileSizeString;
  227. }
  228. /**
  229. * 转换文件大小,指定转换的类型
  230. *
  231. * @param fileS
  232. * @param sizeType
  233. * @return
  234. */
  235. public static double FormetFileSize(long fileS, int sizeType) {
  236. DecimalFormat df = new DecimalFormat("0.00");
  237. double fileSizeLong = 0;
  238. switch (sizeType) {
  239. case SIZETYPE_B:
  240. fileSizeLong = Double.valueOf(df.format((double) fileS));
  241. break;
  242. case SIZETYPE_KB:
  243. fileSizeLong = Double.valueOf(df.format((double) fileS / 1024));
  244. break;
  245. case SIZETYPE_MB:
  246. fileSizeLong = Double.valueOf(df.format((double) fileS / 1048576));
  247. break;
  248. case SIZETYPE_GB:
  249. fileSizeLong = Double.valueOf(df.format((double) fileS / 1073741824));
  250. break;
  251. default:
  252. break;
  253. }
  254. return fileSizeLong;
  255. }
  256. //android获取一个用于打开HTML文件的intent
  257. public static void Open_Html_File(Activity activity, File file) {
  258. Uri uri = Uri.parse(file.toString()).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(file.toString()).build();
  259. Intent intent = new Intent(Intent.ACTION_VIEW);
  260. intent.setDataAndType(uri, "text/html");
  261. try {
  262. activity.startActivity(intent);
  263. } catch (Exception e) {
  264. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  265. }
  266. }
  267. --------------------注意7.0以上要配置动态SD卡动态权限,不然不好使,详情参考博客里面FileProvider配置!!!!!-------------------------------------------------
  268. //android获取一个用于打开图片文件的intent
  269. public static void Open_Image_File(Activity activity, File file) {
  270. Intent intent = new Intent(Intent.ACTION_VIEW);
  271. intent.addCategory(Intent.CATEGORY_DEFAULT);
  272. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  273. Uri uri = Uri.fromFile(file);
  274. intent.setDataAndType(uri, "image/*");
  275. try {
  276. activity.startActivity(intent);
  277. } catch (Exception e) {
  278. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  279. }
  280. }
  281. //android获取一个用于打开PDF文件的intent
  282. public static void Open_PDF_File(Activity activity, File file) {
  283. Intent intent = new Intent(Intent.ACTION_VIEW);
  284. intent.addCategory(Intent.CATEGORY_DEFAULT);
  285. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  286. Uri uri = Uri.fromFile(file);
  287. intent.setDataAndType(uri, "application/pdf");
  288. try {
  289. activity.startActivity(intent);
  290. } catch (Exception e) {
  291. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  292. }
  293. }
  294. //android获取一个用于打开文本文件的intent
  295. public static void Open_Text_File(Activity activity, File file) {
  296. Intent intent = new Intent(Intent.ACTION_VIEW);
  297. intent.addCategory(Intent.CATEGORY_DEFAULT);
  298. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  299. Uri uri = Uri.fromFile(file);
  300. intent.setDataAndType(uri, "text/plain");
  301. try {
  302. activity.startActivity(intent);
  303. } catch (Exception e) {
  304. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  305. }
  306. }
  307. //android获取一个用于打开音频文件的intent
  308. public static void Open_Audio_File(Activity activity, File file) {
  309. Intent intent = new Intent(Intent.ACTION_VIEW);
  310. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  311. intent.putExtra("oneshot", 0);
  312. intent.putExtra("configchange", 0);
  313. Uri uri = Uri.fromFile(file);
  314. intent.setDataAndType(uri, "audio/*");
  315. try {
  316. activity.startActivity(intent);
  317. } catch (Exception e) {
  318. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  319. }
  320. }
  321. //android获取一个用于打开视频文件的intent
  322. public static void Open_Video_File(Activity activity,File file) {
  323. Intent intent = new Intent(Intent.ACTION_VIEW);
  324. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  325. intent.putExtra("oneshot", 0);
  326. intent.putExtra("configchange", 0);
  327. Uri uri = Uri.fromFile(file);
  328. intent.setDataAndType(uri, "video/*");
  329. try {
  330. activity.startActivity(intent);
  331. } catch (Exception e) {
  332. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  333. }
  334. }
  335. //android获取一个用于打开CHM文件的intent
  336. public static void Open_Chm_File(Activity activity, File file) {
  337. Intent intent = new Intent(Intent.ACTION_VIEW);
  338. intent.addCategory(Intent.CATEGORY_DEFAULT);
  339. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  340. Uri uri = Uri.fromFile(file);
  341. intent.setDataAndType(uri, "application/x-chm");
  342. try {
  343. activity.startActivity(intent);
  344. } catch (Exception e) {
  345. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  346. }
  347. }
  348. //android获取一个用于打开Word文件的intent
  349. public static void Open_Word_File(Activity activity, File file) {
  350. Intent intent = new Intent(Intent.ACTION_VIEW);
  351. intent.addCategory(Intent.CATEGORY_DEFAULT);
  352. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  353. Uri uri = Uri.fromFile(file);
  354. intent.setDataAndType(uri, "application/msword");
  355. try {
  356. activity.startActivity(intent);
  357. } catch (Exception e) {
  358. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  359. }
  360. }
  361. //android获取一个用于打开Excel文件的intent
  362. public static void Open_Excel_File(Activity activity, File file) {
  363. Intent intent = new Intent(Intent.ACTION_VIEW);
  364. intent.addCategory(Intent.CATEGORY_DEFAULT);
  365. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  366. Uri uri = Uri.fromFile(file);
  367. intent.setDataAndType(uri, "application/vnd.ms-excel");
  368. try {
  369. activity.startActivity(intent);
  370. } catch (Exception e) {
  371. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  372. }
  373. }
  374. //android获取一个用于打开PPT文件的intent
  375. public static void Open_PPT_File(Activity activity,File file) {
  376. Intent intent = new Intent(Intent.ACTION_VIEW);
  377. intent.addCategory(Intent.CATEGORY_DEFAULT);
  378. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  379. Uri uri = Uri.fromFile(file);
  380. intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
  381. try {
  382. activity.startActivity(intent);
  383. } catch (Exception e) {
  384. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  385. }
  386. }
  387. //android获取一个用于打开apk文件的intent
  388. public static void Open_Apk_File(Activity activity, File file) {
  389. Intent intent = new Intent();
  390. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  391. intent.setAction(android.content.Intent.ACTION_VIEW);
  392. intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
  393. try {
  394. activity.startActivity(intent);
  395. } catch (Exception e) {
  396. ToastUtils.showToast("设备中没有安装支持该格式的程序");
  397. }
  398. }
  399. /**
  400. * 获取公共目录
  401. *
  402. * @param type DIRECTORY_MUSIC 音乐类型
  403. * DIRECTORY_RINGTONES 铃声类型
  404. * DIRECTORY_PODCASTS 播客音频类型
  405. * DIRECTORY_ALARMS 闹钟提示音类型
  406. * DIRECTORY_NOTIFICATIONS 通知提示音类型
  407. * DIRECTORY_PICTURES 图片类型
  408. * DIRECTORY_MOVIES 电影类型
  409. * DIRECTORY_DOWNLOADS 下载文件类型
  410. * DIRECTORY_DCIM 相机照片类型
  411. * DIRECTORY_DOCUMENTS 文档类型
  412. * @return 相应类型目录文件
  413. */
  414. public File getExternalStoragePublicDirectory(String type) {
  415. File file = Environment.getExternalStoragePublicDirectory(type);
  416. if (!file.exists()) {
  417. file.mkdir();
  418. }
  419. return file;
  420. }
  421. public static String getTime(long time) {
  422. // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  423. SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  424. Date date = new Date(time);
  425. String name = dateFormat.format(date);
  426. return name;
  427. }
  428. /**
  429. * 获取文件指定文件的指定单位的大小
  430. *
  431. * @param filePath 文件路径
  432. * @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
  433. * @return double值的大小
  434. */
  435. public static double getFileOrFilesSize(String filePath, int sizeType) {
  436. File file = new File(filePath);
  437. long blockSize = 0;
  438. try {
  439. if (file.isDirectory()) {
  440. blockSize = getFileSizes(file);
  441. } else {
  442. blockSize = getFileSize(file);
  443. }
  444. } catch (Exception e) {
  445. e.printStackTrace();
  446. Log_Ma.Companion.e("获取文件大小", "获取失败!");
  447. }
  448. return FormetFileSize(blockSize, sizeType);
  449. }
  450. /**
  451. * 获取指定文件夹
  452. */
  453. private static long getFileSizes(File f) throws Exception {
  454. long size = 0;
  455. File flist[] = f.listFiles();
  456. for (int i = 0; i < flist.length; i++) {
  457. if (flist[i].isDirectory()) {
  458. size = size + getFileSizes(flist[i]);
  459. } else {
  460. size = size + getFileSize(flist[i]);
  461. }
  462. }
  463. return size;
  464. }
  465. /**
  466. * 将long类型的数据转成相应大小的字符串
  467. * <p>
  468. * (例:30.05MB、1.25GB、40.87KB)
  469. *
  470. * @param fileS 参数
  471. * @return 文件的大小描述
  472. */
  473. private static String FormetFileSize(long fileS) {
  474. DecimalFormat df = new DecimalFormat("0.00");
  475. String fileSizeString = "";
  476. String wrongSize = "0B";
  477. if (fileS == 0) {
  478. return wrongSize;
  479. }
  480. if (fileS < 1024) {
  481. fileSizeString = df.format((double) fileS) + "B";
  482. } else if (fileS < 1048576) {
  483. fileSizeString = df.format((double) fileS / 1024) + "KB";
  484. } else if (fileS < 1073741824) {
  485. fileSizeString = df.format((double) fileS / 1048576) + "MB";
  486. } else {
  487. fileSizeString = df.format((double) fileS / 1073741824) + "GB";
  488. }
  489. return fileSizeString;
  490. }
  491. /**
  492. * 转换文件大小,指定转换的类型
  493. */
  494. private static double FormetFileSize(long fileS, int sizeType) {
  495. DecimalFormat df = new DecimalFormat("0.00");
  496. double fileSizeLong = 0;
  497. switch (sizeType) {
  498. case SIZETYPE_B:
  499. fileSizeLong = Double.valueOf(df.format((double) fileS));
  500. break;
  501. case SIZETYPE_KB:
  502. fileSizeLong = Double.valueOf(df.format((double) fileS / 1024));
  503. break;
  504. case SIZETYPE_MB:
  505. fileSizeLong = Double.valueOf(df.format((double) fileS / 1048576));
  506. break;
  507. case SIZETYPE_GB:
  508. fileSizeLong = Double.valueOf(df.format((double) fileS / 1073741824));
  509. break;
  510. default:
  511. break;
  512. }
  513. return fileSizeLong;
  514. }
  515. /**
  516. * 将指定的文件按着给定的文件的字节数进行分割文件
  517. *
  518. * @param filepath 源文件的路径
  519. * @param fileSize 指定的小文件的大小[MB] 0:默认等分4份
  520. */
  521. public static ArrayList<File> divide(String filepath, int fileSize) {
  522. ArrayList<File> fileArrayList = new ArrayList<>();
  523. if (!isExist(filepath)) {
  524. ToastUtils.showToast("指定文件不存在");
  525. } else {
  526. FileInputStream in = null;
  527. try {
  528. File file = new File(filepath);
  529. long fileLength = getFileSize(file);
  530. long size = fileSize * 1024 * 1024;// MB-->byte
  531. if (size <= 0) {
  532. size = fileLength / 4;
  533. }
  534. byte[] bytes = new byte[(int) size];
  535. // 取得被分割后的小文件的数目
  536. int num = (fileLength % size != 0) ? (int) (fileLength / size + 1) : (int) (fileLength / size);
  537. //输入文件流,即被分割的文件
  538. in = new FileInputStream(file);
  539. // 根据要分割的数目输出文件
  540. for (int i = 0; i < num; i++) {
  541. File outFile;
  542. try {
  543. //fixme 特殊分割字符需要添加\\
  544. String[] split = file.getName().split("\\.");
  545. if (split.length == 2) {
  546. outFile = new File(downpath, split[0] + "_" + i + ".part");
  547. } else {
  548. throw new Exception("");
  549. }
  550. } catch (Exception e) {
  551. outFile = new File(downpath, file.getName() + "_" + i + ".part");
  552. }
  553. if (outFile.exists()) {
  554. outFile.delete();
  555. }
  556. outFile.createNewFile();
  557. // 构建小文件的输出流
  558. FileOutputStream out = new FileOutputStream(outFile);
  559. out.write(bytes, 0, in.read(bytes));
  560. out.flush();
  561. out.close();
  562. fileArrayList.add(new File(outFile.getAbsolutePath()));
  563. }
  564. } catch (Exception e) {
  565. Log_Ma.Companion.e("Error[divide]:", e.toString());
  566. } finally {
  567. try {
  568. if (in != null) {
  569. in.close();
  570. }
  571. } catch (IOException e) {
  572. e.printStackTrace();
  573. }
  574. }
  575. }
  576. return fileArrayList;
  577. }
  578. /**
  579. * @param filepath 源文件的路径
  580. * @param destDir 目标文件夹
  581. * @param fileSize 拆分大小【单位MB】
  582. * @throws Exception
  583. */
  584. public static ArrayList<File> split(String filepath, String destDir, int fileSize) {
  585. ArrayList<File> list = new ArrayList<>();
  586. RandomAccessFile rand = null;
  587. try {
  588. // 创建文件对象
  589. File src = new File(filepath);
  590. File destFolder = new File(destDir);
  591. if (!destFolder.exists()) {
  592. destFolder.mkdirs();
  593. }
  594. rand = new RandomAccessFile(src, "r");// 输入流
  595. // 计算拆分后文件的: 个数
  596. double size = fileSize * 1024 * 1024;// MB-->byte
  597. int count = (int) Math.ceil(src.length() / size);
  598. byte[] buf = new byte[(int) size];
  599. int len = 0;
  600. for (int i = 1; i <= count; i++) {
  601. // 定义拆分后的文件
  602. File destFile;
  603. try {
  604. //fixme 特殊分割字符需要添加\\
  605. String[] split = src.getName().split("\\.");
  606. destFile = new File(destDir, split[0] + "_" + i + "." + split[1]);
  607. } catch (Exception e) {
  608. destFile = new File(destDir, src.getName() + "_" + i + ".mp4");
  609. }
  610. destFile.createNewFile();// 创建空的目标文件
  611. RandomAccessFile dest = new RandomAccessFile(destFile, "rw");// 输出流
  612. // 拷贝文件
  613. len = rand.read(buf);
  614. dest.write(buf, 0, len);
  615. dest.close();
  616. list.add(destFile);
  617. }
  618. return list;
  619. } catch (Exception e) {
  620. Log_Ma.Companion.e("Error[split]:", e.toString());
  621. // 关闭资源
  622. if (rand != null) {
  623. try {
  624. rand.close();
  625. } catch (IOException ex) {
  626. ex.printStackTrace();
  627. }
  628. }
  629. return list;
  630. }
  631. }
  632. //合并文件
  633. public static void merge(String srcDir, String destDir) throws Exception {
  634. // 多个输入流==>一个输出流
  635. File src = new File(srcDir);
  636. File[] files = src.listFiles();
  637. Arrays.sort(files, new Comparator<File>() {
  638. public int compare(File f1, File f2) {
  639. int index = f1.getName().lastIndexOf(".part");
  640. int num = Integer.parseInt(f1.getName().substring(index + 5));
  641. int index2 = f2.getName().lastIndexOf(".part");
  642. int num2 = Integer.parseInt(f2.getName().substring(index2 + 5));
  643. return num - num2;
  644. }
  645. });
  646. String formerName = "";
  647. for (File f : files) {
  648. if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
  649. formerName = f.getName().replaceAll(".part\\d", "");
  650. break;
  651. }
  652. }
  653. // 创建:一个输入流
  654. File formerFile = new File(destDir, formerName);
  655. System.out.println("原文件名===" + formerName);
  656. File parentFile = formerFile.getParentFile();
  657. if (!parentFile.exists()) {
  658. parentFile.mkdirs();// 创建父目录
  659. }
  660. if (!formerFile.exists()) {
  661. formerFile.createNewFile();
  662. }
  663. RandomAccessFile randTo = new RandomAccessFile(formerFile, "rw");// 输入流
  664. // 创建:多个输出流
  665. byte[] buf = new byte[1024];
  666. int len = 0;
  667. for (File f : files) {
  668. if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
  669. System.out.println("merge拆分的文件----" + f.getName());
  670. ;
  671. RandomAccessFile source = new RandomAccessFile(f, "r");// 输入流
  672. while ((len = source.read(buf)) != -1) {
  673. randTo.write(buf, 0, len);
  674. }
  675. source.close();// 关闭资源
  676. }
  677. }
  678. randTo.close();// 关闭资源
  679. System.out.println("merge ok...");
  680. }
  681. /**
  682. * 通知android媒体库更新文件夹
  683. *
  684. * @param filePath ilePath 文件绝对路径,、/sda/aaa/jjj.jpg
  685. */
  686. public static void scanFile(Context context, String filePath) {
  687. try {
  688. MediaScannerConnection.scanFile(context, new String[]{filePath}, null,
  689. new MediaScannerConnection.OnScanCompletedListener() {
  690. public void onScanCompleted(String path, Uri uri) {
  691. Log.i("*******", "Scanned " + path + ":");
  692. Log.i("*******", "-> uri=" + uri);
  693. }
  694. });
  695. } catch (Exception e) {
  696. e.printStackTrace();
  697. }
  698. }
  699. /**
  700. * Uri转file文件
  701. */
  702. public static File getFile(Activity activity, Uri uri) {
  703. String[] arr = {MediaStore.Images.Media.DATA};
  704. Cursor cursor = activity.getContentResolver().query(uri, arr, null, null, null);
  705. int imgIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  706. cursor.moveToFirst();
  707. String imgPath = cursor.getString(imgIndex);
  708. File file = new File(imgPath);
  709. return file;
  710. }
  711. }
  1. /**
  2. * Uri转file文件
  3. */
  4. public static File getFile(Activity activity, Uri uri) {
  5. String[] arr = {MediaStore.Images.Media.DATA};
  6. Cursor cursor = activity.getContentResolver().query(uri, arr, null, null, null);
  7. int imgIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  8. cursor.moveToFirst();
  9. String imgPath = cursor.getString(imgIndex);
  10. File file = new File(imgPath);
  11. return file;
  12. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号