• 学习-Java输入输出之文件字节IO流之拆分文件


    任务描述

    本关任务:把给定的大文件拆分成多个小文件。

    相关知识

    之前我们学习了 InputStream(字节输入流)和 OutputStream (字节输出流),下面我们来了解一下它们的常用子类,FileInputStream (文件字节输入流)和 FileOutputStream(文件字节输出流)。

    FileInputStream (文件字节输入流)

    FileInputStream 是 InputStream 的子类,用于从文件中获取字节流。 ######构造方法 下表中是它的常用构造方法:

    构造方法说明
    FileInputStream(File file)通过打开一个到实际文件的连接来创建一个 FileInputStream 对象,该文件通过文件系统中的 File 对象指定
    FileInputStream(String name)通过打开一个到实际文件的连接来创建一个 FileInputStream 对象,该文件通过文件系统中的路径名 name 指定

    构造方法示例:

    1. public static void main(String[] args) throws IOException{
    2. // 通过File对象创建FileInputStream对象
    3. File f = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
    4. FileInputStream fileInputStream = new FileInputStream(f);
    5. // 通过字符串路径直接创建FileInputStream对象
    6. FileInputStream fileInputStream1 = new FileInputStream("C:\\Users\\yy\\Desktop\\file\\a.txt");
    7. }

    FileInputStream 的方法

    下表中是它的常用方法:

    方法名方法说明
    read()从这个输入流读取一个字节的数据
    read(byte b[])读取字节数据放到 b 字节数组中
    read(byte b[], int off, int len)从该输入流读取到字节数据,放入一个字节数组。off:数组中的起始偏移量,len:写入的字节数
    skip(long n)跳过字节数
    available()返回可以读取的剩余字节数的估计值
    close()关闭流

    read(byte b[]) 方法使用示例:

    1. public static void main(String[] args) throws IOException{
    2. // 通过File对象创建FileInputStream对象,该路径下的a.txt文件中内容为abcd
    3. File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
    4. try(
    5. FileInputStream fileInputStream = new FileInputStream(file);){
    6. // 创建字节数组,长度为文件长度
    7. byte[] bytes = new byte[(int)file.length()];
    8. // 读取字节流到数组中
    9. int read = fileInputStream.read(bytes);
    10. // 打印数组
    11. System.out.print(bytes);
    12. }
    13. }

    执行结果:

    1. abcd

    FileOutputStream (文件字节输出流)

    FileOutputStream 是 OutputStream 的子类,用于将字节流写入到文件中。

    FileOutputStream 的构造方法

    构造方法说明
    FileOutputStream(File file)通过文件对象创建 FileOutputStream 对象
    FileOutputStream(File file, boolean append)如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果 append 参数为 false, 则覆盖文件信息
    FileOutputStream(String name)通过字符串路径创建 FileOutputStream 对象
    FileOutputStream(String name,boolean append)如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果 append 参数为 false, 则覆盖文件信息

    FileOutputStream(File file, boolean append) 构造方法示例:

    1. public static void main(String[] args) throws IOException{
    2. // 通过File对象创建FileOutputStream对象
    3. File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
    4. FileOutputStream fileoutputStream = new FileOutputStream(file,false);
    5. }

    FileOutputStream 的方法

    下表中是它的常用方法:

    方法名方法说明
    write(int b)将字节写入文件输出流
    write(byte b[])将字节数组写入文件输出流
    write(byte b[], int off, int len)将字节数组写入文件输出流,off:数组中的起始偏移量,len:写入的字节数
    close()关闭流

    write(byte b[], int off, int len) 方法使用示例:

    1. public static void main(String[] args) throws IOException{
    2. // 通过File对象创建FileOutputStream对象,该路径下的a.txt文件中内容为空
    3. File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
    4. try(
    5. FileOutputStream fileoutputStream = new FileOutputStream(file);){
    6. // 创建字节数组,97代表小写字母a
    7. byte[] bytes = {97,98,99,100,101};
    8. // 将字节数组中部分数据写入文件流(从数组中下标为1的位置,取两个元素)
    9. fileoutputStream.write(bytes,1,2);
    10. }
    11. }

    执行结果: 文件中写入了 bc。

    1. import java.io.*;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. public class FileTest {
    5. public static void main(String[] args) throws IOException {
    6. // 请在Begin-End间编写完整代码
    7. /********** Begin **********/
    8. // 接收给定的字符串
    9. Scanner input = new Scanner(System.in);
    10. String str = input.next();
    11. // 当给定文件大小等于0时,抛出异常
    12. int each_file = 100 * 1024;
    13. File file = new File(str);
    14. if (file.length() == 0){throw new RuntimeException("文件大小为0,不可拆分");
    15. }
    16. // 把文件所有数据读取到数组中
    17. byte[] bytes = new byte[(int)file.length()];
    18. try (
    19. FileInputStream fileInputStream = new FileInputStream(file);){
    20. fileInputStream.read(bytes);
    21. }
    22. // 计算需要被划分成多少个子文件
    23. int file_number;
    24. if (bytes.length % each_file == 0){
    25. file_number = bytes.length / each_file;
    26. }else {
    27. file_number = bytes.length / each_file + 1;
    28. }
    29. // 将读取到的数据写入到子文件中
    30. for (int i = 0;i < file_number;i ++){
    31. String each_fileName = file.getName() + "-" + i;
    32. File eachFile = new File(file.getParent(), each_fileName);
    33. byte[] eachContent;
    34. if (file_number - 1 != i){
    35. eachContent = Arrays.copyOfRange(bytes, each_file * i, each_file * (i + 1));}
    36. else{
    37. eachContent = Arrays.copyOfRange(bytes, each_file * i, bytes.length);}
    38. try (FileOutputStream fileOutputStream = new FileOutputStream(eachFile);){
    39. fileOutputStream.write(eachContent);
    40. }
    41. }
    42. /********** End **********/
    43. }
    44. }

     

  • 相关阅读:
    Spring Cloud Gateway3.x自定义Spring Cloud Loadbalancer负载均衡策略以及实现动态负载均衡策略的方案
    2024国考申论新说刷题系
    给老婆写的,每日自动推送暖心消息
    双11的大型电商活动服务器崩溃是怎么回事?
    QML中使用自定义Model和SortFilterProxyModel实现搜索
    STM32-按键检测
    qemu 使用 ceph rbd 存储块
    Spring Cloud Gateway从数据库读取并更新Cors配置
    java项目-第159期ssm超市管理系统_ssm毕业设计_计算机毕业设计
    猿创征文|【JavaSE】 Collection集合全家桶
  • 原文地址:https://blog.csdn.net/weixin_46075438/article/details/128074388