zoukankan      html  css  js  c++  java
  • java实现把一个大文件切割成N个固定大小的文件

    这个好像是我一年前去面试时的一道面试题,分享一下!考 java I/O 的!

    1. //java实现把一个大文件切割成N个固定大小的文件
    2. package com.johnny.test;
    3. import java.io.BufferedReader;
    4. import java.io.File;
    5. import java.io.FileInputStream;
    6. import java.io.FileOutputStream;
    7. import java.io.FileReader;
    8. import java.io.IOException;
    9. publicclass FenGeFile {
    10. publicstaticfinal String SUFFIX = “.txt”; // 分割后的文件名后缀
    11. // 将指定的文件按着给定的文件的字节数进行分割文件,其中name指的是需要进行分割的文件名,size指的是指定的小文件的大小
    12. publicstatic String[] divide(String name, long size) throws Exception {
    13. File file = new File(name);
    14. if (!file.exists() || (!file.isFile())) {
    15. thrownew Exception(“指定文件不存在!”);
    16. }
    17. // 获得被分割文件父文件,将来被分割成的小文件便存在这个目录下
    18. File parentFile = file.getParentFile();
    19. // 取得文件的大小
    20. long fileLength = file.length();
    21. System.out.println(“文件大小:”+fileLength+” 字节”);
    22. if (size <= 0) {
    23. size = fileLength / 2;
    24. }
    25. // 取得被分割后的小文件的数目
    26. int num = (fileLength % size != 0) ? (int) (fileLength / size + 1)
    27. : (int) (fileLength / size);
    28. // 存放被分割后的小文件名
    29. String[] fileNames = new String[num];
    30. // 输入文件流,即被分割的文件
    31. FileInputStream in = new FileInputStream(file);
    32. // 读输入文件流的开始和结束下标
    33. long end = 0;
    34. int begin = 0;
    35. // 根据要分割的数目输出文件
    36. for (int i = 0; i < num; i++) {
    37. // 对于前num – 1个小文件,大小都为指定的size
    38. File outFile = new File(parentFile, file.getName() + i + SUFFIX);
    39. // 构建小文件的输出流
    40. FileOutputStream out = new FileOutputStream(outFile);
    41. // 将结束下标后移size
    42. end += size;
    43. end = (end > fileLength) ? fileLength : end;
    44. // 从输入流中读取字节存储到输出流中
    45. for (; begin < end; begin++) {
    46. out.write(in.read());
    47. }
    48. out.close();
    49. fileNames[i] = outFile.getAbsolutePath();
    50. }
    51. in.close();
    52. return fileNames;
    53. }
    54. publicstaticvoid readFileMessage(String fileName) {// 将分割成的小文件中的内容读出
    55. File file = new File(fileName);
    56. BufferedReader reader = null;
    57. try {
    58. reader = new BufferedReader(new FileReader(file));
    59. String string = null;
    60. // 按行读取内容,直到读入null则表示读取文件结束
    61. while ((string = reader.readLine()) != null) {
    62. System.out.println(string);
    63. }
    64. reader.close();
    65. } catch (IOException e) {
    66. e.printStackTrace();
    67. } finally {
    68. if (reader != null) {
    69. try {
    70. reader.close();
    71. } catch (IOException e1) {
    72. }
    73. }
    74. }
    75. }
    76. publicstaticvoid main(final String[] args) throws Exception {
    77. String name = “D:/boss/123.txt”;
    78. long size = 1024*1024*4;//1K=1024b(字节)
    79. String[] fileNames = FenGeFile.divide(name, size);
    80. System.out.println(“文件” + name + “分割的结果如下:”);
    81. for (int i = 0; i < fileNames.length; i++) {
    82. System.out.println(fileNames[i] + “的内容如下:”);
    83. //FenGeFile.readFileMessage(fileNames[i]);
    84. System.out.println();
    85. }
    86. }
    87. }

    转自:http://www.cdtarena.com/javapx/201303/8036.html

  • 相关阅读:
    0006 字符串转整数
    0005 反转整数
    0004 最长回文子串
    0003 无重复字符的最长子串
    0002 两数相加
    0001 两数之和
    使用jquery+css实现瀑布流布局
    更简单的轮播实现
    类和对象
    生产者-消费者(wait-notify实现)
  • 原文地址:https://www.cnblogs.com/cdtarena/p/2975656.html
Copyright © 2011-2022 走看看