最简单的输入输出流应用

  学习了输入输出流之后,我了解到,关于输入输出流,就是在读取和写入数据是所用到的一种抽象的概念。它就像两根水管,负责把数据从一个地方输送到另一个地方。

  输入流(InputStream),是在我们要从某个地方读取数据的时候使用;

  输出流(OutputStream),是在我们要向某个地方写入东西的时候使用。

(这里的输入输出正好与我们观念上认为的输入输出相反,刚开始理解为了输出流是电脑向外界输出,输入是向电脑内输入,因此希望大家可以搞清他们的关系)

 

学习了输入输出流后,我们进行了简单的练习,向一个文件中写入数据,然后再把它读取出来。

电脑中本来存在着一个newfile文件,现在要向里面写入数据。

首先我们要新建一个类,是要写入的类的属性

//新建一个魔法师类
public class Enchanter {
	//魔法师的属性个数
	public int gander=2013;//年级
	public int count;//魔法师人数
	public int age;//年龄
	public String name;//名字
}

 那么之后要做的,就是给已经存在的newfile写入数据,然后再读出来:

package lyw.summer0626;

import java.util.ArrayList;
import java.util.List;

//读写类
public class WREnchanter {
	static int gander=2013;//年级
	String newfile="src/newfile.txt";
	//写入的方法
	public void writeEnch(List<Enchanter> ench){
		try{
			java.io.FileOutputStream fos=new java.io.FileOutputStream(newfile);
			java.io.DataOutputStream dos=new java.io.DataOutputStream(fos);
			//写入对象的属性
			int count=ench.size();  //列表内巫师的个数
			dos.write(gander);
			dos.write(count);
			for(int i=0;i<count;i++){
				Enchanter en=ench.get(i); //得到列表内第i个对象
				//传入第i个对象的姓名
				byte[] by1=en.name.getBytes(); //把姓名转换为byte数组存入数组内
				byte namelen=(byte)by1.length;
				dos.writeByte(namelen);
				dos.write(by1);
				dos.writeInt(en.age);
			}
			dos.flush();
			dos.close();
			System.out.println("文件写入成功啦~~~");
		}catch(Exception ef){
			ef.printStackTrace();
			System.out.println("文件写入出错啦~~~");
		}
	}
	//读取的方法
public List<Enchanter>  readEnch(){
	List<Enchanter> ench=new ArrayList<Enchanter>();
		try{
			java.io.FileInputStream fis=new java.io.FileInputStream(newfile);
			java.io.DataInputStream dis=new java.io.DataInputStream(fis);
			int gander=dis.read();
			int count=dis.read();
			for(int i=0;i<count;i++){
				//姓名
				byte namelen=dis.readByte();//名字的长度
				byte[] bytes1=new byte[namelen];//把字节存入bytes数组
				dis.read(bytes1);
				String name=new String(bytes1);//把bytes1数组转为字符串
				int age=dis.readInt();//年龄
				Enchanter en=new Enchanter();//实例化一个魔法师对象
				en.name =name;
				en.age=age;
				en.count=count;
				en.gander=gander;
				ench.add(en);
				System.out.println("魔法师:"+name+"  年龄:"+age);
			}
			dis.close();
		}catch(Exception ef){
			ef.printStackTrace();
			System.out.println("文件读取出错啦~~~");
		}
		return ench;
	}
	public static void main(String[] args) {
		WREnchanter t=new WREnchanter();
		List<Enchanter> list1=new ArrayList<Enchanter>();
		for(byte i=0;i<11;i++){
			Enchanter en=new Enchanter();
			en.age=13+i;
			en.name="Enchanter"+i;
			list1.add(en);
		}
		System.out.println("一共有"+list1.size()+"个魔法师,他们是"+gander+"年级");
		t.writeEnch(list1);
		t.readEnch();
	}
}

 

  在实际读取流中的数据时,只能按照流中的数据存储顺序依次进行读取,所以,我们在写入数据的时候的顺序,就是我们读取数据时候的顺序。

这就完成了在文件中写入数据然后读出的过程,这只是简单的输入输出流应用,只后我们还会有BMP格式文件的解析,实现一个基本的文件读写过程。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值