`

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

阅读更多

1.新I/O

JDK 1.4的java.nio.*包引入了新I/O类库,目的是为了提高速度,速度的来源是使用的结构更接近与操作系统的执行I/O 的方式:通道和缓冲器,通道指FileChannel,缓冲器指ByteBuffer,旧I/O类库有三个类改变了,可以产生FileChannel,这三个类是FileInputStream,FileOutputStram和RandomAccessFile,

下面代码用以产生这三种流可写,可读写,可读的通道

 

 

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

	@SuppressWarnings("resource")
	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(fc.size()); // Move to the end
		fc.write(ByteBuffer.wrap("Some more".getBytes()));
		fc.close();
	
		fc = new FileInputStream("data.txt").getChannel();
		ByteBuffer buff = ByteBuffer.allocate(BSIZE);
		fc.read(buff);
		buff.flip();
		while (buff.hasRemaining())
			System.out.print((char) buff.get());
}
}

 

输出结果:
Some text Some more

 

通道可以用isOpen()看是否是通道打开状态,一般是线程安全的

 

字节缓冲区可以存放原始字节,也可以存放java的8中基本类型数据,但是不能存放引用类型数据,String也是不能存放的。正是由于这种底层的存放类型似的字节缓冲区可以更加高效和绝大部分操作系统的I/O进行映射。由allocate(n)获得缓冲器,其中n是你所分配的空间.

 

字节缓冲区的常用操作:


(1).读写单个字节的绝对和相对get和put方法:
a. 绝对方法:
get(int index):读取指定索引处的字节。
put(int index, byte b):将字节写入指定索引处。
b.相对方法:
get():读取此缓冲区当前位置的字节,然后该位置递增。
put(byte b):将字节写入此缓冲区的当前位置,然后该位置递增。


(2).相对批量get方法:
ByteBuffer get(byte[] dst):将此缓冲区的字节传输到给定的目标数组中。


(3).相对批量put方法:
ByteBuffer put(byte[] src):将给定的源byte数组的所有内容传输到此缓冲区中。


(4).读写其他基本类型值:
getChar(), putChar(char value), getChare(int index), putChar(int index, char value).
getInt(), putInt(int value), getInt(int index), putInt(int index, int value)等等读写基本类型值得相对和绝对方法。
注意:基本类型值得相对和绝对读写方法,根据java基本类型数据底层字节数进行缓冲区移动。

 

(5).创建视图缓冲区:
为了访问同类二进制数据,允许将字节缓冲区视为包含它们基本类型值的缓冲区,视图缓冲区只是其内容受该字节缓冲区支持的另一种缓冲区。字节缓冲区和视图缓冲区内容更改是相互可见的。这两种缓冲区的位置、限制和标记值都是独立的。创建方法如下:
asCharBuffer(), asDoubleBuffer(), asFloatBuffer(), asIntBuffer(), asLongBuffer(), asReadOnlyBuffer(), asShortBuffer()。


与具体类型的get和put方法系列相比,视图缓冲区优势如下:

a视图缓冲区不是根据字节进行索引,而是根据其特定类型的值得大小进行索引。
b.视图缓冲区提供了相对批量get和put方法,这些方法可以在缓冲区和数组或相同类型的其他缓冲区直接传输连续序列的值。
c.视图缓冲区可能更搞效,因为当且仅当其支持的字节缓冲区为直接缓冲区时它才是直接缓冲区。

 

2.文件复制:
文件通道和字节缓冲区不但可以实现数据从文件读入和读出,还可以实现文件的复制,例子如下:

 

import java.nio.*;  
import java.nio.channels/*;  
import java.io.*  
  
public class FileCopy{  
    //字节缓冲区大小  
    private static final int BSIZE = 1024;  
    public static void main(String[] args) throws Exception{  
        //获取文件输入通道  
    FileChannel in = new FileInputStream(“FileCopy.java”).getChannel();  
    //获取文件输出通道  
    FileChannel out = new FileOutputStream(“FileOut.txt”).getChannel();  
    ByteBuffer buffer = ByteBuffer.allocate(BSIZE);  
    While(in.read(buffer) != -1){  
    //重置缓冲区,准备写出  
buffer.flip();  
//将字节缓冲区内容写出到文件输出通道  
out.write(buffer);  
//清除字节缓冲区  
buffer.clear();  
}  
}  
}

  

3.文件通道传输:
文件通道的transferFrom(ReadableByteChannel src, long position, long count)方法将字节从给定的可读字节通道传输到此通道的文件中,transferTo(long position, long count, WritableByteChannel target)方法将此通道的文件传输到给定的可写字节通道。例子如下:

import java.nio.channels.*;  
import java.io.*  
  
public class ChannelTransfer{  
    public static void main(String[] args) throws Exception{  
    FileChannel in = new FileInputStream(“ChannelTransfer.java”).getChannel();  
    FileChannel out = new FileOutputStream(“out.txt”).getChannel();  
    //将输入文件通道传输到输出文件通道  
    in.transferTo(0, in.size(); out);  
    //从输入文件通道传输到输出文件通道  
    out.transferFrom(in, 0, in.size());  
}  
}  

 

 

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笔记适合初学者

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

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

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

    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编程思想的宝贵资源。

    B站java狂神说笔记

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

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

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

    java私塾学习笔记整理

    #### 第十二章:I/O流 Java I/O流用于处理输入输出操作。 **一、继承InputStream字节流** 用于读取字节数据的抽象类。 **二、继承OutputStream字节** 用于写入字节数据的抽象类。 **三、继承Reader流** 用于...

    全套达内学习笔记(java)

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

    java黑马笔记.rar

    Java编程语言是当今软件开发领域中的重要工具,尤其在企业级应用、服务器端开发以及大数据处理等方面占据着主导地位。"java黑马笔记"很可能是针对初学者或进阶者的一份详细教程,涵盖了Java的基础知识到高级特性。...

    Java/JavaEE 学习笔记

    第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 ...

Global site tag (gtag.js) - Google Analytics