`
walsh
  • 浏览: 429339 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

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资源下载资源下载

    Java.NIO资源下载资源下载

    java org.apache.http.nio jar包

    找了好久,终于找到了,java刷新同步获取网络资源

    Java.nio 与Java.io比较

    Java.nio 与Java.io比较

    java.io:clojure.java.io 的 JK7 java.nio.file.Path 兼容性

    java.io clojure.java.io 的 JK7 java.nio.file.Path 兼容性依赖信息该库托管在 Releases 上。 依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 ...

    JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现

    下面小编就为大家分享一篇JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现,具有很好的参考价值,希望对大家有所帮助

    优雅的操作文件:java.nio.file 库介绍.pdf

    但 Java 在后期版本中引入了 java.nio.file 库来提高 Java 对文件操作的能力。还增加的流的功能,似乎使得文件变成更好用了。所以本章,我们就来主要介绍 java.nio.file 中常用的类和模块,大致如下: Path 路径:...

    The_Study_about_Java.nio.rar_java nio

    java.nio包的学习总结,看看确实有收获

    java.nio demo

    Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样...从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供异步(non-blocking)IO操作的API被引入。本文对其进行深入的介绍。

    nio:Clojure对java.nio的支持

    此外,还有三个函数buffer-seq,buffer-nth和buffer-to-array,旨在使将java.nio类集成到Clojure中更加容易。 希望通过将它们的功能滚动到clojure.core中,它们将变得过时。 要使其他功能与ByteBuffers一起使用,还...

    Java.NIO_网络编程_入门讲解

    Java.NIO_网络编程_入门讲解,初学者适合的资料

    java.nio新功能的优点

    java 1.4中推出的java.nio(新输入/输出)软件包允许像在其他低级语言——如C语言——中一样进行输入/输出。许多开发者认为这些新功能只能进行非阻塞操作;但是,这些新功能提供许多其他新鲜有趣的特性,它们包括:...

    java NIO详细教程

    java NIO详细教程,包括使用背景,实现原理,代码实现

    Apress.Pro.Java.7.NIO.2.2011

    Apress.Pro.Java.7.NIO.2.2011

    java.nio(socket异步通讯完整版)

    重新写的Java.nio的socket异步通讯,包含客户端及服务端完整版, 注:解析信息CLASS及进制转换CLASS需要自己去写,项目直接导入,需要自己写一些解析及转换类,这样你才能读懂SOCKET的异步,否则光拿代码没用 ...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    java nio 编程一个实例子.服务端程序

    java.nio API详解

    在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来...

    Java.nio

    NULL 博文链接:https://shihuan830619.iteye.com/blog/1159544

    java NIO.zip

    java NIO.zip

Global site tag (gtag.js) - Google Analytics