缓沖(Buffer)()
其中第个构造函数允许在应用层指定缓沖区的大小第个构造函数将构造大小为K的缓沖区一般来说缓沖区不宜过小过小的缓沖区无法起到真正的缓沖作用缓沖区也不宜过大过大的缓存区会浪费系统内存增加GC负担在本例中设置循环次数CIRCLE为万若不使用缓沖区操作则相对耗时ms;而使用缓沖区的FileWriter仅相对耗时ms性能提升一倍
另一个有用的缓沖组件是BufferedOutputStream在前文装饰者模式一节中已经提到使用BufferedOutputStream可以包装所有的OutputStream为其提供缓沖功能提高输出流的效率和BufferedWriter类似它也提供了两个构造函数
public BufferedOutputStream(OutputStream out)
public BufferedOutputStream(OutputStream out int size)
第个构造函数可以指定缓沖区大小默认情况下和BufferedWriter一样缓沖区大小为K
此外在本书第章中还将详细介绍JDK的NIO缓存NIO的Buffer类族提供了更为强大和专业的缓沖区控制功能有兴趣的读者可以仔细阅读第章中的相关内容
除了能够改善I/O性能缓沖区对任何一种上下层组件存在性能差异的场合都可以起到很好的效果另一个典型的例子是使用缓沖区提升动画显示效果下例实现了一个左右平移的圆球
public class NoBufferMovingCircle extends JApplet implements Runnable {
Image screenImage = null;
Thread thread;
int x = ;
int move = ;
public void init() {
screenImage = createImage( )
}
public void start() {
if (thread == null) {
thread = new Thread(this)
threadstart()
}
}
public void run() {
try {
while (true)
{
x += move;
if ((x > ) || (x < ))
move *= ;
repaint()
Threadsleep()
}
} catch (Exception e) {
}
}
public void drawCircle(Graphics gc) {
GraphicsD g = (GraphicsD) gc;
gsetColor(ColorGREEN)
gfillRect( )
gsetColor(Colorred)
gfillOval(x )
}
public void paint(Graphics g) { //画一个圆
gsetColor(Colorwhite) //这里没有缓沖
gfillRect( )
drawCircle(g)
}
}
以上代码没有main()函数但在Eclipse中可以通过右键菜单中Run As下的Java Applet运行结果显示虽然程序可以完成红球的左右平移但是效果较差因为每次的界面刷新都涉及图片的重新绘制而这是较为费时的操作因此画面的抖动和白光效果明显为了能得到更优质的显示效果可以为它加上缓沖区
[] []