java编程思想 IO9 文件操作源码

缓冲器的详细应用:

package com.dirlist;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.io.*;
public class BufferToText {

	/**
	 * 转换数据
	 */
	
	private static final int BSIZE=1024;
	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);
		System.out.println(fc.size());
		fc.read(buff);
		buff.flip();
		//Doesn't work
		//CharBuffer字符缓冲区。通过CharBuffer来获取缓冲区的字符串信息
		System.out.println(buff.asCharBuffer().toString());
		buff.rewind();
		//Decode using this system's default Charset
		String encoding=System.getProperty("file.encoding");
		System.out.println(encoding);
		//Charset  16 位的 Unicode 代码单元序列和字节序列之间的命名映射关系。
		//此类定义了用于创建解码器和编码器以及检索与 charset 关联的各种名称的方法。此类的实例是不可变的。
		//decode()将此 charset 中的字节解码成 Unicode 字符的便捷方法。 
		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().toString());
		fc=new FileOutputStream("data2.txt").getChannel();
		buff=ByteBuffer.allocate(24);//more than needed
		buff.asCharBuffer().put("Some text");
		fc.write(buff);
		fc.close();
		fc=new FileInputStream("data2.txt").getChannel();
		buff.clear();
		fc.read(buff);
		buff.flip();
		System.out.println(buff.asCharBuffer().toString());
		
		
	}

}


package com.dirlist;

import java.nio.charset.Charset;
import java.util.*;
import java.io.*;
public class AvailableCharsets {

	/**
	 *该类提供了把数据编码成多种不同类型的字符集工具
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		InputStream consolein=System.in;
		PrintStream consoleout=System.out;
		PrintStream out=new PrintStream(new FileOutputStream("charsetutils.txt"));
		System.setOut(out);
		System.setErr(out);
		SortedMap<String,Charset> charSets=Charset.availableCharsets();
		Iterator<String> it=charSets.keySet().iterator();
		while(it.hasNext()){
			String csName=it.next();
			System.out.print(csName);
			//aliases()返回包含此 charset 各个别名的集合。
			Iterator aliases=charSets.get(csName).aliases().iterator();
			if(aliases.hasNext()){
				System.out.print(": ");
			}
			while(aliases.hasNext()){
				System.out.print(aliases.next());
				if(aliases.hasNext()){
					System.out.print(",");
				}
			}
			System.out.println();
		}
		out.close();
		//恢复对控制台的重定向
		System.setOut(consoleout);
		System.setIn(consolein);
		System.out.println("重定向将控制台信息保存至文件");
	}

}


package com.dirlist;

import java.nio.ByteBuffer;

public class GetData {

	/**
	 *获取基本类型
	 */
	////向ByteBuffer插入基本类型数据的最简单方法是:利用asCharBuffer()等,获得该缓冲器上的视图,然后使用
	//视图的put() 方法
	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()){
			int value=bb.get();
			if(value!=0){
				System.out.println("nonzero");
			}else{
				System.out.println("i = "+i+"       "+value);
			}
		}
		System.out.println("i = "+i);
		bb.rewind();
		bb.asCharBuffer().put("Howdy!");
		char c;
		while((c=bb.getChar())!=0){
			System.out.print(c+" ");
		}
		System.out.println();
		bb.rewind();
		bb.asShortBuffer().put((short) 7874328);
		System.out.println(bb.getShort());
		bb.rewind();
		bb.asIntBuffer().put(99463244);
		System.out.println(bb.getInt());
		bb.rewind();
		bb.asLongBuffer().put(992345671);
		System.out.println(bb.getLong());
		bb.rewind();
		bb.asFloatBuffer().put(992345671);
		System.out.println(bb.getFloat());
		bb.rewind();
		bb.asDoubleBuffer().put(992345671);
		System.out.println(bb.getDouble());
		bb.rewind();
	}

}

 

你可能感兴趣的:(java,编程,C++,c,C#)