------- 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.字符流与字节流转换
转换流的特点:
- 其是字符流和字节流之间的桥梁
- 可对读取到的字节数据经过指定编码转换成字符
- 可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
- 当字节和字符之间有转换动作时;
- 流操作的数据需要编码或解码时。
具体的对象体现:
- InputStreamReader:字节到字符的桥梁
- OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。