黑马程序员:java I/O流

------- android培训java培训、期待与您交流! ----------

一、概述

IO流用来处理设备间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流
流按流向分为:输入流,输出流

二、IO流常用基类

字节流的抽象基类:
InputStream,OutputStream
字符流的抽象基类:
Reader,Writer
注:由这四类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream、OutputStream、FileReader

三、字符流
1、通过FileWriter操作文件
package com.java;

import java.io.FileWriter;
import java.io.IOException;

public class IoDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//在外部建立引用 在try 内初始化
		FileWriter fWriter = null;
		try {
			/*
			 * 创建一个filewriter对象,该对象一被初始化就必须要明确操作的文件
			 * 
			 */
			fWriter = new FileWriter("e:\\demo.txt");
			//调用write方法将字符串写入到流中
			fWriter.write("1411");
			//刷新对象缓存区的内容
			//将数据刷到目的地中
			fWriter.flush();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			try {
				if(fWriter != null)
					//关闭流资源,但关闭之前会刷新一次内部的缓冲区资源
					fWriter.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}
			
		}
	}

}

2、创建对象时用
Filewriter fw = new FileWriter("e:\\Demo.txt",ture); 可以实现数据的续写

3、通过FileReader读文件
 
package com.java;

import java.io.FileReader;

public class FileReaderDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//创建一个文件读取流对象,和指定名称的文件相关联
		//要保证该文件已经存在的,如果不存在,会发生异常FileNotFoundException
		//异常处理请看上示例,本例为方便直接抛出异常,不做处理
		FileReader fReader=new FileReader("e:\\Demo.txt");
		int ch = 0;
		//调用读取的read方法
		//read():一次只能读一个字符,而且会自动往下读
		//当读到文件末尾时read()为 -1
		while((ch= fReader.read())!=-1){
			System.out.println((char)ch);
			
		}
		fReader.close();

	}

}

第二种方式,通过字符数组进行读取
package com.java;

import java.io.FileReader;

public class FileReaderDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//创建一个文件读取流对象,和指定名称的文件相关联
		//要保证该文件已经存在的,如果不存在,会发生异常FileNotFoundException
		//异常处理请看上示例,本例为方便直接抛出异常,不做处理
		FileReader fReader=new FileReader("e:\\Demo.txt");
		//定义字符数组用于存储读到的字符
		char[] buf  =  new char[3];
		int num=0;
		while((num=fReader.read(buf))!= -1){   //判断是否读到文件结尾 
			System.out.println(new String(buf,0,num));  // 输出读到的数据
		}
		fReader.close();
	}

}

四、字符流缓冲区
缓冲区出现提高了对数据的读写效率
对应类
BufferWriter
BufferReader
缓冲区要结合流才可以使用
在流的基础上对流的功能进行了增强

写入缓冲区:
package com.java;

import java.io.BufferedWriter;
import java.io.FileWriter;

public class Buffer {
	public static void main(String[] args) throws Exception {
		//创建一个字符写入流对象
		FileWriter fWriter = new FileWriter("e:\\Demo.txt");
		
		//为了提高字符写入流效率,加入了缓冲技术。
		//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可
		BufferedWriter bufferedWriter = new BufferedWriter(fWriter);
		
		bufferedWriter.write("afasjklf");
		//只要用到缓冲区,就要刷新
		bufferedWriter.flush();
		//其实关闭缓冲区就是要关闭缓冲区的流对象
		bufferedWriter.close();
	}

}

读入缓冲区
package com.java;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class Buffer {
	public static void main(String[] args) throws Exception {
		
		//创建一个读取流对象和文件相关联
		FileReader fReader = new FileReader("e:\\Demo.txt");
		//为了提高效率,加入缓冲区技术,将字符读取流对象作为参数传递给缓冲对象的构造函数
		BufferedReader bufferedReader = new BufferedReader(fReader);
		String slString = null;
		//该缓冲区提供了一次读一行的方法 readline,方便与对文本数据的获取。
		//当返回空时 标识对到文件末尾
		while((slString = bufferedReader.readLine())!=null)//
		{
			System.out.println(slString);
		}
	}

}

五、字节流
例:字节流拷贝图片
package com.java;

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

/*
 * 复制图片
 * 思路
 * 1、用字节流读取对象和图片关联
 * 2、用字节写入流对象创建一个图片文件,用于存储获取的图片数据
 * 3、通过循环读写,完成数据的存储
 * 4、关闭资源
 */
public class CopyPic {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileOutputStream fileOutputStream = null;
		FileInputStream fileInputStream = null;
		try {
			fileOutputStream = new FileOutputStream("e:\\1.jpg");
			fileInputStream = new FileInputStream("e:\\2.jpg");
			byte[] buf = new byte[1024];
			int len = 0;
			while ((len = fileInputStream.read(buf))!=-1) {
				fileOutputStream.write(buf,0,len);
				
			}
		} catch (Exception e) {
			// TODO: handle exception
			throw new RuntimeException("复制文件失败");
		}finally{
			try {
				if (fileInputStream!=null) {
					fileInputStream.close();
				}
				
			} catch (Exception e2) {
				// TODO: handle exception
				throw new RuntimeException("读取关闭失败");
			}
			try {
				if (fileInputStream!=null) {
					fileOutputStream.close();
					
				}
				
			} catch (Exception e2) {
				// TODO: handle exception
				throw new RuntimeException("写入关闭失败");
			}
		}
	}

}


六、字节流缓冲区
例:通过字节流的缓冲区来实现复制

package com.java;

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

public class CopyMp3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		long start = System.currentTimeMillis();
		copy_1();
		long end = System.currentTimeMillis();
		System.out.println((end-start)+"毫秒");
	}
	public static void  copy_1() throws IOException {
		
		
		BufferedInputStream bufferedInputStream = new  BufferedInputStream(new FileInputStream("e:\\1.mp3"));
		BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("e:\\2.mp3"));
		
		int buf = 0;
		while((buf = bufferedInputStream.read())!=-1){
			bufferedOutputStream.write(buf);
			
		}
		bufferedInputStream.close();
		bufferedOutputStream.close();
	}

}




7.字符流与字节流转换

转换流的特点:

  1. 其是字符流和字节流之间的桥梁
  2. 可对读取到的字节数据经过指定编码转换成字符
  3. 可对读取到的字符数据经过指定编码转换成字节

何时使用转换流?

  1. 当字节和字符之间有转换动作时;
  2. 流操作的数据需要编码或解码时。

具体的对象体现:

  1. InputStreamReader:字节到字符的桥梁
  2. OutputStreamWriter:字符到字节的桥梁

这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值