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\n",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();
        }

    }
}

传送门:此处更详细

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值