`

java需要关注的知识点---I0之新IO(NI0)

 
阅读更多
缓冲器操纵数据:
ByteBuffer是数据移进移出通道的唯一方式,使用ByteBuffer.wrap把子节数组包装起来然后用getChannel()方法在FileInputStream上打开一个通道,接着将来自于ByteBuffer的数据写入到FileChannel中。
ByteBuffer的方法详细:

capacity()--->返回缓冲区容量
clear() --->清空缓冲区,将position设置为0,limit设置为容量。调用此方法可以覆写缓冲区。
flip() ---> 将limit设置为position,position设置为0,此方法用于准备从缓冲区读取已经写入的数据。
limit() --->返回limit的值。
limit(int limit)---> 设置limit的值
mark() ---> 将mark设置为position.
position() ---> 返回position的值。
position(int pos) --->设置position的值。
remaining() ---> 返回(limit -  position)
hasRemainging() --> 若有介于position和limit之间的元素,返回true.

mark---->标记    position ----->位置   limit----> 界限  capacity-->容量

FileInputStream,FileOutputStream 和 RandomAccessFile 和FileChannel的转换
public class GetChannel {
	private static final int BSIZE = 1024;
	public static void main(String[] args) throws IOException {
		
		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());
	}
}

使用allocateDirect()提高速度。
public class ChannelCopy {
	private static final int BSIZE = 1024;
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		System.out.println(args.length);
		if (args.length != 2) {
			System.out.println("arguments: sourcefile destfile");
			System.exit(1);
		}
		System.out.println(args[0]);
		FileChannel in = new FileInputStream(args[0]).getChannel();
		System.out.println(args[1]);
		FileChannel out = new FileOutputStream(args[1]).getChannel();
		ByteBuffer buff = ByteBuffer.allocateDirect(BSIZE);
		while ((in.read(buff)) != -1) {
			buff.flip();
			out.write(buff);
			buff.clear();
		}
	}

}

使用transferTo/treansferFrom将一个管道和另外一个管道相通,达到上面copy的效果。
public class TransferTo {
	private static final int BSIZE = 1024;
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		if (args.length != 2) {
			System.out.println("arguments: sourcefile destfile");
			System.exit(1);
		}
		System.out.println(args[0]);
		FileChannel in = new FileInputStream(args[0]).getChannel();
		System.out.println(args[1]);
		FileChannel out = new FileOutputStream(args[1]).getChannel();
		ByteBuffer buff = ByteBuffer.allocateDirect(BSIZE);
		in.transferTo(0, in.size(), out);
		// or: out.treansferFrom(in,0,in.size());
	}

}


使用CharBuffer的asCharBuffer()方法读数据:
public class BufferToText {
	private static final int BSIZE = 1024;
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		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());
		System.out.println("-----example 1 end-----");
		buff.rewind();
		String encoding = System.getProperty("file.encoding");
		System.out.println("Decoded using " + encoding + ":" + Charset.forName(encoding).decode(buff));
		fc = new FileOutputStream("data2.txt").getChannel();
		fc.write(ByteBuffer.wrap("some text".getBytes("UTF-16BE")));
		fc.close();
		fc = new FileInputStream("data2.txt").getChannel();
		buff.clear();
		fc.read(buff);
		buff.flip();
		System.out.println(buff.asCharBuffer());
		System.out.println("-----example 2 end-----");
		fc = new FileOutputStream("data2.txt").getChannel();
		buff = ByteBuffer.allocate(18);
		buff.asCharBuffer().put("Some text");
		fc.write(buff);
		fc.close();
		fc = new FileInputStream("data2.txt").getChannel();
		buff.clear();
		fc.read(buff);
		buff.flip();
		fc.close();
		System.out.println(buff.asCharBuffer());
		System.out.println("-----example 3 end-----");
	}

}


转换数据(详解Charset):
public class AvailableCharSets {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SortedMap<String,Charset> charset = Charset.availableCharsets();
		Iterator<String> it = charset.keySet().iterator();
		while(it.hasNext()) {
			String csName = it.next();
			System.out.print("name:" + csName);
			Iterator aliase = charset.get(csName).aliases().iterator();
			if(aliase.hasNext())
				System.out.print(":" + aliase.next());
			while(aliase.hasNext()) {
				System.out.print(":"+aliase.next());
				if(aliase.hasNext())
					System.out.print(",");
			}
			System.out.println();
		}
	}

}



get date from bytebuffer:

public class GetData {
	private static final int BSIZE = 1024;
	public static void main(String[] args) {
		ByteBuffer bb = ByteBuffer.allocate(BSIZE);
		int i = 0;
		while(i ++<bb.limit())
			System.out.print("nonzero");
		System.out.println("i = " + i);
		bb.rewind();
		bb.asCharBuffer().put("HowDay");
		char c;
		while((c = bb.getChar()) != 0) {
			System.out.print(c + " ");
		}
		System.out.println();
		bb.rewind();
		bb.asShortBuffer().put((short)471142);
		System.out.println(bb.getShort());
		
		bb.rewind();
		bb.asIntBuffer().put(99471142);
		System.out.println(bb.getInt());
		
		bb.rewind();
		bb.asLongBuffer().put(99471142);
		System.out.println(bb.getLong());
		
		bb.rewind();
		bb.asFloatBuffer().put(99471142);
		System.out.println(bb.getFloat());
		
		bb.rewind();
		bb.asDoubleBuffer().put(99411147.32);
		System.out.println(bb.getDouble());
		
		bb.rewind();
	}
}


使用IntBuffer存储int:


public class InBufferDemo {
	private static final int BSIZE = 1024;
	public static void main(String args[]) {
		ByteBuffer bb = ByteBuffer.allocate(BSIZE);
		IntBuffer ib = bb.asIntBuffer();
		ib.put(new int[]{11,42,47,99,143,811,1016});
		System.out.println(ib.get(3));
		ib.put(3,1181);
		System.out.println(ib.get(3)+":");
		//set a new limit before rewinding the buffer.
		ib.flip();
		while(ib.hasRemaining()) {
			int i = ib.get();
			System.out.println(i);
		}
	}
}


byteBuffer转换其他类型buffer:
public class ViewBuffers {
	private static final int BSIZE = 1024;
	public static void main(String[] args) {
		ByteBuffer bb = ByteBuffer.wrap(new byte[]{0,0,0,0,0,0,0,'a'});
		bb.rewind();
		System.out.println("ByteBuffer");
		while(bb.hasRemaining()) {
			System.out.print(bb.position() + "-->" + bb.get()+ ",");
		}
		System.out.println("byte end!");
		CharBuffer cb = ((ByteBuffer)bb.rewind()).asCharBuffer();
		while(cb.hasRemaining()) {
			System.out.print(cb.position() + "-->" + cb.get() + ",");
		}
		System.out.println("char end!");
		
		FloatBuffer fb = ((ByteBuffer)bb.rewind()).asFloatBuffer();
		while(fb.hasRemaining()) {
			System.out.print(fb.position() + "-->" + fb.get() + ",");
		}
		System.out.println("float end!");
		
		IntBuffer ib = ((ByteBuffer)bb.rewind()).asIntBuffer();
		while(ib.hasRemaining()) {
			System.out.print(ib.position() + "-->" + ib.get() + ",");
		}
		System.out.println("int end!");
		
		LongBuffer lb = ((ByteBuffer)bb.rewind()).asLongBuffer();
		while(lb.hasRemaining()) {
			System.out.print(lb.position() + "-->" + lb.get() + ",");
		}
		System.out.println("Long end!");
		
		ShortBuffer sb = ((ByteBuffer)bb.rewind()).asShortBuffer();
		while(sb.hasRemaining()) {
			System.out.print(sb.position() + "-->" + sb.get() + ",");
		}
		System.out.println("Short end!");
		
		DoubleBuffer db = ((ByteBuffer)bb.rewind()).asDoubleBuffer();
		while(db.hasRemaining()) {
			System.out.print(db.position() + "-->" + db.get() + ",");
		}
		System.out.println("Double end!");
		
	}

}

ByteBuffer默认是以高位优先的形式存储数据的,可以使用ByteOrder.BIG_ENDIAN 或者ByteOrder.LITLE_ENDIAN改变ByteBuffer的字节排序方式,数据在网上传递时,也常常是以高位优先的形式。通过以下程序来改变字节顺序。
public class Endians {
	public static void main(String[] args) {
		ByteBuffer bb = ByteBuffer.wrap(new byte[12]);
		bb.asCharBuffer().put("abcdef");
		System.out.println(Arrays.toString(bb.array()));
		bb.rewind();
		bb.order(ByteOrder.BIG_ENDIAN);
		bb.asCharBuffer().put("abcdef");
		System.out.println("ByteOrder.BIG_ENDIAN:" + Arrays.toString(bb.array()));
		bb.rewind();
		bb.order(ByteOrder.LITTLE_ENDIAN);
		bb.asCharBuffer().put("abcdef");
		System.out.println("ByteOrder.LITTLE_ENDIAN:" + Arrays.toString(bb.array()));

	}
}

输出结果:
[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]
ByteOrder.BIG_ENDIAN:[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]
ByteOrder.LITTLE_ENDIAN:[97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0]
分享到:
评论

相关推荐

    java-IO流 commons-io-2.11.0.jar

    java-IO流 commons-io-2.11.0.jar

    Java IO commons-io-2.5.jar

    Java IO 是Java编程语言中处理输入/输出流的重要部分,它是连接程序与外部世界的桥梁,允许数据在程序和外部资源之间流动。`commons-io-2.5.jar` 是Apache Commons项目的一部分,它提供了一系列增强和扩展了Java标准...

    commons-io-2.8.0-API文档-中英对照版.zip

    赠送jar包:commons-io-2.8.0.jar; 赠送原API文档:commons-io-2.8.0-javadoc.jar; 赠送源代码:commons-io-2.8.0-sources.jar; 赠送Maven依赖信息文件:commons-io-2.8.0.pom; 包含翻译后的API文档:commons-io...

    Java IO知识点

    Java IO(Input/Output)是Java编程语言中用于处理输入输出操作的重要部分,涉及文件、网络、内存等数据传输。本文将深入探讨Java IO的基本概念、分类、选择流的策略以及常用的流类型。 首先,File类是Java IO的...

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    本教程将深入讲解如何使用Java Servlet、Apache Commons IO库(版本2.4)以及Apache Commons FileUpload库(版本1.3)来实现这一功能。 一、Apache Commons IO与FileUpload库介绍 Apache Commons IO是一个Java库,...

    commons-io-2.11.0-API文档-中文版.zip

    赠送jar包:commons-io-2.11.0.jar; 赠送原API文档:commons-io-2.11.0-javadoc.jar; 赠送源代码:commons-io-2.11.0-sources.jar; 赠送Maven依赖信息文件:commons-io-2.11.0.pom; 包含翻译后的API文档:...

    commons-io-2.7-API文档-中文版.zip

    赠送jar包:commons-io-2.7.jar; 赠送原API文档:commons-io-2.7-javadoc.jar; 赠送源代码:commons-io-2.7-sources.jar; 赠送Maven依赖信息文件:commons-io-2.7.pom; 包含翻译后的API文档:commons-io-2.7-...

    commons-io-2.5-API文档-中文版.zip

    标签:commons、io、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    commons-io-1.3.2-API文档-中文版.zip

    标签:commons、io、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Java高级-----Java-IO系统.ppt

    Java高级-----Java-IO系统.ppt

    commons-io-1.4.jar.zip_io流jar

    《Java IO流详解与commons-io-1.4.jar库的应用》 在Java编程语言中,IO(Input/Output)流是一组用于数据传输的类,它们允许程序读取和写入数据,无论是从磁盘、网络还是其他输入输出设备。Java的IO流系统是一个...

    protoc-gen-grpc-java-1.40.0-osx-aarch_64.exe

    protoc-gen-grpc-java-1.40.0-osx-aarch_64 mac arm芯片平台grpc生成java的支持。官网上面没有,这是基于源码编译生成的。 pom.xml:(protoc-gen-grpc-java-1.40.0.pom) &lt;?xml version="1.0" encoding="UTF-8"?&gt; ...

    commons-io-2.6.jar下载

    下面将详细介绍 `commons-io-2.6.jar` 中的关键知识点。 1. **基本文件操作**: - `FileUtils` 类提供了大量静态方法,用于文件的创建、删除、复制、移动和读写操作。例如,`copyFile()` 和 `moveFile()` 方法可以...

    Java知识点总结大全(五) -- IO流.xmind

    Java知识点总结大全(五) -- io流,关注后面会分享面向对象,io,集合,多线程,网络,sql的总结

    Java commons-io-2.4

    Java Commons IO 2.4 是一个广泛使用的Java库,它为处理输入/输出(I/O)操作提供了丰富的功能。这个工具包极大地简化了与文件、流、读写操作、转换、检查和比较相关的任务,使开发者能够更加高效地处理Java中的IO问题...

    commons-io-2.4 包含了所有commons-io的jar包和源码

    Apache Commons IO 是一个Java库,专注于提供各种I/O操作的实用工具类,这些操作包括文件、流、过滤器、读写、转换、检测等。在本案例中,我们讨论的是"commons-io-2.4"版本,这个版本包含了完整的Apache Commons IO...

    common-io-3.1.1-API文档-中文版.zip

    标签:twelvemonkeys、common、io、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...

    Java开发案例-springboot-12-集成socket.io服务端和客户端-源代码+文档.rar

    Java开发案例-springboot-12-集成socket.io服务端和客户端-源代码+文档.rar Java开发案例-springboot-12-集成socket.io服务端和客户端-源代码+文档.rar Java开发案例-springboot-12-集成socket.io服务端和客户端-源...

    java-IO流 commons-io and hutool

    java-IO流 commons-io and hutool

    Java-Io流,练习

    本练习旨在帮助初学者理解和掌握Java IO流的基础知识。 一、IO流的概念 IO流在Java中分为两大类:输入流(Input Stream)和输出流(Output Stream)。输入流用于从源(如文件、网络连接等)读取数据,而输出流则...

Global site tag (gtag.js) - Google Analytics