`

java编程思想笔记(十三)I/O(三)

 
阅读更多

1.转换数据编码

直接获取asCharBuffer() 会乱码,因为拿到的都是没经过编码的字节,解决方法是装入字节前就编码好,或者使用Charset编码,再或者用视图缓冲器放入,再输出

import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.io.*;

public class BufferToText {
	private static final int BSIZE = 1024;

	public static void main(String[] args) throws Exception {
		FileChannel fc = new FileOutputStream("data2.txt").getChannel();
		fc.write(ByteBuffer.wrap("Some text".getBytes()));
		fc.close();
		fc = new FileInputStream("data2.txt").getChannel();
		ByteBuffer buff = ByteBuffer.allocate(BSIZE);
		fc.read(buff);
		buff.flip();

		// 没编码过会输出乱码
		System.out.println(buff.asCharBuffer());

		// Charset使用系统默认编码
		buff.rewind();
		String encoding = System.getProperty("file.encoding");
		System.out.println("Decoded using " + encoding + ": "
				+ Charset.forName(encoding).decode(buff));

		// 或者在wrap前就编码
		fc = new FileOutputStream("data2.txt").getChannel();
		fc.write(ByteBuffer.wrap("Some text".getBytes("UTF-16BE")));
		fc.close();
		// Now try reading again:
		fc = new FileInputStream("data2.txt").getChannel();
		buff.clear();
		fc.read(buff);
		buff.flip();
		System.out.println(buff.asCharBuffer());

		// 用视图缓冲器 asCharBuffer()的put方法放入内容
		fc = new FileOutputStream("data2.txt").getChannel();
		buff = ByteBuffer.allocate(24); // More than needed
		buff.asCharBuffer().put("Some text");
		fc.write(buff);
		fc.close();
		// Read and display:
		fc = new FileInputStream("data2.txt").getChannel();
		buff.clear();
		fc.read(buff);
		buff.flip();
		System.out.println(buff.asCharBuffer());

	}
}

 

 输出结果:

????

Decoded using UTF-8: Some text

Some text

Some text

 

2.视图缓冲器

视图缓冲器可以让我们通过某个特定的基本数据类型的视窗去查看它的ByteBuffer,ByteBuffer依然是它最底层储存数据的地方,下面是java的7种基本数据类型视图(没boolean)

import java.nio.*;  
  
public class ViewBuffer{  
    private static final int BSIZE = 1024;  
    public static void main(String[] args){  
        ByteBuffer bb = ByteBuffer.allocate(BSIZE);  
        int i = 0;  
        //检查字节缓冲器的内容是否为0  
        while(i++ < bb.limit()){  
            if(bb.get() != 0){  
                System.out.println(“nonzero”);  
}  
System.out.println(“i = ” + i);  
//回到字节缓冲器开始处  
bb.rewind();  
}  
       //创建字节缓冲区视图,作为char缓冲  
      bb.asCharBuffer().put(“Hello!”);  
      char c;  
      while((c = bb.getChar)) != 0){  
          System.out.println(c + “ ”);  
  }  
bb.rewind();  
//创建字节缓冲区视图,作为short缓冲  
bb.asShortBuffer().put((Short)12390);  
System.out.println(bb.getShort());  
bb.rewind();  
//创建字节缓冲区视图,作为int缓冲  
bb.asIntBuffer().put(99471142);  
System.out.println(bb.getInt());  
bb.rewind();  
//创建字节缓冲区视图,作为long缓冲  
bb.asLongBuffer().put(99471142);  
System.out.println(bb.getLong());  
bb.rewind();  
//创建字节缓冲区视图,作为float缓冲  
bb.asFloatBuffer().put(99471142);  
System.out.println(bb.getFloat());  
bb.rewind();  
//创建字节缓冲区视图,作为double缓冲  
bb.asDoubleBuffer().put(99471142);  
System.out.println(bb.getDouble());  
   }  
}  

 

输出结果:
i = 1025
H e l l o !
12390
99471142
99471142
9.9471142E7
9.9471142E7

 

3.缓冲器的细节

通道和缓冲器的细节

 

由内容和4个索引组合而成

mark(标记):使缓冲区能够记住一个位置并在之后将其返回。并非总需要定义标记,但在定义标记时,不能将其定义为负数,且不能大于其位置。

position(当前位置):是缓冲区下一个要读取或写入元素的索引,位置不能为负,且不能大于其限制。
limit(限制 指向最后一个位置):是第一个不应该读取或写入的元素的索引,限制不能为负,且不能大于其容量。
capacity(容量):是缓冲区所包含的元素数量,不能为负,且不能更改。
缓冲区索引遵循以下不变公式:
0 <= 标记 <= 位置 <= 限制 <= 容量

通过这些索引,缓冲区可以高效的访问和操作缓冲区中的内容数据,新创建的缓冲区总有一个0位置和一个未定义的标记,初始限制可以为0,也可以为其他值,取决于缓冲区类型和构建方式。
缓冲区的以下方法可以查询,设置和充值缓冲区的索引:
(1).capacity()方法:
返回此缓冲区的容量。
(2).clear()方法:
清除此缓冲区,将缓冲区位置设置为0,将缓冲区限制设置为容量,并丢弃标记。
(3).flip()方法:
反转此缓冲区,首先将限制设置为当前位置,然后将位置设置为0,如果已定义了标记,则丢弃该标记。
(4).limit()方法:
返回此缓冲区的限制。
(5).limit(int lim)方法:
设置此缓冲区的限制,如果位置大于新的限制,则将位置设置为新的限制,如果标记已定义且大于新限制,则丢弃该标记。
(6).mark()方法:
在此缓冲区的位置设置标记。
(7).position()方法:
返回此缓冲区的位置。
(8).position(int pos)方法:
设置此缓冲区的位置,如果标记已定义且大于新的位置,则丢弃该标记。
(9).remaining()方法:
返回当前位置与限制之间的元素个数,即limit-position。
(10).hasRemaining()方法:
判断在当前位置和限制之间是否有元素。

(11)rewind()方法:

当前位置position调到到起始位置.

(12)reset()方法:

当前位置position调到mark标记的位置.

  • 大小: 71.4 KB
0
1
分享到:
评论

相关推荐

    java编程思想读书笔记

    ### Java编程思想读书笔记 #### 一、Java与C++的区别及内存管理 在学习Java的过程中,我们常常会拿它与C++进行比较。这两门语言虽然有着相似之处,但也有许多不同点。 1. **内存管理:** - C++提供了更为底层的...

    java编程思想笔记

    《Java编程思想笔记》是基于 Bruce Eckel 的经典著作 "Thinking in Java" 所做的学习总结,这本书深入浅出地介绍了Java语言的核心概念和技术。在本文中,我们将围绕Java编程的一些关键知识点进行深入探讨,包括但不...

    Java编程思想学习笔记

    在讨论Java编程思想学习笔记时,首先需要了解的是Java语言的平台无关性,而这一特性正是通过Java虚拟机(JVM)得以实现的。JVM作为Java程序设计的关键组成部分,对于Java开发人员来说是必须掌握的基础知识。在该学习...

    Java编程思想笔记(全)

    ### Java编程思想笔记知识点概述 #### 第 1 章 对象导论 在这一章节中,主要介绍了Java中的基本概念——对象。对象是面向对象编程的核心,它封装了数据和行为。本章首先解释了对象的概念,接着讨论了如何创建对象...

    java编程思想读书笔记.rar

    《Java编程思想》是 Bruce Eckel 的经典之作,这本书深入浅出地介绍了Java语言的核心概念和技术,对于初学者和有经验的程序员来说都是极好的学习资源。以下是对书中的主要知识点进行的详细解读: 1. **Java语言基础...

    java学习资料/笔记整理(一)

    本文将深入探讨“java学习资料/笔记整理(一)”中涉及的重要知识点,包括Java编程思想、类型协变、查询手册以及数据结构与算法。 首先,Java编程思想是理解Java核心概念的关键。这通常涉及到面向对象编程(OOP)...

    达内Java_笔记整理.rar_Java 达内笔记_Java笔记_java 笔记_笔记_达内

    面向对象编程思想是Java的灵魂,它使得代码更易于理解和维护。 接着,文件I/O、异常处理和集合框架也是Java的重要部分。这部分笔记可能涉及File类、IOException、try-catch-finally语句以及ArrayList、LinkedList、...

    非常好的java笔记适合初学者

    此外,文件输入/输出(I/O)操作也是Java编程中不可或缺的一部分。笔记会教授如何使用InputStream和OutputStream类进行基本的文件读写,以及高级的FileReader/Writer、BufferedReader/Writer等类,以提高效率和灵活性...

    JAVA学习笔记

    总的来说,这个JAVA学习笔记集是一个全面的学习资源,可以帮助初学者逐步建立起扎实的JAVA基础,理解并掌握编程思想、多线程、网络编程以及高效I/O操作等核心技能。通过深入学习和实践这些内容,读者将能够更好地...

    王者归来之Thinking in java读书笔记

    《王者归来之经典-Java编程思想读书笔记》会介绍如何有效地使用异常处理机制,防止程序因未预期的错误而崩溃。 函数和方法是代码复用的关键。Java支持方法重载和重写,这使得代码更加灵活且易于维护。书中会详细...

    java学习笔记(全)

    Java学习笔记全集是针对Java编程语言的一份详尽的学习资料,它涵盖了从基础到进阶的各个层面,旨在帮助初学者系统地学习Java,并为有一定经验的开发者提供复习和巩固知识的平台。这份笔记主要关注Java语言的核心概念...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...

    java学习笔记JDK6.0课件和代码

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。JDK(Java Development Kit)是Java...随着Java技术的不断发展,虽然JDK 6.0已经过时,但它仍然是初学者理解和掌握Java编程思想的宝贵资源。

    JAVA笔记(根据马士兵的java视频整理).pdf

    这些知识点构成了JAVA编程的基石,也是学习者必须首先攻克的难关。 在马士兵的JAVA视频教程中,他不仅详细讲解了JAVA的基础知识,比如变量、循环、分支结构、数组、常用类等,还对I/O Stream、Collection/Generic、...

    B站java狂神说笔记

    这份笔记的PDF版本详细讲解了Java的基础概念、进阶特性和实战应用,旨在帮助读者全面理解和掌握Java编程。 一、Java基础 Java基础部分包括了Java环境的搭建、基本语法、数据类型、控制结构(如if语句、switch语句、...

    全套达内学习笔记(java)

    【CoreJava.zip】:核心Java是Java编程的基础,可能包括了Java SE(标准版)中的核心概念和技术,如IO流、NIO(非阻塞I/O)、多线程、并发编程、集合框架的深入探讨、泛型、枚举、Lambda表达式、Stream API等。...

    java黑马笔记.rar

    Java编程语言是当今软件开发领域中的重要工具,尤其在...这些知识点构成了Java编程的基础,也是"java黑马笔记"可能涵盖的内容。学习Java,不仅要理解语法,更要掌握其核心思想和最佳实践,以便在实际项目中灵活运用。

    java私塾学习笔记整理

    ### Java私塾学习笔记整理 #### 第一章:Java入门 ...以上内容涵盖了Java基础知识的重要方面,从语言基础到高级特性,以及常见的开发技术和工具,帮助读者全面了解Java编程的基础知识和技术要点。

    良葛格java学习笔记

    【良葛格java学习笔记】是一份专为新手设计的Java编程学习资料,旨在帮助初学者从零开始了解和掌握Java这门...通过系统学习这份笔记,新手可以逐步熟悉Java编程环境,理解面向对象编程思想,并具备解决实际问题的能力。

Global site tag (gtag.js) - Google Analytics