`

java.nio.Buffer flip()方法jdk中文翻译错误

    博客分类:
  • java
阅读更多
今天在看《Java编程思想》的时候,碰到java.nio.Buffer flip()方法,不明白是干什么用的,于是就赶快查看中文API,API上面翻译的是:"反转此缓冲区。首先对当前位置设置限制,然后将该位置设置为零。如果已定义了标记,则丢弃该标记。";
    说实话,看了几遍,真还不明白说的是什么意思,于是就查看英文API,是这样说的:Flips this buffer. The limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded.,意思大概是这样的:调换这个buffer的当前位置,并且设置当前位置是0。说的意思就是:将缓存字节数组的指针设置为数组的开始序列即数组下标0。这样就可以从buffer开头,对该buffer进行遍历(读取)了。
 
    实例代码(借用Java编程思想P552的代码):
   
package cn.com.newcom.ch18;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 获取通道
 * 
 * @author zhq
 * 
 */
public class GetChannel {
	private static final int SIZE = 1024;

	public static void main(String[] args) throws Exception {
		// 获取通道,该通道允许写操作
		FileChannel fc = new FileOutputStream("data.txt").getChannel();
		// 将字节数组包装到缓冲区中
		fc.write(ByteBuffer.wrap("Some text".getBytes()));
		// 关闭通道
		fc.close();

		// 随机读写文件流创建的管道
		fc = new RandomAccessFile("data.txt", "rw").getChannel();
		// fc.position()计算从文件的开始到当前位置之间的字节数
		System.out.println("此通道的文件位置:" + fc.position());
		// 设置此通道的文件位置,fc.size()此通道的文件的当前大小,该条语句执行后,通道位置处于文件的末尾
		fc.position(fc.size());
		// 在文件末尾写入字节
		fc.write(ByteBuffer.wrap("Some more".getBytes()));
		fc.close();

		// 用通道读取文件
		fc = new FileInputStream("data.txt").getChannel();
		ByteBuffer buffer = ByteBuffer.allocate(SIZE);
		// 将文件内容读到指定的缓冲区中
		fc.read(buffer);
		buffer.flip();//此行语句一定要有
		while (buffer.hasRemaining()) {
			System.out.print((char)buffer.get());
		}
                  fc.close();
	}
}


注意:buffer.flip();一定得有,如果没有,就是从文件最后开始读取的,当然读出来的都是byte=0时候的字符。通过buffer.flip();这个语句,就能把buffer的当前位置更改为buffer缓冲区的第一个位置。
分享到:
评论
9 楼 shenselongge 2016-05-25  
    /**
     * Flips this buffer.  The limit is set to the current position and then
     * the position is set to zero.  If the mark is defined then it is
     * discarded.
     *
     * <p> After a sequence of channel-read or <i>put</i> operations, invoke
     * this method to prepare for a sequence of channel-write or relative
     * <i>get</i> operations.  For example:
     *
     * <blockquote><pre>
     * buf.put(magic);    // Prepend header
     * in.read(buf);      // Read data into rest of buffer
     * buf.flip();        // Flip buffer
     * out.write(buf);    // Write header + data to channel</pre></blockquote>
     *
     * <p> This method is often used in conjunction with the {@link
     * java.nio.ByteBuffer#compact compact} method when transferring data from
     * one place to another.  </p>
     *
     * @return  This buffer
     */
    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }
8 楼 tonyyan 2015-11-24  
感谢,清晰了很多。
7 楼 frangejct 2015-10-16  
 
jdluojing 写道
你的说法也不完整,buffer中的flip方法涉及到bufer中的Capacity,Position和Limit三个概念。其中Capacity在读写模式下都是固定的,就是我们分配的缓冲大小,Position类似于读写指针,表示当前读(写)到什么位置,Limit在写模式下表示最多能写入多少数据,此时和Capacity相同,在读模式下表示最多能读多少数据,此时和缓存中的实际数据大小相同。在写模式下调用flip方法,那么limit就设置为了position当前的值(即当前写了多少数据),postion会被置为0,以表示读操作从缓存的头开始读。也就是说调用flip之后,读写指针指到缓存头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)。

   
6 楼 zlc1094512300 2015-04-09  
Wuaner 写道
jdluojing 写道
你的说法也不完整,buffer中的flip方法涉及到bufer中的Capacity,Position和Limit三个概念。其中Capacity在读写模式下都是固定的,就是我们分配的缓冲大小,Position类似于读写指针,表示当前读(写)到什么位置,Limit在写模式下表示最多能写入多少数据,此时和Capacity相同,在读模式下表示最多能读多少数据,此时和缓存中的实际数据大小相同。在写模式下调用flip方法,那么limit就设置为了position当前的值(即当前写了多少数据),postion会被置为0,以表示读操作从缓存的头开始读。也就是说调用flip之后,读写指针指到缓存头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)。


说的很明白。终于懂了
5 楼 okooo00 2014-10-28  
理解了,tks
4 楼 yangjing5514 2014-10-22  
    
3 楼 Wuaner 2014-05-30  
jdluojing 写道
你的说法也不完整,buffer中的flip方法涉及到bufer中的Capacity,Position和Limit三个概念。其中Capacity在读写模式下都是固定的,就是我们分配的缓冲大小,Position类似于读写指针,表示当前读(写)到什么位置,Limit在写模式下表示最多能写入多少数据,此时和Capacity相同,在读模式下表示最多能读多少数据,此时和缓存中的实际数据大小相同。在写模式下调用flip方法,那么limit就设置为了position当前的值(即当前写了多少数据),postion会被置为0,以表示读操作从缓存的头开始读。也就是说调用flip之后,读写指针指到缓存头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)。

2 楼 ligf06 2014-05-16  
楼上说的非常好,非常清晰,学习了
1 楼 jdluojing 2013-12-12  
你的说法也不完整,buffer中的flip方法涉及到bufer中的Capacity,Position和Limit三个概念。其中Capacity在读写模式下都是固定的,就是我们分配的缓冲大小,Position类似于读写指针,表示当前读(写)到什么位置,Limit在写模式下表示最多能写入多少数据,此时和Capacity相同,在读模式下表示最多能读多少数据,此时和缓存中的实际数据大小相同。在写模式下调用flip方法,那么limit就设置为了position当前的值(即当前写了多少数据),postion会被置为0,以表示读操作从缓存的头开始读。也就是说调用flip之后,读写指针指到缓存头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)。

相关推荐

    java.nio API详解

    Java NIO(New Input/Output)API是在JDK 1.4版本中引入的一个重要的改进,它是对传统Java IO API的补充,旨在提供更高效、更灵活的数据输入和输出方式,特别是对于高并发和高性能的应用场景,如服务器端程序。NIO的...

    使用Java NIO编写高性能的服务器.doc

    Java NIO(New IO)是从JDK 1.4开始引入的一个新特性,它提供了一种不同于传统IO流的非阻塞I/O操作方式。NIO的核心在于它允许应用程序选择非阻塞的方式进行读写操作,从而提高了服务器处理大量并发连接的能力。NIO的...

    JavaNIO_API帮助文档详解

    为了解决这些问题,从JDK1.4开始,Java引入了一套新的I/O框架——NIO(Non-blocking I/O),它不仅提供基于缓冲区的操作,还支持非阻塞模式,极大地提高了I/O处理效率。 #### NIO核心组件 NIO的架构主要分布在几个...

    Java_NIO_API详解

    为了解决这一问题,从JDK 1.4开始,Java引入了一种新的I/O模型——**非阻塞I/O (NIO)**。 NIO提供了一种基于缓冲区(Buffer)的非阻塞I/O操作机制,极大地提高了I/O处理的性能和效率。本文将详细介绍NIO的主要组成...

    Java NIO原理 图文分析及代码实现

    Java NIO(New Input/Output)是在JDK 1.4中引入的一种新的I/O处理方式,它支持非阻塞模式的文件和套接字操作。NIO的关键组件包括缓冲区(Buffers)、通道(Channels)、选择器(Selectors)等。 **Java NIO的主要...

    javaNiO.doc

    为了解决这些问题,Java平台在JDK 1.4中引入了一个全新的I/O处理框架——NIO(New IO),即新I/O。本文将深入探讨传统I/O模型的问题,并详细介绍NIO的概念、优势以及其实现机制。 #### 2. 传统I/O模型及其局限性 ...

    JAVA NIO学习笔记.docx

    Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一组新的I/O API,它提供了一种不同于传统IO的高效、非阻塞的I/O操作方式。NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统...

    JAVANIO简介.pdf

    NIO是Java平台在JDK 1.4版本中引入的新API,旨在改进传统的Java IO性能,特别是在处理大量并发连接时。Sun官方强调了NIO的几个关键特性: - **Buffer缓存支持**:为所有基本数据类型提供缓存支持。 - **字符集编码...

    java 之异步套接字编程实例(AIO)

    Java中的异步套接字编程,也称为非阻塞I/O(Non-blocking I/O, NIO)或异步I/O(Asynchronous I/O, AIO),是Java在JDK 7引入的一种高级I/O模型,它极大地提高了网络编程的效率。AIO的主要目标是提供一种方法,使得...

    Java文件读写IO/NIO及性能比较详细代码及总结

    Java文件读写IO/NIO及性能比较详细代码及总结 Java文件读写是Java编程中一个非常重要的方面,在各种项目中都需要对文件进行读写操作。Java提供了多种方式来实现文件读写,包括字节读写、字符读取、行读取等。以下是...

    jdk 7 源码。含sun包下所有源码

    缓冲区可以进行读写操作,并支持flip、clear、rewind等方法,方便在缓冲区满或空时进行切换。 同时,`Selector`在多路复用I/O中扮演着关键角色。通过注册通道到选择器,开发者可以监听多个通道的事件,如连接请求、...

    JavaNIO[整理].pdf

    Java NIO,全称为New Input/Output,是Java在JDK 1.4版本中引入的一个新特性,用于替代传统的IO API。NIO的核心在于它提供了非阻塞的I/O操作,提高了I/O性能,特别是在高并发场景下,极大地提升了系统资源利用率。 ...

    java NIO 详细讲解

    Java NIO(New I/O)作为JDK 1.4引入的一项新技术,旨在解决传统IO(如基于流的IO)存在的性能瓶颈问题。NIO主要通过引入新的API和数据处理模型来提高IO操作的效率。 传统的Java IO是以流为基础的,这意味着数据是...

    Java_NIO_API详解[参照].pdf

    Java NIO(New Input/Output)API是在JDK 1.4版本中引入的一个重要的功能扩展,它提供了与传统IO(基于流的IO)不同的I/O操作方式,特别是在处理高并发、高性能的服务端应用程序中,NIO具有显著的优势。传统的IO基于...

    JDK_7_NIO2

    ### JDK 7 NIO2 新特性详解 #### 引言 随着 Java 7 的发布,NIO (New I/O) 接口迎来了重要的更新,即 NIO.2 或称为 MNI (More New I/O)。NIO.2 增强了 Java 1.4 中的 NIO API,为开发人员提供了更为强大的 I/O ...

    JAVA NIO 学习资料

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从JDK 1.4版本开始引入的一种新的IO模型,它为Java应用程序提供了更高效的数据传输方式,尤其适用于高并发、大数据量的网络服务。与传统的IO...

    Java nio详细介绍 详细介绍java nio

    - **基本方法**:`Buffer`类提供了许多方法来控制和操作`Buffer`的状态,例如`position()`、`limit()`、`clear()`、`flip()`等。 - `position(int newPosition)`:设置`Buffer`的当前位置。 - `limit(int ...

    单元学习JavaNIO.pdf

    Java NIO,全称为New Input/Output,是Java在JDK 1.4版本中引入的一个新特性,用于替代传统的IO API。NIO的核心在于它提供了非阻塞I/O操作,提高了程序处理I/O的效率,尤其适用于高并发的网络应用。 在传统的Java ...

    nio_javanio_NIO_

    Java NIO(New IO)是Java平台从JDK 1.4版本开始引入的一个新的IO API,它提供了与标准的IO API不同的IO工作方式。NIO代表非阻塞IO,其设计目标是提供一种更高效、更灵活的IO操作方式,特别是在处理大量并发连接时,...

Global site tag (gtag.js) - Google Analytics