学习了输入输出流之后,我了解到,关于输入输出流,就是在读取和写入数据是所用到的一种抽象的概念。它就像两根水管,负责把数据从一个地方输送到另一个地方。
输入流(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格式文件的解析,实现一个基本的文件读写过程。