【Java-API】字节输入流InputStream、OutputStream(抽象父类) FileInputStream、FileOutputStream(子类)概念和常用方法和代码案例

字节流

概念:以字节byte为单位读取和写出数据,(记事本打开,我们不能读懂内容的就是字节)  可以用于读取二进制文件及任何类型文件

使用场景:适用于所有非文本相关的文件读取和写出

字节流XMind图总结:
 

文件字节输入流FileInputStream用法举例

1,int read():一次读取一个字符案例

package cn.meitua.fileinputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * InputStream抽线父类
 * 常用子类FileInputStream 
 * 字节输入流
 */
public class FileInputStreamTest {
	public static void main(String[] args) throws Exception {
		//创建一个File对象
		File file = new File("D:\\Eclipse\\meitua\\fileinputstream01.java");
		//创建一个子类对象
		FileInputStream f = new FileInputStream(file);
		
		//int read()  从该输入流读取一个字节的数据 ,这里获取的是一个int类型的ASCII码表,读到-1就执行结束		
		/*int read = f.read(); //读取的是一个ASCII码的值112
		System.out.println(read);//
		System.out.println((char)read);//需要转成char字符类型*/
					
		int date;
		//判断当都取到-1的时候就结束执行,
		while ((date=f.read())!=-1) {//将f.read()读取的值赋值给date,保证读取一次就打印一次。
			System.out.print((char)date);//打印int类型的 date,将ASCII码强转成char字符
			//不能打印字符(字符乱码)是因为一个字符对应多个字节
		}		
		//释放资源 
		f.close();
	}
}

2,int read(byte[] buff, int index , int len):一次读取一个数组(这里就不写没有指定下标和长度的案例了因为局限性比较大,例如你要读取12345,每次读取的数组长度为3,就会出现123 453这种情况,因为底层原理读取的时候是进行覆盖的)

package cn.meitua.fileinputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * InputStream 字节输入流
 * 
 *
 */
public class FileInputStreamByteArr {
	public static void main(String[] args) throws Exception {
		//创建一个File对象
		File file = new File("D:\\Eclipse\\meitua\\fileinputstream01.java");
		//创建一个字节数组
		byte[] bys = new byte[3];
		//创建一个子类对象
		FileInputStream f = new FileInputStream(file);
		
		//int read(byte[] bys) 这里表示一次读取3个字节数组 ,读到-1就执行结束
		
		int read = f.read(bys); //读取的是一个ASCII码的值112
		System.out.println(read);// 这里读取的数据返回值是读取的长度为多少,而不是数据
		System.out.println((char)read);//  需要转成char字符类型
		
		//int date;
		//f.read(bys) 这里读取的数据返回值是读取的长度为多少,而不是数据,如果读不到数据就会返回-1
		int date;
		while (( date = f.read(bys))!=-1) {
		//int read(byte[] b, int off, int len) 从该输入流读取最多 len字节的数据为字节数组。 
		//while (( date = f.read(bys,1,2))!=-1) {//当一次性读取3个字节时,当都不到字节数时就直接返回-1,长度也就变成了-1
			//new String(bys) 构造方法,将byte数组转换成String类型
			//System.out.println(new String(bys));//这里会进行覆盖会输出 eg总共只有1234     输出则为123 423
			
			//为了避免出现423 我现在只要4
			System.out.println(new String(bys,0,date));// 表示从那个数组获取数据,开始下标,获取的数组数组长度		
		}
		//释放资源
		f.close();
	}
}

文件字节输入流FileOutputStream用法举例

1.void write(int ascii码):一次写出1个字节

package cn.meitua.fileoutputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 字节输出流 写数据
 * 
 *
 */
public class FileOutputStreamTest {
	public static void main(String[] args) throws Exception {
		//创建一个字节输出流进行写数据
		//FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java");//默认后面是false,会进行覆盖操作
		FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java",true);//是true,会进行追加写入
		//调用方法进行写数据
		out.write(65);
		out.write(66);
		out.write(66);
		
		//释放资源
		out.close();	
		}	
	}

2,void write(byte[] buff):一次写出多个字节

public class FileOutputStreamByteArr {
	public static void main(String[] args) throws Exception {
		//创建一个字节输出流进行   写数据
		//FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java");//默认后面是false,会进行覆盖操作
		FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java",true);//是true,会进行追加写入
		
		//创建一个字节数组,表示每次写的数据
		byte[] bys = {66,65,67,69};
		
		//调用方法进行写数据
		out.write(bys);
		
		//输出字符串类型
		String s = "你好世界";
		byte[] bytes = s.getBytes();// 需要将字符串转换成byte数组
		out.write(bytes);// 调用write方法写入指定的数组
		
		//释放资源
		out.close();
		
		}	
	}

综合文件字节输入流和文件字节输出流给出一个案例,实现对文件数据的读取和写入

综合案例;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 读取一个文件将文件写入到新文件
 * 数据只能写在文件里面,不能写在文件名(目录)里面
 * 
 * @author Mixi
 *
 */
public class FileOutputStreamCoTest {

	public static void main(String[] args) throws Exception {
		// 创建一个文件字节输入流(读数据)
		FileInputStream in = new FileInputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java"\\代码.png");
		// 创建一个文件字节输出流
		FileOutputStream out = new FileOutputStream(""D:\\Eclipse\\meitua\\fileoutputstream01.java"\\测试代码是否成功.png");

		// 创建一个字节数组表示每次读取的长度
		byte[] bys = new byte[1024];
		// 定义一个变量进行接收每次读取的个数(每次读取一个数组)
		int date;
		// 对文件字节输出流的文件进行读取,如果等于-1读取结束
		while ((date = in.read(bys)) != -1) {// date = in.read(bys) 接收每次读取的长度,但是内容还是在数组里面,将来写入数据还是写的数据
			// 写数据
			//out.write(bys); // 这里如果不进行限制将会后面进行覆盖eg;1234 每次读取三个 这个会输出 123 423下面改进
			out.write(bys, 0, date); // 表示指定要写入的数组,开始下标和写入的长度  会输出 123 4
		}

		// 释放资源 不释放资源的话资源就一直被占用。
		in.close();
		out.close();
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mxin5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值