javaI/O流 类之间的关系和重要用法

I/O流分类

按照方向划分

输入流:InputStream、FileInputStream、Reader、ObjectInputStream、InputStreamReader、FileReader .将数据从存储设备读入到内存。其中Reader---->InputStreamReader--->FileReader. InputStream--->FileInputStream.为了提高读取速度,可以适当减少访问磁盘的次数,就使用到类缓存,BufferedReader、BufferedInputStream.其中InputStream--->FilterInputStream--->BufferedInputStream.Reader--->BufferedReader.

输出流:OutputStream、FileOutputStream、ObjectOutputStream、Writer、OutputStreamWriter、FileWriter. 将数据从内存写出到存储设备。其中类之间的关系:OutputStream--->FileOutputStream, Writer--->OutputStreamWriter--->FileWriter. 同理为了提高写出速度 使用到的缓存类有,BufferedWriter、BufferedOutputStream.OutputStream--->FilterOutputStream--->BufferedOutputStream, Writer--->BufferedWriter.

按照单位划分

字节流:FileIputStream,每次读取字节,可以读取任何类型的文件,使用缓冲区类BufferedInputStream,可以提高读取效率,亦可以自己写固定大小的缓冲区域,注意,使用BufferedInputStream需要flush.将缓冲区的内容刷新到内存中。close也相当于flush.

public static void main(String[] args) throws Exception {
	FileInputStream fis = new FileInputStream("D://aa.txt");
	BufferedInputStream bis = new BufferedInputStream(fis);
	int count  = 0;
	byte [] buf = new byte[1024];
	while((count = bis.read(buf))!=-1){
		System.out.println(new String(buf,0,count));
	}
	bis.close();
}

 FileOutputStream,每次以字节为单位写出,可以写出任何类型的文件,使用BufferedOutputStream,可以提高写出效率,也可以维护自己设定大小的缓冲区,当缓冲区写满才将其写入到文件,使用BufferedOutputStream同样需要flush,将缓冲区数据刷新到文件中

public static void main(String[] args) throws Exception{
	FileOutputStream fos = new FileOutputStream("D://buffer.txt",true);
	BufferedOutputStream bos = new BufferedOutputStream(fos);
	for (int i =0;i<10;i++){
		bos.write("helloworld\r\n".getBytes());
		bos.flush();
	}
	bos.close();
}

字符流:FileReader, FileWriter将字符流读入内存和写出文件。不能读取和写出二进制文件,否则会乱码,以为如(图片)和字符文件的编码方式式不一样的,字符流存在的意义,在一定程度上,读取字符的效率要高于字节流读取字符型文件。同样使用BufferedReader和BufferedWriter提高读取效率。亦可以自定义一个字符缓冲区。BuffereReader还提供了读取一行的方法。

读入字符文件到内存

public static void main(String[] args) throws Exception{
	FileReader fr  = new FileReader("write.txt");
	BufferedReader br = new BufferedReader(fr);
	int count  = 0;
	char [] buf  = new char [1024];
	while((count = br.read(buf))!=-1){
		System.out.println(new String(buf,0,count));
	}
	String line = null;
	while((line = br.readLine())!=null){
		System.out.println(line);
	}
	
	
	br.close();
}

将字符数据写出到文件,BufferedWriter提供writeLine方法写入一行,可以提高程序的可移植性。

public static void main(String[] args) throws Exception{
	FileWriter fw = new FileWriter("li");
	BufferedWriter bw = new BufferedWriter(fw);
	for(int i = 0 ;i <10 ;i++){
		bw.write("我爱ly");
		bw.newLine();
		bw.flush();
	}
	bw.close();
}

对象流(乱叫的):ObjectInputStream、ObjectOutputStream,以对象为单位、使用该类需要一个FileOutputStream、FileInputStream对象。writeObject方法写出,readObject方法读入,若需要同时读取多个对象,可以使用集合。如下:

写出

public static void main(String[] args) throws Exception{
	FileOutputStream fos = new FileOutputStream("D://oos.bin");
	ObjectOutputStream oos = new ObjectOutputStream(fos);
	Student s = new Student("xxx", 14);
	Student s1 = new Student("yyy", 17);
	List<Student> list = new ArrayList<>();
	list.add(s);
	list.add(s1);
	oos.writeObject(list);
	oos.close();
	System.out.println("序列化完毕");
}

读入

public static void main(String[] args) throws Exception{
	FileInputStream fis = new FileInputStream("D://oos.bin");
	ObjectInputStream ois = new ObjectInputStream(fis);
	List list = (List)ois.readObject();
	ois.close();
	System.out.println(list.toString());
}

这种如果不对Student类进行序列化会报java.io.NotSerializableException错误

字节流转换成字符流

输入流

该文件必须采用的是字符编码,将其读入到内存,InputStreamReader使用需要一个FileInputStream对象,另一个初始化参数是字符的编码格式

public static void main(String[] args)throws Exception {
	FileInputStream fis = new FileInputStream("write.txt");
	// 存储设备读入内存中,字节转换成字符
	InputStreamReader isr = new InputStreamReader(fis, "gbk");
	int count =0;
	char [] buf = new char[1024];
	while((count=isr.read(buf))!=-1){
		System.out.println(new String (buf,0,count));
	}
	isr.close();
}

FileOutputSteamWriter需要一个FileOutputStream对象,另一个初始化参数是字符的编码格式

public static void main(String[] args) throws Exception{
	FileOutputStream fos = new FileOutputStream("write3");
	OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
	for (int i = 0;i <10 ;i++){
		osw.write("hellowordk");
		osw.flush();
	}
	osw.close();
}

补充: Properties 的用法

一对、都是字符串、load方法

public static void main(String[] args) throws Exception{
	Properties pro = new Properties();
	pro.setProperty("name", "zhangsan");
	pro.setProperty("age", "12");
	System.out.println(pro.toString());
	
	PrintWriter pw = new PrintWriter("print1.txt");
	Set<String> pronames = pro.stringPropertyNames();
	for (String string : pronames) {
		pw.write(string+"="+pro.getProperty(string));
		
	}
	pro.list(pw);
	pw.close();
	
	FileOutputStream fos = new FileOutputStream("store.properties");
	pro.store(fos, "注释");
	fos.close();
	
	FileInputStream fis = new FileInputStream("store.properties"); 
	pro.load(fis);
	fis.close();
	System.out.println(pro.toString());
	
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值