Location:
Search - doublebuffer
Search list
Description: 用两个缓冲区实现鼠标事件的跟踪-buffer with two mouse-tracking events
Platform: |
Size: 3237 |
Author: 吴丽军 |
Hits:
Description: 一系列缓冲区类支撑起了 Java 2 平台标准版的新 I/O(NIO)包。这些类的数据容器形成了其它 NIO 操作(如套接字通道上的非阻塞读取)的基础。在本月的 Merlin 的魔力中,常驻 Java 编程专家 John Zukowski 展示了如何操作那些数据缓冲区来执行如读/写原语这样的任务以及如何使用内存映射文件。在以后的文章里,他将把这里所提到的概念扩展到套接字通道的使用。 Java 2 平台标准版(Java 2 Platform Standard Edition,J2SE)1.4 对 Java 平台的 I/O 处理能力做了大量更改。它不仅用流到流的链接方式继续支持以前 J2SE 发行版的基于流的 I/O 操作,而且 Merlin 还添加了新的功能 — 称之为新 I/O 类(NIO),现在这些类位于 java.nio 包中。
I/O 执行输入和输出操作,将数据从文件或系统控制台等传送至或传送出应用程序。(有关 Java I/O 的其它信息,请参阅 参考资料)。
缓冲区基础
抽象的 Buffer 类是 java.nio 包支持缓冲区的基础。 Buffer的工作方式就象内存中用于读写基本数据类型的 RandomAccessFile 。象 RandomAccessFile一样,使用 Buffer ,所执行的下一个操作(读/写)在当前某个位置发生。执行这两个操作中的任一个都会改变那个位置,所以在写操作之后进行读操作不会读到刚才所写的内容,而会读到刚才所写内容之后的数据。 Buffer 提供了四个指示方法,用于访问线性结构(从最高值到最低值):
"capacity() :表明缓冲区的大小
"limit() :告诉您到目前为止已经往缓冲区填了多少字节,或者让您用 :limit(int newLimit) 来改变这个限制
"position() :告诉您当前的位置,以执行下一个读/写操作
"mark() :为了稍后用 reset() 进行重新设置而记住某个位置
缓冲区的基本操作是 get() 和 put() ;然而,这些方法在子类中都是针对每种数据类型的特定方法。为了说明这一情况,让我们研究一个简单示例,该示例演示了从同一个缓冲区读和写一个字符。在清单 1 中, flip() 方法交换限制和位置,然后将位置置为 0,并废弃标记,让您读刚才所写的数据:
清单 1. 读/写示例
import java.nio.*;
...
CharBuffer buff = ...;
buff.put('A');
buff.flip();
char c = buff.get();
System.out.println("An A: " + c);
现在让我们研究一些具体的 Buffer 子类。
回页首
缓冲区类型
Merlin 具有 7 种特定的 Buffer 类型,每种类型对应着一个基本数据类型(不包括 boolean):
"ByteBuffer
"CharBuffer
"DoubleBuffer
"FloatBuffer
"IntBuffer
"LongBuffer
"ShortBuffer
在本文后面,我将讨论第 8 种类型 MappedByteBuffer ,它用于内存映射文件。如果您必须使用的类型不是这些基本类型,则可以先从 ByteBuffer 获得字节类型,然后将其转换成 Object 或其它任何类型。
正如前面所提到的,每个缓冲区包含 get() 和 put() 方法,它们可以提供类型安全的版本。通常,需要重载这些 get() 和 put() 方法。例如,有了 CharBuffer ,可以用 get() 获得下一个字符,用 get(int index) 获得某个特定位置的字符,或者用 get(char[] destination) 获得一串字符。静态方法也可以创建缓冲区,因为不存在构造函数。那么,仍以 CharBuffer为例,用 CharBuffer.wrap(aString) 可以将 String对象转换成 CharBuffer 。为了演示,清单 2 接受第一个命令行参数,将它转换成 CharBuffer ,并显示参数中的每个字符:
清单 2. CharBuffer 演示
import java.nio.*;
public class ReadBuff {
public static void main(String args[]) {
if (args.length != 0) {
CharBuffer buff = CharBuffer.wrap(args[0]);
for (int i=0, n=buff.length(); i<n; i++) {
System.out.println(i + " : " + buff.get());
}
}
}
}
请注意,这里我使用了 get() ,而没有使用 get(index) 。我这样做的原因是,在每次执行 get() 操作之后,位置都会移动,所以不需要手工来声明要检索的位置。
回页首
直接 vs. 间接
既然已经了解了典型的缓冲区,那么让我们研究直接缓冲区与间接缓冲区之间的差别。在创建缓冲区时,可以要求创建直接缓冲区,创建直接缓冲区的成本要比创建间接缓冲区高,但这可以使运行时环境直接在该缓冲区上进行较快的本机 I/O 操作。因为创建直接缓冲区所增加的成本,所以直接缓冲区只用于长生存期的缓冲区,而不用于短生存期、一次性且用完就丢弃的缓冲区。而且,只能在 ByteBuffer 这个级别上创建直接缓冲区,如果希望使用其它类型,则必须将 Buffer 转换成更具体的类型。为了演示,清单 3 中代码的行为与清单 2 的行为一样,但清单 3 使用直接缓冲区:
清单 3. 列出网络接口
import java.nio.*;
public class ReadDirectBuff {
public static void main(String args[]) {
if (args.length != 0) {
String arg = args[0];
int size = arg.length();
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(size*2);
CharBuffer buff = byteBuffer.asCharBuffer();
buff.put(arg);
buff.rewind();
for (int i=0, n=buff.length(); i<n; i++) {
System.out.println(i + " : " + buff.get());
}
}
}
}
在上面的代码中,请注意,不能只是将 String 包装在直接 ByteBuffer中。必须首先创建一个缓冲区,先填充它,然后将位置倒回起始点,这样才能从头读。还要记住,字符长度是字节长度的两倍,因此示例中会有 size*2 。
回页首
内存映射文件
第 8 种 Buffer 类型 MappedByteBuffer 只是一种特殊的 ByteBuffer 。 MappedByteBuffer 将文件所在区域直接映射到内存。通常,该区域包含整个文件,但也可以只映射部分文件。所以,必须指定要映射文件的哪部分。而且,与其它 Buffer 对象一样,这里没有构造函数;必须让 java.nio.channels.FileChannel的 map() 方法来获取 MappedByteBuffer 。此外,无需过多涉及通道就可以用 getChannel() 方法从 FileInputStream 或 FileOutputStream获取 FileChannel 。通过从命令行传入文件名来读取文本文件的内容,清单 4 显示了 MappedByteBuffer :
清单 4. 读取内存映射文本文件
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class ReadFileBuff {
public static void main(String args[]) throws IOException {
if (args.length != 0) {
String filename = args[0];
FileInputStream fis = new FileInputStream(filename);
FileChannel channel = fis.getChannel();
int length = (int)channel.size();
MappedByteBuffer byteBuffer =
channel.map(FileChannel.MapMode.READ_ONLY, 0, length);
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(byteBuffer);
for (int i=0, n=charBuffer.length(); i<n; i++) {
System.out.print(charBuffer.get());
}
}
}
}
Platform: |
Size: 5876 |
Author: 635868631@qq.com |
Hits:
Description: 用两个缓冲区实现鼠标事件的跟踪-buffer with two mouse-tracking events
Platform: |
Size: 3072 |
Author: 吴丽军 |
Hits:
Description: 用双缓存绘图的VC代码,希望能给大家仅供参考,绘制出“不卡的界面”。-Using double-buffering the drawing of the VC code, we hope that they will be for reference only, to map out
Platform: |
Size: 1923072 |
Author: 侯颖超 |
Hits:
Description: 动态时钟,双缓冲解决屏闪~~~~~~窗体为圆形区域。-Dynamic clock, dual-screen flash buffer solution for a circular area ~~~~~~ form.
Platform: |
Size: 43008 |
Author: 蓝鸟 |
Hits:
Description: 本论文主要研究利用MFC实现双缓存机制改善图形的显示效果,具有很强的应用价值-This paper studied the feasibility of using MFC to achieve double-buffering mechanisms to improve the graphical display of results, has a strong value
Platform: |
Size: 15360 |
Author: Bob Green |
Hits:
Description: 实例解说双缓冲,利用内存,实现刷新屏幕不闪烁.-Double buffer example to explain the use of memory, the realization does not refresh the screen flicker.
Platform: |
Size: 57344 |
Author: 林周 |
Hits:
Description: applet小应用程序,特别适用于初学者,一个不错的例子.-small applet applications, especially for beginners, a good example.
Platform: |
Size: 1024 |
Author: 林远贵 |
Hits:
Description: 数字图像处理中的双缓冲区技术研究,程序给给出详细的注释.-doublebuffer in digtal image processing
Platform: |
Size: 38912 |
Author: hua |
Hits:
Description: 基础C# GDI图形绘制的双缓冲实现,可以用此代码实现橡皮筋画线功能-C# GDI-based graphics rendering to achieve double buffering, you can use this code to achieve the rubber band drawing a line function
Platform: |
Size: 22528 |
Author: 姜星 |
Hits:
Description: c#的画图实例,主要是对比突出托管代码下的双缓存,提供了三种实例,一是非正常情况,一是自动双缓存,一是手动双缓存-c# example of the drawing, the main comparison between the managed code under the prominent double-buffering, providing three examples of a non-normal conditions, one automatic double-buffering, one manual double-buffering
Platform: |
Size: 37888 |
Author: 秦慷 |
Hits:
Description: 双缓冲技术解决图像闪动问题,有代码,对初学者是一个很好的例子-Double-buffering technology to solve image flickering problem with the code, for beginners is a good example of
Platform: |
Size: 36864 |
Author: 马志 |
Hits:
Description: 用csharp及gdi+实现双缓存画图,解决画图时闪屏,刷新慢的问题,是了解双缓存画图的好东西-Gdi+ with csharp and achieve double-buffer drawing, solving the splash screen when drawing, slow refresh problem is to understand the double buffer drawing a good thing
Platform: |
Size: 36864 |
Author: cm |
Hits:
Description: 利用双缓冲技术实现图像的显示,大家一起分享,有源代码-Double-buffering technology using image display, share, source code
Platform: |
Size: 49152 |
Author: 张政 |
Hits:
Description: vc doublebuffer gdi+
Platform: |
Size: 3775488 |
Author: 纪顺玉 |
Hits:
Description: 高效率的双缓存的实现,通过内存DC和裁剪区域来提升界面绘制效率,可解决闪屏的问题。-Efficient dual caching to achieve, through the memory DC and draw the crop area to improve the efficiency of the interface, splash screen to resolve the issue.
Platform: |
Size: 525312 |
Author: 李明 |
Hits:
Description: 本工程在DM642平台上利用ping-pong缓存技术实现了图像的二值化处理。
-This ping-pong caching technology works on the DM642 platform, binary image processing.
Platform: |
Size: 1439744 |
Author: 周一君 |
Hits:
Description: 多线程java小游戏,利于 编程初期的学习-Multi-threaded Java games, conducive to the learning of programming early
Platform: |
Size: 9216 |
Author: 王茜 |
Hits:
Description: 在实现画图的过程中,出现闪屏的问题。这里提供双缓存来解决-In the realization of the process of drawing, the splash screen appears. Here the double buffer
Platform: |
Size: 528384 |
Author: 冯泽宇 |
Hits:
Description: 双缓冲打印以及可以复用的模板。一对比你就知道如何写了-Double buffering print and can reuse templates. A comparison of you know how to write a
Platform: |
Size: 529408 |
Author: wangjieest |
Hits: