imaginecup之IO分析


imaginecup之IO分析 作者: imaginecup http://imaginecup.javaeye.com 我的博客文章精选 http://www.javaeye.com - 做最棒的软件开发交流社区 第 1 / 55 页 本书由JavaEye提供的电子书DIY功能自动生成于 2010-10-02 目 录 1. Java基础 1.1 java编程思想 IO1源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 java编程思想 IO2源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3 java编程思想 IO3源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.4 java编程思想 IO4源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5 java编程思想 IO5 文件操作源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16 1.6 java编程思想 IO6 文件操作源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 1.7 java编程思想 IO7 文件操作源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27 1.8 java编程思想 IO8 文件操作源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 1.9 java编程思想 IO9 文件操作源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 1.10 java编程思想 IO10 文件操作源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 1.11 java编程思想 IO11 源码 内存映射访问与性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44 1.12 java编程思想 IO12 源码 文件加锁 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49 1.13 java编程思想 IO13 源码 文件解压缩 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52 http://imaginecup.javaeye.com 第 2 / 55 页 1.1 java编程思想 IO1源码 发表时间: 2010-05-03 目录列表器与目录过滤器的运用 package com.dirlist; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; /* args=D.*\.java */ public class DirList { /** * 目录列表器与目录过滤器 */ public static void main(String[] args) { File path=new File("src/com/dirlist"); String[] fileList = null; if(args.length==0){ System.out.println("没有默认初始值"); //返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。 fileList=path.list(); }else{ System.out.println("有默认初始值"); //返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名 来表示的。 //当且仅当在此抽象路径名和它所表示的目录中的文件名或目录名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) //方法返回 true 时,该名称才满足过滤器。 fileList=path.list(new DirFilter(args[0])); System.out.println(fileList.length); } //此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工 厂。 http://imaginecup.javaeye.com 1.1 java编程思想 IO1源码 第 3 / 55 页 //根据指定比较器产生的顺序对指定对象数组进行排序。 //String.CASE_INSENSITIVE_ORDER是一个排序 String 对象的 Comparator,它的作用与 compareToIgnoreCase 相同。该比较器是可序列化的。 Arrays.sort(fileList,String.CASE_INSENSITIVE_ORDER); for(String dirItem:fileList){ System.out.println(dirItem); } } } class DirFilter implements FilenameFilter{ //Pattern正则表达式的编译表示形式。 private Pattern pattern; public DirFilter(String regex){ //指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象 //将给定的正则表达式编译到模式中。 pattern=Pattern.compile(regex); } public boolean accept(File dir, String name) { System.out.println(dir.getAbsolutePath()); //创建匹配给定输入与此模式的匹配器,并且尝试将整个区域与模式匹配。 System.out.println(pattern.matcher(name).matches()); return pattern.matcher(name).matches(); } 创建DirFilter类的目的在于将accept()方法提供给list()使用,使list()可以回调accept()方法。list()方法会为此目 录下的所有文件名调用accept()方法,来判断是否符合你定义的目录过滤器。判断结果由accept()返回的布尔值表 示。 FilenameFilter.accept(java.io.File, java.lang.String) 源码解析: public String[] list(FilenameFilter filter) { String names[] = list();//File.list()返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数 组。 if ((names == null) || (filter == null)) { return names; http://imaginecup.javaeye.com 1.1 java编程思想 IO1源码 第 4 / 55 页 }//如果返回的字符串数组或目录过滤器为空,则返回字符串数组 ArrayList v = new ArrayList(); for (int i = 0 ; i < names.length ; i++) { if (filter.accept(this, names[i])) { v.add(names[i]);//如果满足过滤条件,则插入 } } return (String[])(v.toArray(new String[v.size()]));//将满足过滤器的目录名或文件名转化为字符串数组并返回 } 利用匿名内部类实现: DirList2.java package com.dirlist; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; public class DirList2 { /** *利用匿名内部类 */ //传向filte的参数必须是final的。这在匿名内部类中是必需的,只有这样匿名内部类才能使用来自类范围之外的 对象 public static FilenameFilter filter(final String regex){ return new FilenameFilter(){ private Pattern pattern=Pattern.compile(regex); public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }; } public static void main(String[] args) { File path=new File("src/com/dirlist"); String[] fileList=null; if(args.length==0){ fileList=path.list(); http://imaginecup.javaeye.com 1.1 java编程思想 IO1源码 第 5 / 55 页 }else{ fileList=path.list(DirList2.filter(args[0])); } Arrays.sort(fileList, String.CASE_INSENSITIVE_ORDER); for(String fileItem:fileList){ System.out.println(fileItem); } } } DirList3.java package com.dirlist; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; public class DirList3 { /** * @param args */ public static void main(final String[] args) { File path=new File("src/com/dirlist"); String[] fileList=null; if(args.length==0){ fileList=path.list(); }else{ fileList=path.list(new FilenameFilter(){ private Pattern pattern=Pattern.compile(args[0]); public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); } Arrays.sort(fileList,String.CASE_INSENSITIVE_ORDER); http://imaginecup.javaeye.com 1.1 java编程思想 IO1源码 第 6 / 55 页 for(String fileItem:fileList){ System.out.println(fileItem); } } } 希望对大家有用!!! http://imaginecup.javaeye.com 1.1 java编程思想 IO1源码 第 7 / 55 页 1.2 java编程思想 IO2源码 发表时间: 2010-05-03 package net.mindview.util; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; public final class Directory { /** *目录实用工具 */ //通过local()方法产生由本地目录中的文件构成的File对象数组 public static File[] local(File dir,final String regex){ //返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。 return dir.listFiles(new FilenameFilter(){ private Pattern pattern=Pattern.compile(regex); public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); } public static File[] local(String path,final String regex){ return local(new File(path),regex); } //静态内部类 public static class TreeInfo implements Iterator{ public List files=new ArrayList(); public List dirs=new ArrayList(); public Iterator iterator(){ return files.iterator(); http://imaginecup.javaeye.com 1.2 java编程思想 IO2源码 第 8 / 55 页 } //按照指定 Collection 的迭代器所返回的元素顺序,将该 Collection 中的所有元素追加到此列表的尾部。 void addAll(TreeInfo other){ files.addAll(other.files); dirs.addAll(other.dirs); } public String toString(){ return "dirs:"+PPrint.pformat(dirs)+"\n\nfiles:"+PPrint.pformat(files); } public static TreeInfo walk(String start,String regex){ return recurseDirs(new File(start),regex); } public static TreeInfo recurseDirs(File startDir,String regex){ TreeInfo result=new TreeInfo(); //利用递归 for(File item:startDir.listFiles()){ if(item.isDirectory()){ result.dirs.add(item); result.addAll(recurseDirs(item,regex)); }else{ if(item.getName().matches(regex)){ result.files.add(item); } } } return result; } public static TreeInfo walk(File start,String regex){ return recurseDirs(start,regex); } public static TreeInfo walk(File start){ return recurseDirs(start,".*"); } public static TreeInfo walk(String start){ return recurseDirs(new File(start),".*"); } public boolean hasNext() { http://imaginecup.javaeye.com 1.2 java编程思想 IO2源码 第 9 / 55 页 return false; } public File next() { return null; } public void remove() { } } public static void main(String[] args) { if(args.length==0){ System.out.println(TreeInfo.walk(".","D.*\\.java")); }else{ for(String arg:args){ System.out.println(TreeInfo.walk(arg)); } } } } http://imaginecup.javaeye.com 1.2 java编程思想 IO2源码 第 10 / 55 页 1.3 java编程思想 IO3源码 发表时间: 2010-05-03 利用策略设计模式来进行目录的遍历和文件的过滤 package net.mindview.util; import java.io.File; import java.io.IOException; //策略设计模式 public class ProcessFiles { public interface Strategy{ void process(File file); } private Strategy strategy; private String ext; public ProcessFiles(Strategy strategy,String ext){ this.strategy=strategy; this.ext=ext; } public void start(String[] args){ try{ if(args.length==0){ processDirectoryTree(new File(".")); }else{ for(String arg:args){ File fileArg=new File(arg); if(fileArg.isDirectory()){ processDirectoryTree(fileArg); }else{ if(!arg.endsWith("."+ext)){ arg+="."+ext; } strategy.process(new File(arg).getCanonicalFile()); } } } }catch(IOException e){ http://imaginecup.javaeye.com 1.3 java编程思想 IO3源码 第 11 / 55 页 e.printStackTrace(); } } public void processDirectoryTree(File root) throws IOException{ System.out.println(root.getAbsolutePath()); for(File file:Directory.TreeInfo.walk(root.getAbsolutePath(), ".*\\."+ext).files) //返回此抽象路径名的规范形式。等同于 new File(this.getCanonicalPath()())。 strategy.process(file.getCanonicalFile()); System.out.println("====================================="); } public static void main(String[] args) { System.out.println("策略设计模式"); new ProcessFiles(new ProcessFiles.Strategy(){ public void process(File file) { System.out.println(file.toString()); } }, "class").start(args); } } http://imaginecup.javaeye.com 1.3 java编程思想 IO3源码 第 12 / 55 页 1.4 java编程思想 IO4源码 发表时间: 2010-05-03 目录的检查及创建 package com.dirlist; import java.io.File; public class MakeDirectories { /** * 目录的检查及创建 */ private static void usage(){ System.err.println("Usage:MakeDirectories path1 ...\n" + "Creates each path\n" + "Usage:MakeDirectories -d path1 ...\n" + "Deletes each path\n" + "Usage:MakeDirectories -r path1 path2 ...\n" + "Rename from path1 to path2"); System.exit(1); } private static void fileData(File f){ System.out.println("Absolute path:"+f.getAbsolutePath() +"\n Can read:"+f.canRead() +"\n Can write:"+f.canWrite() +"\n getName:"+f.getName() +"\n getParrent:"+f.getParent()//返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目 录,则返回 null。 +"\n getPath:"+f.getPath() +"\n length:"+f.length() +"\n lastModified:"+f.lastModified()); if(f.isFile()){ System.out.println("It's a file"); }else if(f.isDirectory()){ System.out.println("It's a directory"); http://imaginecup.javaeye.com 1.4 java编程思想 IO4源码 第 13 / 55 页 } } public static void main(String[] args) { if(args.length<1) usage(); if(args[0].equals("-r")){ if(args.length!=3){ usage(); } File old=new File(args[1]); File rname=new File(args[2]); old.renameTo(rname); fileData(old); fileData(rname); return; } int count=0; boolean del=false; if(args[0].equals("-d")){ count++; del=true; } count--; while(++count iterator = TreeInfo.walk(".", ".*\\.class").files .iterator(); while (iterator.hasNext()) { File file = (File) iterator.next(); //所有的.class文件都是以CAFEBABE开头的 System.out.println(Integer.toHexString(testRead(file)).toUpperCase()); } } catch (Exception e) { e.printStackTrace(); } } } package net.mindview.util; import java.io.*; import java.util.*; public class TextFile extends ArrayList{ /** * 文件读写的实用工具 * @throws IOException */ //Read a file as a single String public static String read(String filename) throws IOException{ StringBuilder sb=new StringBuilder(); BufferedReader br=new BufferedReader(new FileReader(new File(filename).getAbsoluteFile())); String s; while((s=br.readLine())!=null){ sb.append(s+"\n"); } br.close(); http://imaginecup.javaeye.com 1.6 java编程思想 IO6 文件操作源码 第 24 / 55 页 return sb.toString(); } //Write a single file in one method call public static void write(String filename,String text) throws IOException{ File path=new File(filename).getAbsoluteFile(); PrintWriter pw=new PrintWriter(path); pw.print(text); pw.close(); } //Read a file,split by any regular expression public TextFile(String filename,String splitter) throws IOException{ super(Arrays.asList(read(filename).split(splitter))); //System.out.println(get(0)+"======================"); if(get(0).equals("")) System.out.println("++++++++++++++++"); remove(0); } //Normally read by lines: public TextFile(String filename) throws IOException{ this(filename,"\n"); } public void write(String filename) throws IOException{ PrintWriter out=new PrintWriter(new File(filename).getAbsoluteFile()); for(String item:this){ out.println(item); } out.close(); } public static void main(String[] args) throws IOException { String file=read("src/net/mindview/util/TextFile.java"); write("text.txt",file); //System.out.println(read("text.txt")); TextFile tf=new TextFile("text.txt"); // System.out.println(read("text.txt")); tf.write("text2.txt"); // System.out.println(read("text2.txt")); //非词字符 http://imaginecup.javaeye.com 1.6 java编程思想 IO6 文件操作源码 第 25 / 55 页 TreeSet words=new TreeSet(new TextFile("src/net/mindview/util/TextFile.java","\\W+")); System.out.println(words.toString()); //headSet(E toElement)返回此 set 的部分视图,要求其元素严格小于 toElement。 System.out.println(words.headSet("a")); } } http://imaginecup.javaeye.com 1.6 java编程思想 IO6 文件操作源码 第 26 / 55 页 1.7 java编程思想 IO7 文件操作源码 发表时间: 2010-05-06 希望大家留言一起讨论讨论。 package com.dirlist; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Echo { package com.dirlist; import java.io.*; import java.util.Scanner; public class Redirecting { /** * 标准I/O重定向 * @throws IOException */ public static void main(String[] args) throws IOException { //存储System.in和System.out最初的引用 PrintStream console=System.out; InputStream inconsole=System.in; BufferedInputStream in=new BufferedInputStream(new FileInputStream("src\\com\\dirlist\\Redirecting.java")); PrintStream out=new PrintStream(new BufferedOutputStream(new FileOutputStream("test.out"))); /* * 重新分配“标准”输入流。 首先,如果有安全管理器,则通过 RuntimePermission("setIO") * 权限调用其 checkPermission 方法,查看是否可以重新分配“标准”输入流。 */ //将控制台输入重定向到文件输入 System.setIn(in); /* * 重新分配“标准”输出流。 首先,如果有安全管理器,则通过 RuntimePermission("setIO") http://imaginecup.javaeye.com 1.7 java编程思想 IO7 文件操作源码 第 27 / 55 页 * 权限调用其 checkPermission 方法,查看是否可以重新分配“标准”输入流。 */ //将控制台输出重定向到文件输出 System.setOut(out); //重新分配“标准”错误输出流。 System.setErr(out); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String s; while((s=br.readLine())!=null){ System.out.println(s); } out.close(); //恢复对控制台的重定向 System.setOut(console); System.setIn(inconsole); System.out.println("重定向好难啊!"); Scanner sc=new Scanner(System.in); System.out.println(sc.next()); //这个程序将标准输入连接到文件上,并将标准输出重定向到另一个文件上。 //注意它在程序开头处存储了对最初System.in和System.out的引用,并且在结尾处恢复到该对象上. } } /** * 从标准输入中读取 * @throws IOException */ public static void main(String[] args) throws IOException { BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); String s; //Any empty line or Ctr-Z terminates the program while((s=stdin.readLine())!=null&&s.length()!=0){ System.out.println(s.toUpperCase()); http://imaginecup.javaeye.com 1.7 java编程思想 IO7 文件操作源码 第 28 / 55 页 } } } package com.dirlist; import java.io.PrintWriter; public class ChangeSystemOut { /** * 将System.out转换成PrintWriter */ public static void main(String[] args) { PrintWriter pw=new PrintWriter(System.out,true); pw.println("Hello World!"); } } package com.dirlist; import java.io.*; import java.util.Scanner; public class Redirecting { /** * 标准I/O重定向 * @throws IOException */ public static void main(String[] args) throws IOException { //存储System.in和System.out最初的引用 PrintStream console=System.out; InputStream inconsole=System.in; BufferedInputStream in=new BufferedInputStream(new FileInputStream("src\\com\\dirlist\\Redirecting.java")); http://imaginecup.javaeye.com 1.7 java编程思想 IO7 文件操作源码 第 29 / 55 页 PrintStream out=new PrintStream(new BufferedOutputStream(new FileOutputStream("test.out"))); /* * 重新分配“标准”输入流。 首先,如果有安全管理器,则通过 RuntimePermission("setIO") * 权限调用其 checkPermission 方法,查看是否可以重新分配“标准”输入流。 */ //将控制台输入重定向到文件输入 System.setIn(in); /* * 重新分配“标准”输出流。 首先,如果有安全管理器,则通过 RuntimePermission("setIO") * 权限调用其 checkPermission 方法,查看是否可以重新分配“标准”输入流。 */ //将控制台输出重定向到文件输出 System.setOut(out); //重新分配“标准”错误输出流。 System.setErr(out); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String s; while((s=br.readLine())!=null){ System.out.println(s); } out.close(); //恢复对控制台的重定向 System.setOut(console); System.setIn(inconsole); System.out.println("重定向好难啊!"); Scanner sc=new Scanner(System.in); System.out.println(sc.next()); //这个程序将标准输入连接到文件上,并将标准输出重定向到另一个文件上。 //注意它在程序开头处存储了对最初System.in和System.out的引用,并且在结尾处恢复到该对象上. } } IO重定向操纵的是字节流,不是字符流。 http://imaginecup.javaeye.com 1.7 java编程思想 IO7 文件操作源码 第 30 / 55 页 1.8 java编程思想 IO8 文件操作源码 发表时间: 2010-05-06 通道与缓冲器的探究 package com.dirlist; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.io.*; public class ChannelCopy { private static final int BSIZE=1024; public static void main(String[] args) throws IOException { if(args.length!=2){ System.out.println("arguments: sourcefile destfile"); System.exit(1); } FileChannel in=new FileInputStream(args[0]).getChannel(),out=new FileOutputStream(args[1]).getChannel(); ByteBuffer buff=ByteBuffer.allocate(BSIZE); //一旦调用read()来告知FileChannel向ByteBuffer存储字节,就必须调用缓冲器上的flip(),让它做好让别人读取字节的准备 while(in.read(buff)!=-1){ buff.flip(); out.write(buff); //如果打算使用缓冲器执行进一步的read()操作,我们必须调用clear()方法 buff.clear();//清除此缓冲区。将位置设置为零,限制设置为该容量,并且丢弃标记。 } } } package com.dirlist; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; http://imaginecup.javaeye.com 1.8 java编程思想 IO8 文件操作源码 第 31 / 55 页 import java.io.*; public class GetChannel { /** * 新I/O 通道与缓冲器 */ private static final int BSIZE=1024; public static void main(String[] args) throws IOException { //FileChannel用于读取、写入、映射和操作文件的通道。 FileChannel fc=new FileOutputStream("data.txt").getChannel(); //ByteBuffer字节缓冲区。wrap()将字节数组包装到缓冲区中。 //新的缓冲区将由给定的字节数组支持;也就是说,缓冲区修改将导致数组修改,反之亦然。新缓冲区的容量和界限将为 array.length,其位置将为零,其标记是不确定的。其底层实现数组将为给定数组,并且其数组偏移量将为零。 fc.write(ByteBuffer.wrap("Some text ".getBytes())); fc.close(); fc=new RandomAccessFile("data.txt","rw").getChannel(); //position()设置此通道的文件位置。 //将该位置设置为大于文件当前大小的值是合法的,但这不会更改文件的大小。稍后试图在这样的位置读取字节将立即返回已到达文件末尾的指示。稍后试图在这种位置写入字节将导致文件扩大,以容纳新的字节;在以前文件末尾和新写入字节之间的字节值是未指定的。 //size()返回此通道的文件的当前大小。 System.out.println(fc.size()); fc.position(fc.size()); fc.write(ByteBuffer.wrap("Some more ".getBytes())); fc.close(); fc=new FileInputStream("data.txt").getChannel(); // allocate(int capacity)分配一个新的字节缓冲区。 ByteBuffer buff=ByteBuffer.allocate(BSIZE); fc.read(buff); //flip()反转此缓冲区。首先对当前位置设置限制,然后将该位置设置为零。如果已定义了标记,则丢弃该标记。 buff.flip(); //hasRemaining()判断在当前位置和限制之间是否有任何元素。 while(buff.hasRemaining()){ System.out.print((char)buff.get()); } } http://imaginecup.javaeye.com 1.8 java编程思想 IO8 文件操作源码 第 32 / 55 页 } package com.dirlist; import java.nio.channels.FileChannel; import java.io.*; public class TransferTo { /** * 如何将一个通道与另一个通道连接 * @throws IOException */ public static void main(String[] args) throws IOException { if(args.length!=2){ System.out.println("arguments : sourfile destfile"); System.exit(1); } FileChannel in=new FileInputStream(args[0]).getChannel(),out=new FileOutputStream(args[1]).getChannel(); in.transferTo(0, in.size(), out); //或者 out.transferFrom(in, 0, in.size()); } } http://imaginecup.javaeye.com 1.8 java编程思想 IO8 文件操作源码 第 33 / 55 页 1.9 java编程思想 IO9 文件操作源码 发表时间: 2010-05-06 缓冲器的详细应用: 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); http://imaginecup.javaeye.com 1.9 java编程思想 IO9 文件操作源码 第 34 / 55 页 //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 { http://imaginecup.javaeye.com 1.9 java编程思想 IO9 文件操作源码 第 35 / 55 页 /** *该类提供了把数据编码成多种不同类型的字符集工具 * @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 charSets=Charset.availableCharsets(); Iterator 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("重定向将控制台信息保存至文件"); } } http://imaginecup.javaeye.com 1.9 java编程思想 IO9 文件操作源码 第 36 / 55 页 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.get()+","); } System.out.println(); CharBuffer cb=((ByteBuffer)bb.rewind()).asCharBuffer(); System.out.print("Char Buffer:"); while(cb.hasRemaining()){ System.out.print(cb.position()+" -> "+cb.get()+","); } System.out.println(); FloatBuffer fb=((ByteBuffer)bb.rewind()).asFloatBuffer(); System.out.print("Float Buffer:"); while(fb.hasRemaining()){ System.out.print(fb.position()+" -> "+fb.get()+","); } System.out.println(); IntBuffer ib=((ByteBuffer)bb.rewind()).asIntBuffer(); System.out.print("Int Buffer:"); while(ib.hasRemaining()){ System.out.print(ib.position()+" -> "+ib.get()+","); } System.out.println(); LongBuffer lb=((ByteBuffer)bb.rewind()).asLongBuffer(); System.out.print("Long Buffer:"); while(lb.hasRemaining()){ System.out.print(lb.position()+" -> "+lb.get()+","); } DoubleBuffer db=((ByteBuffer)bb.rewind()).asDoubleBuffer(); System.out.println(); System.out.print("Double Buffer:"); http://imaginecup.javaeye.com 1.10 java编程思想 IO10 文件操作源码 第 40 / 55 页 while(db.hasRemaining()){ System.out.print(db.position()+" -> "+db.get()+","); } System.out.println(); ShortBuffer sb=((ByteBuffer)bb.rewind()).asShortBuffer(); System.out.print("Short Buffer:"); while(sb.hasRemaining()){ System.out.print(sb.position()+" -> "+sb.get()+","); } System.out.println(); } } package com.dirlist; import java.nio.*; import java.util.Arrays; public class Endians { /** * 字节的存放顺序,不同的机器可能会使用不同的字节排序方法来存储顺序。 * "big endian" 高位优先将最重要的字节存放在地址最低的存储器单元; * "little endian" 低位优先则是将最重要的字节放在地址做搞的存储器单元 * ByteBuffer采用高位优先的形式存储数据 */ 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(Arrays.toString(bb.array())); bb.rewind(); bb.order(ByteOrder.LITTLE_ENDIAN); bb.asCharBuffer().put("abcdef"); System.out.println(Arrays.toString(bb.array())); http://imaginecup.javaeye.com 1.10 java编程思想 IO10 文件操作源码 第 41 / 55 页 } } package com.dirlist; import java.nio.*; public class UsingBuffers { /** * 缓冲区的细节 * Buffer由数据和可以高效的访问及操作这些数据的四个索引组成: * 这四个索引是mark(标记),position(位置),limit(界限),capacity(容量) * flip()将limit设置为position,position设置为0,此方法用来从缓冲区读取已写入的数据 * mark()将mark设置为position * hasRemaining()若有介于position和limit之间的元素,返回true * capacity()返回缓冲区的容量 * clear()清空缓冲区,将position设置为0,limit设置为容量 */ //交换相邻的字符,以对CharBuffer中的字符进行编码和解码 public static void symmetricScramble(CharBuffer buffer){ while(buffer.hasRemaining()){ buffer.mark(); char c1=buffer.get(); char c2=buffer.get(); buffer.reset(); buffer.put(c2).put(c1); } } public static void main(String[] args) { char[] data="UsingBuffers".toCharArray(); ByteBuffer bb=ByteBuffer.allocate(data.length*2); CharBuffer cb=bb.asCharBuffer(); cb.put(data); http://imaginecup.javaeye.com 1.10 java编程思想 IO10 文件操作源码 第 42 / 55 页 System.out.println(cb.rewind()); symmetricScramble(cb); System.out.println(cb.rewind()); symmetricScramble(cb); System.out.println(cb.rewind()); } } http://imaginecup.javaeye.com 1.10 java编程思想 IO10 文件操作源码 第 43 / 55 页 1.11 java编程思想 IO11 源码 内存映射访问与性能 发表时间: 2010-05-08 package com.io; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class LargeMappedFiles { /** * 内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件 */ static int length=0x8FFFFFF;//128MB public static void main(String[] args) throws IOException { //public abstract class MappedByteBufferextends ByteBuffer直接字节缓冲区,其内容是文件的内存映射区域。 //映射的字节缓冲区是通过 FileChannel.map 方法创建的。此类用特定于内存映射文件区域的操作扩展 ByteBuffer 类。 MappedByteBuffer out=new RandomAccessFile("test.dat","rw").getChannel(). map(FileChannel.MapMode.READ_WRITE,0,length); //必须指定映射文件的初始位置和映射区域的长度 for(int i=0;i
还剩54页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

sweetbaybe

贡献于2011-07-04

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf