zoukankan      html  css  js  c++  java
  • Java自学-I/O 字节流

    Java 字节流 InputStream OutputStream

    InputStream字节输入流
    OutputStream字节输出流
    用于以字节的形式读取和写入数据

    步骤 1 : ASCII码

    所有的数据存放在计算机中都是以数字的形式存放的。 所以字母就需要转换为数字才能够存放
    比如A就对应的数字65,a对应的数字97. 不同的字母和符号对应不同的数字,就是一张码表。
    ASCII是这样的一种码表。 只包含简单的英文字母,符号,数字等等。 不包含中文,德文,俄语等复杂的。

    示例中列出了可见的ASCII码以及对应的十进制和十六进制数字,不可见的暂未列出
    在这里插入图片描述
    步骤 2 : 以字节流的形式读取文件内容

    InputStream是字节输入流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
    FileInputStream 是InputStream子类,以FileInputStream 为例进行文件读取

    package stream;
      
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
      
    public class TestStream {
      
        public static void main(String[] args) {
            try {
                //准备文件lol.txt其中的内容是AB,对应的ASCII分别是65 66
                File f =new File("d:/lol.txt");
                //创建基于文件的输入流
                FileInputStream fis =new FileInputStream(f);
                //创建字节数组,其长度就是文件的长度
                byte[] all =new byte[(int) f.length()];
                //以字节流的形式读取文件所有内容
                fis.read(all);
                for (byte b : all) {
                    //打印出来是65 66
                    System.out.println(b);
                }
                 
                //每次使用完流,都应该进行关闭
                fis.close();
                  
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
              
        }
    }
    

    步骤 3 : 以字节流的形式向文件写入数据

    OutputStream是字节输出流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
    FileOutputStream 是OutputStream子类,以FileOutputStream 为例向文件写出数据

    注: 如果文件d:/lol2.txt不存在,写出操作会自动创建该文件。
    但是如果是文件 d:/xyz/lol2.txt,而目录xyz又不存在,会抛出异常
    以字节流的形式向文件写入数据

    package stream;
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    public class TestStream {
     
        public static void main(String[] args) {
            try {
                // 准备文件lol2.txt其中的内容是空的
                File f = new File("d:/lol2.txt");
                // 准备长度是2的字节数组,用88,89初始化,其对应的字符分别是X,Y
                byte data[] = { 88, 89 };
     
                // 创建基于文件的输出流
                FileOutputStream fos = new FileOutputStream(f);
                // 把数据写入到输出流
                fos.write(data);
                // 关闭输出流
                fos.close();
                 
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
        }
    }
    

    练习拆分文件

    找到一个大于100k的文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。
    比如文件 eclipse.exe,大小是309k。
    拆分之后,成为
    eclipse.exe-0
    eclipse.exe-1
    eclipse.exe-2
    eclipse.exe-3
    在这里插入图片描述
    答案

    package stream;
      
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Arrays;
      
    public class TestStream {
      
        public static void main(String[] args) {
            int eachSize = 100 * 1024; // 100k
            File srcFile = new File("d:/eclipse.exe");
            splitFile(srcFile, eachSize);
        }
      
        /**
         * 拆分的思路,先把源文件的所有内容读取到内存中,然后从内存中挨个分到子文件里
         * @param srcFile 要拆分的源文件
         * @param eachSize 按照这个大小,拆分
         */
        private static void splitFile(File srcFile, int eachSize) {
      
            if (0 == srcFile.length())
                throw new RuntimeException("文件长度为0,不可拆分");
      
            byte[] fileContent = new byte[(int) srcFile.length()];
            // 先把文件读取到数组中
            try {
                FileInputStream fis = new FileInputStream(srcFile);
                fis.read(fileContent);
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // 计算需要被划分成多少份子文件
            int fileNumber;
            // 文件是否能被整除得到的子文件个数是不一样的
            // (假设文件长度是25,每份的大小是5,那么就应该是5个)
            // (假设文件长度是26,每份的大小是5,那么就应该是6个)
            if (0 == fileContent.length % eachSize)
                fileNumber = (int) (fileContent.length / eachSize);
            else
                fileNumber = (int) (fileContent.length / eachSize) + 1;
      
            for (int i = 0; i < fileNumber; i++) {
                String eachFileName = srcFile.getName() + "-" + i;
                File eachFile = new File(srcFile.getParent(), eachFileName);
                byte[] eachContent;
      
                // 从源文件的内容里,复制部分数据到子文件
                // 除开最后一个文件,其他文件大小都是100k
                // 最后一个文件的大小是剩余的
                if (i != fileNumber - 1) // 不是最后一个
                    eachContent = Arrays.copyOfRange(fileContent, eachSize * i, eachSize * (i + 1));
                else // 最后一个
                    eachContent = Arrays.copyOfRange(fileContent, eachSize * i, fileContent.length);
      
                try {
                    // 写出去
                    FileOutputStream fos = new FileOutputStream(eachFile);
                    fos.write(eachContent);
                    // 记得关闭
                    fos.close();
                    System.out.printf("输出子文件%s,其大小是 %d字节%n", eachFile.getAbsoluteFile(), eachFile.length());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    
  • 相关阅读:
    数组过滤函数 array_filter
    unset()到底搞掉了谁?
    $a=NULL 他到底是啥
    wordpress
    (转)Apache对文件后缀解析的分析利用
    isset()和empty()到底区别是什么。
    cad.net 封装jig
    cad.net 封装两个填充类
    ASP.NET CORE WEBAPI文件下载
    swagger配置
  • 原文地址:https://www.cnblogs.com/jeddzd/p/11730133.html
Copyright © 2011-2022 走看看