Io流

1.基础概念

在 Java 中 java.io 包含的每一个类几乎都要进行输入和输出操作。所有的这些流代表一个输入源和输出目的地。在 java.io 包中支持许多数据,如原语,对象,本地化字符等等。

流可以被定义为一个序列的数据。输入流用来从一个源中读数据,输出流用来向一个目的地写数据。

字节流:

Java 字节流是用来处理8比特字节的输入和输出。常用的是 FileInputStream 类和 FileOutputStream 类。

字符流:

Java 字符流用于处理16位 unicode 的输入和输出。最常用的类是, FileReader 和 FileWriter。虽然在内部 FileReader 还是使用 FileInputStream 和 FileWriter 使用 FileOutputStream,但是主要的区别是 FileReader 和 FileWriter 一次读写两个字节。

2.FileOutputStream

//建立字符输出的对象,同是指向了输出出数据的位置
	FileOutputStream f=new FileOutputStream("a.txt");
//向输出的文件输入数据
	f.write("hello".getBytes());
	f.write("java".getBytes());
	f.write("world".getBytes());
	//输出结果是:hellojavaworld
//要实现换行输出方式:windows:换行符是\r\t  Linx:\n   mac:\r
	f.write("\r\t".getBytes());
	f.write("one".getBytes());
	f.write("\r\t".getBytes());
	f.write("tow".getBytes());
	//通过\r\t来实现换行
	
	//
	f.close();

3.FileInputStream

//创建输入对象
	FileOutputStream f=new FileOutputStream("b.txt");
	//写入数据
	f.write("j".getBytes());;
	f.write("\r\t".getBytes());
	for(int x=0;x<=10;x++) {
		f.write(("java"+x).getBytes());
		f.write(("\r\t").getBytes());
	}
	
//建立输出对象
	FileInputStream f1=new FileInputStream("b.txt");
	int read = f1.read();
	//读出来的是该字符对应得AscaII表
	System.out.println(read);
	//输出为106,对应得是j
	System.out.println((char)read);
    //只输出一个字节,提高效率只能用循环

//for循环
	//用read1接收符f1读出来的数据并存储
	int read1=f1.read();
	//当读出来的为-1是则说明没有数据可以读,则结束
	while(read1!=-1) {
		//输出read1,但是因为是int类型,所以通过强制类型转化来转为字节类型
		System.out.print((char)read1);
		//再用read1接收下一个数据并存储,用来循环
		read1=f1.read();
	}
//for循环最终版
	System.out.println("--------------");
	int read3=0
			;
	while((read3=f1.read())!=-1) {
		System.out.print((char)read3);
	}
	f.close();

4.问题:  现在的read方法只能一个字节一个字节的读,效率慢,改进方法

//int read(byte[] b)  从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 
public class file3 {
public static void main(String[] args) throws IOException {
	FileInputStream in=new FileInputStream("b.txt");
//解决read()方法一次只能读一个字符的问题
	//建立byte[]数组,该数组的作用就是传入fead()中,来改变每次只读一个字符的情况
	//而数组是多长,那么每次读多少个数组,减少读取太多的重复性,节约时间
	byte[] by=new byte[1024];
	//建立int类型的r进行判断是否读出数据(-1则表示没有数据)
	//同是将存储read()方法读取出来的数据
	int r=0;
	//循环流程:
	//1.in.read()读取字符
	//2.read()中传入了by字符数组,(地层走的是by.length来获取该数组的长度,然后一次读取by.length个字符,并将
	//值存入by中
	//3.read每次读出来的是int类型,传给r,通过判断r是否等于-1,可知是否数据为空
	//4.ture结束,false进入循环体输出
    while((r=in.read(by))!=-1) {
//    while((r=in.read(new byte[1024]))!=-1){
    	//while循环false的时候带出的是1024个by字节,遍历by字节即可
    	//(如果需要输出的小于1024,但是却依然去遍历1024个字节的话,没有值得位置会用 □ 补齐
    	//所以遍历时只需要遍历到有数据该位的长度
    	//遍历by字节的方法
    	for(int x=0;x<r;x++) {
    		System.out.print((char)by[x]);
    	}
    	//简单法(用new String的构造方法遍历)
    	System.out.println(new String(by,0,r));
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值