基本IO操作
1.IS和OS
1.1输入和输出
当我们在程序中需要从文件中获取数据,或将程序中的数据发送到文件中,就成为输入和输出
输入:当我们需要从外界的文件中“读取”数据到程序中。
输出:当我们需要从程序中“写出”数据到外界的文件中。
1.2节点流和处理流:区分为看是否与直接特定的地方(节点)相连
节点流是指从或向一个地方(节点)读写数据
处理流是指对一个已经存在的流进行连接和封装,通过流封装的流的功能调用实现文件的读写
处理流总要带其他流作为参数,一个流对象经过其他流的多次包装,称为流的连接
1.3IS和OS常用方法
InputStream是所有字节输入流的父类,其定义了相关的读取方法
int read():读取一个字节,int类型返回,“低八位”有效,若返回-1,说明读取到了文件末尾。
int read(byte] d):读取一个字节数组,int类型返回,尝试读取数组长度length个字节存入该数组,返回值实际读取到的字节数量。
OutputStream是所有字节输出流的父类,其定义了相关的写出方法
void write(int d):从程序写出一个字节,参数为int类型,“低八位”有效
void write(int[] d):将数组中的所有字节全部从程序中写出。
2.文件流
2.1重建FOS对象(重写模式)
FileoutputStream:文件字节输出流,是对字节从程序中写出,将字节写入文件中,其构造犯法如下
FileOutputStream(File file/Stream fileName)
代码如下:
//测试文件字节输出流
//FileOutputStream fos=new FileOutputStream(new File("fos.dat"));
FileOutputStream fos=new FileOutputStream("fos.txt");
//写出一组字节
fos.write("HelloWorld".getBytes());
fos.close();
}
这种写出模式,当重新写出是,文件中的内容将被覆盖。原有数据全部消失。
2.2创建FOS对象(覆盖模式):这种写出模式,当从程序中写出时,将字节追加到文件中最后面。
代码如下:
/**
* 测试追加写的模式
* @throws IOException
*/
@Test
public void testFosByAppend() throws IOException{
//FileOutputStream fos=new FileOutputStream(new File("fos.dat"));
FileOutputStream fos=new FileOutputStream("fos.txt",true);
//写出一组字节
fos.write("HelloWorld".getBytes());
fos.close();
}
2.3创建FIS对象:是文件的字节输入流,我们应该使用该流以字节为单位从文件中读取数据
其构造方法为: FileInputStream(File file/String fileName)
代码如下:
/**
* 测试文件输入流的创建和读取数据
* @throws IOException
*/
@Test
public void testFis() throws IOException{
//根据给定的file对象创建文件输入流
//FileInputStream fis=new FileInputStream(new File("fos.txt"));
//根据给定的文件路径创建文件的输入流
FileInputStream fis=new FileInputStream("fos.txt");
int d=-1;
while((d=fis.read())!=-1){
System.out.print((char)d+" ");
}
}
3.缓冲流
3.1
BOS基本工作原理:在在对文件做写出操作时,增大写出次数无疑会降低写出效率,因而可以通过使用缓冲流一次性批量写出,从而提高写出次效率
BufferedOutputStream内部维护一个缓冲区(字节数组),当通过缓冲流写出数据时,先把数据写入到缓冲区中,等到缓冲区中满后,才将数据写出。
3.2BOS的flush方法
使用缓冲流可以提高写出效率,但数据缺乏及时性,因为缓冲区知道数据保存满后才能进行写出,但我们需要及时将数据写出,由以下方法
void flush()
清空缓冲区,将缓冲区中的数据全部写出。
3.3BIS基本工作原理
原理和BOS相似,在BufferedInputStream中内部维护一个缓冲区(字节数组),当该流尽可能的把字节从文件中读取到程序中,知道缓冲区读满后,才将数据返回到程序中,从而大大提高了读取效率、
3.4 BIS和BOS实现的文件的复制
代码如下:
/**
* 测试基于缓冲流的复制文件
* @throws IOException
*/
@Test
public void testCopy() throws IOException{
FileInputStream fis=new FileInputStream("fos.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("fos_copy3.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
int d=-1;
while((d=bis.read())!=-1){
bos.write(d);
}
System.out.println("复制完毕");
bis.close();
bos.close();
}
4.对象流
4.1对象的序列化
对象存在堆内存中,如果要将对象保存在文件中,这时我们就需要把对象转换为字节数列,这个过程就称为对象序列化,相反的过程称为对象的反序列化。
4.2使用OOS实现对象序列化
ObjectOutputStream:对象输出流,实现对象序列化输出。
void writeObject(Object c):指将一个对象转换为字节序列写出。
代码如下:
/**
* 使用Oos实现对象的序列化
* @throws IOException
*/
public void testOos() throws IOException{
FileOutputStream fos=new FileOutputStream("emp.obj");
ObjectOutputStream Oos=new ObjectOutputStream(fos);
Emp emp=new Emp("张三",15,"男",4000);
Oos.writeObject(emp);
Oos.close();
}
4.3使用OIS实现对象反序列化
ObjectInputStream:对象输入流,实现对象反序列化输入
Object read():该方法可以将从流中读取到的字节转换为相应的对象
代码如下:
/**
* 使用OIS实现对象的反序列化
* @throws IOException
* @throws ClassNotFoundException
*/
@Test
public void testOis() throws IOException, ClassNotFoundException{
FileInputStream fis=new FileInputStream("emp.obj");
ObjectInputStream Ois=new ObjectInputStream(fis);
Emp emp=(Emp)Ois.readObject();
System.out.println(emp);
System.out.println("反序列化完毕");
Ois.close();
}
4.4Serialzable接口
对于想要进行对象序列化的类,必须实现Serialzable接口
不需要实现任何方法,实现Serialzable只是声明了该类可以被对象序列化
如需要进行跨平台,需要进行设置serialVersionUID,只是因为当后面的类的属性放生了改变,不写会发生异常,当设置的serialVersionUID时,会将后面没有的进行相应形式默认值对象的反序列化
4.5 transient关键字
当我们把对象序列化后,所占用的字节往往过大,这样我们就可以把在对象序列化之前,把对象的一些不必要的属性给忽略掉,从而达到瘦身。