java I/O 学习(一)

简介

java I/O以标准化的操作对外界统一读写数据.
I–输入:从外界到程序的方向,读取数据
O–输出:从程序到外界的方向,写出数据

分类

节点流:低级流,是实际连接数据源与程序 的’管道’,负责实际读写数据的流.读写一定建立在节点流基础上进行
处理流:不能独立存在,建立在其他流上,当数据流经当前流时对数据加工处理,简化操作.

文件流

java.io.FileInputStream继承自InputStream
java.io.FileOutputStream继承自OutputStream
常用的一对低级流实现类,用来连接文件,对文件进行 读写操作的

//java.io.FileOutputStream
public class FOSDemo {
	public static void main(String[] args) throws IOException {
		/*
		 * 文件输出流的常用构造方法:
		 * FileOutputStream(File file)
		 * FileOutputStream(String path)
		 * 以上两种构造方法创建的文件输出流为
		 * 覆盖写模式,即:若指定的文件已经存在则
		 * 会将该文件数据清除,然后将通过当前流
		 * 写入的数据作为新数据保存.
		 * 
		 * 
		 * FileOutputStream(File file,boolean append)
		 * FileOutputStream(String path,boolean append)
		 * 以上两种构造方法创建的文件输出流为
		 * 追加模式.即:若指定的文件存在,则原数据
		 * 保留,通过当前流写出的内容会顺序的追加
		 * 到文件后面.
		 */
		FileOutputStream fos
	= new FileOutputStream("./fos.txt",true);
		String line = "么么哒";
		byte[] data = line.getBytes("GBK");
		fos.write(data);
		System.out.println("写出完毕!");
		fos.close();
	}
}
//java.io.FileInputStream
public class FISDemo {
	public static void main(String[] args) throws IOException {
		FileInputStream fis
			= new FileInputStream("./fos.txt");
		byte[] data = new byte[100];
		int len = fis.read(data);
		System.out.println("实际读取了"+len+"字节");
		/*
		 * String(byte[] data,int offset,  int len,String csn)
		 * 将给定的字节数组中从下标offset处的连续
		 * len个字节按照指定的字符集转换为字符串
		 */
		String line = new String(data,0,len,"GBK");
		System.out.println(line);
		fis.close();
	}
}

流操作后要记得close.

复制示例
package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用文件流完成文件的复制操作
 */
public class CopyDemo {
	public static void main(String[] args) throws IOException {
		/*
		 * 1:创建文件输入流读取原文件
		 * 2:创建文件输出流写复制文件
		 * 3:循环从原文件读取字节并写入到
		 *   复制文件中完成复制工作
		 */
		FileInputStream fis	= new FileInputStream("./movie.wmv");
		FileOutputStream fos= new FileOutputStream("./movie_cp.wmv");
		int len = -1;
		byte[] data = new byte[1024*10];
		while((len = fis.read(data))!=-1) {
			fos.write(data,0,len);
		}
		System.out.println("复制完毕");
		fis.close();
		fos.close();
	}
}

可以使用缓冲流java.io.BufferedOutputStream
java.io.BufferedInputStream
提高读写效率

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* 缓冲流
* java.io.BufferedOutputStream
* java.io.BufferedInputStream
* 缓冲字节输出输入流是一对高级流,在流连接中的
* 作用是提高读写效率(内部默认维护一个8K的字节
* 数组,并将读写的数据统一转换为块读写从而提高
* 的效率.)
* 
* 
* @author Administrator
*
*/
public class CopyDemo2 {
  public static void main(String[] args) throws IOException {
  	FileInputStream fis	= new FileInputStream("music.mp3");
  	BufferedInputStream bis	= new BufferedInputStream(fis);
  	FileOutputStream fos= new FileOutputStream("music_cp.mp3");
  	BufferedOutputStream bos	= new BufferedOutputStream(fos);		
  	int data = -1;
  	while((data = bis.read())!=-1) {
  		bos.write(data);
  	}
  	System.out.println("复制完毕!");
  	bis.close();
  	bos.close();
  }
}

使用缓冲输出流会存在缓冲区问题

public class BOS_flushDemo {
	public static void main(String[] args) throws IOException {
		FileOutputStream fos= new FileOutputStream("bos.txt");
		BufferedOutputStream bos= new BufferedOutputStream(fos);
		String str = "hey!everybody,啦啦啦...";
		byte[] data = str.getBytes("GBK");	
		bos.write(data);
		/*
		 * void flush()
		 * 该方法是OutputStream定义的方法,实际上所有
		 * 字节输出流都有该方法,但并非所有字节输出流
		 * 都实现了这个方法的功能,只有缓冲流的该方法
		 * 有实际意义,作用是一次性将缓冲区已经缓存的
		 * 数据写出.
		 * 之所以所有字节输出流都有这个方法是因为流
		 * 连接应用中缓冲流通常不是"终端流"(直接被我们
		 * 操作的流),为了传递刷新缓冲区功能才有的.
		 */
		bos.flush();
		System.out.println("写出完毕!");
		bos.close();
	}
}

学无止境!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值