zoukankan      html  css  js  c++  java
  • Java IO 字节流


    创建基于文件的输入输出流

    package JavaIOTest;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    public class BuildInputStream {
    
        public static void main(String[] args) {
            try {
                File file = new File("d:/lol.txt");
                //创建基于文件的输入流
                FileInputStream fileInputStream = new FileInputStream(file);
                File file1 =  new File("d:/lol.txt");
                //创建基于文件的输出流
                FileOutputStream fileOutputStream = new FileOutputStream(file1);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    以字节流的形式读取文件内容

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

    package JavaIOTest;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    public class BuildInputStream {
    
        public static void main(String[] args) {
            try {
                //准备lol.txt其内容为AB ASCII:65 66
                File file = new File("d:/lol.txt");
                //创建基于文件的输入流
                FileInputStream fileInputStream = new FileInputStream(file);
                //创建字节数组,其长度就是文件的长度
                byte[] all = new byte[(int)file.length()];
                //以字节流的形式读取文件内容
                fileInputStream.read(all);
                for(byte b : all){
                    System.out.println(b);
                }
                //每次用完流都应进行关闭
                fileInputStream.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    以字节流的形式向文件写数据

    package JavaIOTest;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    public class BuildInputStream {
    
        public static void main(String[] args) {
            try {
     
                File file1 =  new File("d:/lol2.txt");
                //创建基于文件的输出流
                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                //准备长度为2的字节数组,初始化为88,89,对应X,Y
                byte[] b1 = new byte[]{88,89};
                //将数据写入输出流
                fileOutputStream.write(b1);
                //关闭输出流
                fileOutputStream.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    使用mkdir创建多级目录

    package JavaIOTest;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    
    public class FileOutPutStreamTest {
        String[] path;
        public static void main(String[] args) {
            File file = new File("d:/xyz/z/zzz/zzzz/lol.txt");
            File dir = file.getParentFile();
            if (!dir.exists()){
                dir.mkdirs();
            }
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                byte[] b = new byte[]{89,87};
                fileOutputStream.write(b);
                fileOutputStream.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    

    练习:分割文件

    将一个13字节的文件按2字节分割为多份子文件

    package JavaIOTest;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Arrays;
    
    public class SplitFileTest {
        public static void main(String[] args) {
            //每次读的字节数
            int eachReadSize = 2;
            //子文件数量
            int subFileNumber;
            //每次读取的内容存放到eachContentzhong
            byte[] eachContent;
            //创建文件对象
            File file = new File("d:/xyz/z/zzz/zzzz/lol.txt");
            File dir = file.getParentFile();
            //判断父目录是否存在,不存在则创建父目录
            if (!dir.exists()){
                dir.mkdirs();
            }
            try{
                //创建输入流一次性读取文件中所有字节
                FileInputStream fileInputStream = new FileInputStream(file);
                byte[] bytes = new byte[(int)file.length()];
                fileInputStream.read(bytes);
                //判断子文件数量
                if (0 == file.length()%eachReadSize){
                    subFileNumber = (int)file.length()/2;
                }else{
                    subFileNumber = (int)file.length()/2 + 1;
                }
    
                for(int i = 0; i < subFileNumber;i++){
                    //判断每次写文件的长度,如果不是最后一个文件则长度为2字节,如果是最后一个文件则长度是文件剩余长度
                    if(subFileNumber-1 != i){
                        eachContent = Arrays.copyOfRange(bytes,eachReadSize * i,(i+1) * eachReadSize);
                    }else {
                        eachContent = Arrays.copyOfRange(bytes,eachReadSize * i,(int)file.length());
                    }
                    File subFile = new File(dir+"/lol"+"-"+i+".txt");
                    FileOutputStream fileOutputStream = new FileOutputStream(subFile);
                    fileOutputStream.write(eachContent);
                    fileOutputStream.close();
                    System.out.printf("输出子文件:%s,其大小是%d
    ",subFile,subFile.length());
                }
                fileInputStream.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    
    

    练习:合并文件

    将上一个练习中的文件全部合并,并验证能否打开

    package JavaIOTest;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    //1、创建目标文件
    //2、读一次子文件写一次子文件
    //3、使用输出IO流输出
    public class MergeFileText {
        
        public static void main(String[] args) {
            //创建最终写入的目标文件对象
            File targetFile = new File("d:/xyz/z/zzz/zzzz/lol3.txt");
            //创建一个文件列表对象用于存放子文件对象
            List<File> subFiles = new ArrayList<>();
            //获取当前目录对象
            File dir = targetFile.getParentFile();
            //得到当前目录下的所有文件和目录的数组
            File[] allFiles = dir.listFiles();
            //创建一个字节数组对象长度为2
            byte[] b = new byte[2];
            //读取文件的实际长度为len
            int len = -1;
            //找到所有的子文件并添加到列表中
            for (File file : allFiles){
                if (file.isFile()&& file.getName().startsWith("lol-")){
                    subFiles.add(file);
                }
            }
            try{
                //创建输出流
                FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
                //每读一个写一个
                for(File file : subFiles){
    
                    FileInputStream inputStream = new FileInputStream(file);
    
                    len = inputStream.read(b);
                    System.out.println(len);
                    inputStream.close();
                    fileOutputStream.write(b,0,len);
                }
                fileOutputStream.close();
            }catch (IOException e){
                e.printStackTrace();
            }
    
        }
    }
    

    传送门:此处更详细

  • 相关阅读:
    几种 JavaScript 动画库推荐
    微软工程师为你推荐了十本程序员必读书目
    前端新老手必备的34种JavaScript简写优化技术
    Airbnb 爱彼迎 visx 项目介绍
    开源中间件技术支持(5000+元/天)
    C# Byte数组与Int16数组之间的转换(转)
    【636】K.sum 与 np.sum 的区别
    【635】语义分割 label 通道与模型输出通道的
    【634】ndarray 提取行列进行任意变换 & 相关 ndarray 操作
    面试官:设计一个安全的登录都要考虑哪些?我一脸懵逼。。
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860165.html
Copyright © 2011-2022 走看看