025 Java 基本IO操作

基本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关键字

当我们把对象序列化后,所占用的字节往往过大,这样我们就可以把在对象序列化之前,把对象的一些不必要的属性给忽略掉,从而达到瘦身。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值