BufferedOutputStream:缓冲字节输出流是一个高级流(处理流),与其他低级流配合使用。
BufferedOutputStream的API:
1.字段:
protected byte[] buf; //存储数据的内部缓冲区。
protected int count; //缓冲区中的有效字节数。此值始终处于 0 到 buf.length 范围内;元素 buf[0] 到 buf[count-1] 包含有效的字节数据。
2.构造函数:
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
3.写方法,刷新方法
void flush()
刷新此缓冲的输出流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
void write(int b)
将指定的字节写入此缓冲的输出流。
4.写一个文件:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lan.filepath.FilePath;
public class TestBufferedOutputStream
{
public static void main(String[] args) throws IOException
{
String packagePath=FilePath.getSrcPackagePath(TestBufferedOutputStream.class);
FileOutputStream out=new FileOutputStream(packagePath+"testBufferOutputStream.txt");
BufferedOutputStream buffer=new BufferedOutputStream(out);
byte b=20;
String string="字符串";
buffer.write(b);
buffer.write(string.getBytes(), 0, string.getBytes().length);
buffer.flush();//刷新缓冲流
buffer.close();
out.close();
}
}
运行结果:
BufferedInputStream:缓冲字节输入流,是一个高级流(处理流),与其他低级流配合使用。
BufferedInputStream的API:
1.字段
protected byte[] buf
存储数据的内部缓冲区数组。
protected int count
比缓冲区中最后一个有效字节的索引大 1 的索引。
protected int marklimit
调用 mark 方法后,在后续调用 reset 方法失败之前所允许的最大提前读取量。
protected int markpos
最后一次调用 mark 方法时 pos 字段的值。
protected int pos
缓冲区中的当前位置。
2.构造方法:
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size)
创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
其他方法:
明天补上
代码:读写例子
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lan.filepath.FilePath;
public class TestBufferedOutputStream
{
public static void main(String[] args) throws IOException
{
String packagePath=FilePath.getSrcPackagePath(TestBufferedOutputStream.class);
FileOutputStream out=new FileOutputStream(packagePath+"testBufferOutputStream.txt");
BufferedOutputStream buffer=new BufferedOutputStream(out);
byte b=20;
String string="字符串";
System.out.println("--------------写入:--------------");
System.out.println(b);
System.out.println(string);
buffer.write(b);
buffer.write(string.getBytes(), 0, string.getBytes().length);
buffer.flush();//刷新缓冲流
buffer.close();
out.close();
System.out.println("-------------------读出:-------------------");
FileInputStream in=new FileInputStream(packagePath+"testBufferOutputStream.txt");
BufferedInputStream bufferedIn=new BufferedInputStream(in);
byte btemp=(byte)bufferedIn.read();
byte[] buf=new byte[80];//自定义一个缓冲区
int size=0;
String stringTemp="";
//这里实际上调用的是父类的方法
while((size=bufferedIn.read(buf))!=-1)
{
stringTemp+=new String(buf,0,size);
}
System.out.println(btemp);
System.out.println(stringTemp);
bufferedIn.close();
}
}
使用BufferedInputStream和BufferOutputStream拷贝文件:
代码:
package com.lan.bufferOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.lan.filepath.FilePath;
public class TestBufferedCopy
{
/**
* 使用BufferedOutputStream和BufferedInputStream拷贝文件.
* 使用默认的缓冲区大小
* @param srcFile 源文件的File对象
* @param destFile 目标文件的File对象
* @throws IOException
*/
public static void copyFile(File srcFile,File destFile) throws IOException
{
if(!srcFile.exists())
{
throw new FileNotFoundException("文件"+srcFile+"不存在");
}
if(!srcFile.isFile())
{
throw new IllegalArgumentException(srcFile+"不是文件");
}
BufferedInputStream in=new BufferedInputStream(
new FileInputStream(srcFile));
BufferedOutputStream out=new BufferedOutputStream(
new FileOutputStream(destFile));
int size=0;
//读到字节串到内部缓存,默认缓冲区的大小是8192字节
while((size=in.read())!=-1)
{
out.write(size);//把读取到的字节串写入到缓冲区
out.flush();//刷新缓冲区写入文件
}
in.close();
out.close();
}
/**
* 把时间戳(long 毫秒数)转换为格式化时间字符串
* @param timeStamp long毫秒数
* @return 格式化时间字符串
*/
public static String timeStampToDateString(long timeStamp)
{
Date date = new Date(timeStamp);
/*
m 小时中的分钟数
s 分钟中的秒数
S 毫秒数
*/
DateFormat format = new SimpleDateFormat("mm:ss:SS");
String dateString=format.format(date);
return dateString;
}
public static void main(String[] args)
{
String packagePath;
try
{
long start=System.currentTimeMillis();//获取当前的时间戳
packagePath = FilePath.getSrcPackagePath(TestBufferedCopy.class);
copyFile(new File(packagePath+"李玉刚_刚好遇见你.mp3"),
new File(packagePath+"李玉刚_刚好遇见你副本.mp3"));
long end=System.currentTimeMillis();//获取复制后的时间戳
System.out.println("默认的缓冲字节流(8192字节)拷贝文件用时(分钟:秒:毫秒):"
+timeStampToDateString(end-start));
} catch (UnsupportedEncodingException e1)
{
e1.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
运行结果:
(1)控制台:
默认的缓冲字节流(8192字节)拷贝文件用时(分钟:秒:毫秒):00:21:982
(2)拷贝文件目录:
刷新一下eclipse的包:
刷新后:
可见文件拷贝成功!使用播放器播放一下试试。嗯,拷贝的没有问题。