Java IO详解------字节输入输出流

一、如何用字节流读取文件

在这里插入图片描述
read的几种参数写法
在这里插入图片描述

public static void main(String[] args) throws IOException {
		//定义自己的文件路径
		File file = new File("D:"+File.separator+"inputstream"+File.separator+"inputenglish.txt");
		//创建一个输入流,这里会报异常,所以用throws或者try-catch,最好是try-catch然后在finally中去关闭,此时的in是一个文件内容的读取流
		InputStream in = new FileInputStream(file);
		//输出首地址
		System.out.println(in);
		//★read();读取一个字节,返回读取的字节,这里的read()是不带参数的,read共有三种读取方式
		int data1 = in.read();
		//因为是字节流,所以如果不带(char),则输出的就是第一个字节的asicⅡ码值,加上了(char)就是首个字节对应的char
		System.out.println((char)data1);
		//★★read(byte[] b):读取多个字节保存到数组b中,这个是read的另外一个带参数的用法
		//首先需要定义一个byte数组来接收从inputstream中读取的字节流
		byte[] buffer = new byte[100];
		in.read(buffer);
		//输出的是字节数组,★★★这里我们可以看到之前已经输出的一个字节再接下来的输出中就不会继续输出,如文件中的字符串是abc,那么因为已经输出了第一个字节,那么接下来的输出就只有bc,有点类似于先生成一个流,然后大家排队消费,排在前面已经消费过的字节不能再继续被消费
		System.out.println(Arrays.toString(buffer));
		//输出的是对应的字节,文件中的内容
		System.out.println(new String(buffer));
		//读完了记得关闭
		in.close();
		//★★★★上面我们说了排在前面已经消费过的字节不能再继续被消费,如果想要重新消费怎么办?很简单,重新创建一个流就好了。
		InputStream in2 = new FileInputStream(file);
		//这里写的不好,因为byte数组的大小写死了,如果文件的内容有200该怎么办呐?
		byte[] buffer2 = new byte[100];
		in2.read(buffer2);
		System.out.println(new String(buffer2));
		//上面的方法还没有办法支持读取中文文本的读取

针对第四点读取固定长度,没有办法读取全部内容的优化

public String ReadFileM(String filepath) throws IOException{
		//获取输入流
		File file = new File(filepath);
		InputStream in = new FileInputStream(file);
		
		byte[] buffer = new byte[20];
		int length = 0;
		//这里使用StringBuffer,因为用StringBuffer对字符串进行拼接效率更好
		StringBuffer sBuffer = new StringBuffer();
		//方法解释中的-1相当于是数据字典告诉调用者文件已到底,可以结束读取了,这里的-1是int型,方便读取只能将8为字节转为10进制的数
		while ((length = in.read(buffer)) != -1) {
			//也能按照文件格式把数据读取出来,但是没有办法把它输出的内容当成一个字符串来操作,所以需要下面sBuffer.append
			//System.out.println(new String(buffer, 0, length));
			//System.out.println("每20个一读");
			//这里while循环判断length = in.read(buffer)是否为-1,while循环成立的时候,每次都读20个大小的字节,最后一次可能小于20,再下一次肯定是-1,所以循环成立,进入执行,每次加新的字节,加哪些字节,读取的buffer,从buffer的哪里加,从0的位置一直到length的位置
			sBuffer.append(new String(buffer, 0, length));
		}
		in.close();
		//System.out.println(sBuffer.toString());
		return new String(sBuffer);
	}

二、用字节流完成文件的复制

	public void FileCopy(String srcpath, String descpath) throws IOException{
		//获取文件对象
		File srcFile = new File(srcpath);
		File descFile = new File(descpath);
		//创建输入输出流
		InputStream in = new FileInputStream(srcFile);
		OutputStream out = new FileOutputStream(descFile);
		//读取和写入操作
		byte[] buffer = new byte[10];
		int len = -1;
		while ((len = in.read(buffer)) != -1) {
			System.out.println(new String(buffer,0,len));
			
			out.write(buffer,0,len);
		}
		
		out.close();
		in.close();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值