简介:
Java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有4个类为流的顶级类,分别为InputStream和OutputStream,Reader和Writer。
InputStream是一个抽象类,是所有输入字节流的父类。
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
字节流和字符流的区别:
- 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
- 字节流一次读入或读出是8位二进制。
- 字符流一次读入或读出是16位二进制。
字节流
定义: 在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。
说明:
字节流是程序中最常用的流。
在JDK中,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。
用字节流copy文件
FileInputStream in = new FileInputStream("source/src.jpg");
FileOutputStream out = new FileOutputStream("target/dest.jpg");
int len = 0;
while ((len = in.read()) != -1) {
out.write(len);
}
System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
in.close();
out.close();
//使用字节缓冲区copy文件
FileInputStream in = new FileInputStream("source/src.jpg");
FileOutputStream out = new FileOutputStream("target/dest.jpg");
int len = 0;
byte[] buff = new byte[1024];
while ((len = in.read(buff)) != -1) {
out.write(buff,0,len);
System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
in.close();
out.close();
字节缓冲流
说明: 除了定义字节缓冲区来提高文件拷贝效率外,IO中还提供了两个字节缓冲流来提高文件拷贝效率 BufferedInputStream和BufferedOutputStream 它们的构造方法中分别接收InputStream和OutputStream类型的参数作为对象,在读写数据时提供缓冲功能。
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("source/src.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("target/dest.jpg"));
int len = 0;
long beginTime = System.currentTimeMillis();
while ((bis.read()) != -1) {
bos.write(len);
}
long endTime = System.currentTimeMillis();
System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
bis.close();
bos.close();
在用字节流写入字符串时,需要用到getbytes()方法。
public class Demo1
{
public static void main(String[] args) throws IOException
{
FileOutputStream fos=new FileOutputStream("d:\\java\\test.txt",true);
FileInputStream fis=new FileInputStream("d:\\java\\test.txt");
try{
fos.write("Hello".getBytes());
int len=0;
while((len=fis.read())!=-1)
{
System.out.print((char)len);
}
}catch(IOException e)
{
e.printStackTrace();
}
finally
{
fos.close();
fis.close();
}
}
}
字符流
说明: 除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader和Writer。
字符流 操作文件
FileReader fileReader = new FileReader("reader.txt");
int len = 0;
while ((len = fileReader.read()) != -1) {
System.out.print((char)len);
}
fileReader.close();
字符缓冲区
public static void main(String [] args) throws IOException
{
FileReader reader=new FileReader("E:\\纸牌.txt");
FileWriter writer=new FileWriter("D:\\java.txt");
int len = 0;
char[] b = new char[1024];
while ((len = reader.read(b)) != -1) {
writer.write(b, 0, len);
}
reader.close();
writer.close();
}
字符缓冲流
字符缓冲流需要使用 BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行操作,BufferedWriter用于对字符输出流进行操作。在BufferedReader中有一个 readLine() 方法,用于一次读取一行文本。
BufferedReader br = new BufferedReader(new FileReader("reader.txt "));
BufferedWriter bw = new BufferedWriter(new FileWriter("writer.txt"));
String str = null;
while ((str = br.readLine()) != null) {
bw.write(str);
bw.newLine();
}
br.close();
bw.close();
转换流
说明: 在JDK中,提供了两个类用于实现将字节流转换为字符流,它们分别是 InputStreamReader和OutputStreamWriter。
InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,方便直接读取字符。
OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。
FileInputStream in = new FileInputStream("reader.txt");
InputStreamReader isr = new InputStreamReader(in);//将字节流转换为字符流
BufferedReader br = new BufferedReader(isr); //再将字符流加到缓冲区
FileOutputStream out = new FileOutputStream("writer.txt");//输出流同理
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(osw);
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
br.close();
bw.close();