0. Java的IO通过java.io包下的类和接口来支持, java.io包下主要包括输入和输出两种IO流, 每种输入、输出流又可分为字节流和字符流两大类(字节流以字节来处理输入输出操作, 字符流以字符来处理). 此外, Java的IO流使用了一种装饰器设计模式, 将IO流分成"底层节点流"和"上层处理流", 节点流用于和底层的物理存储节点直接关联--不同的物理节点获取节点流的方式可能存在一定的差异, 但程序可以把不同的物理节点流包装成统一的处理流, 从而允许程序使用统一的输入输出代码来读取不同的物理存储节点的资源.
- Java7在java.nio及其子包下提供了一系列全新的API, 这些API是对原有新IO(NIO)的升级, 因此也被称为NIO2. 通过这些NIO2能更高效地进行输入输出操作.
- String getName(): 返回文件名或路径名(如果是路径, 返回最后一级子路径名).
- String getPath()
- File getAbsoluteFile()
- String getAbsolutePath()
- String getParent(): 返回此File对象所对应目录(最后一级子目录)的父目录名. (当使用相对路径的File对象来获取父路径时可能引起错误, 因为该方法返回将File对象所对
应的目录名、文件名里最后一个子目录名、子文件名删除后的结果.)
- boolean renameTo(File newName)
- boolean exists()
- boolean canWrite()
- boolean canRead():
- boolean isFile()
- boolean isDirectory()
- boolean isAbsolute():判断File对象所对应的文件或目录是否是绝对路径. 在UNIX/Linux/BSD上, 如果路径名开头是一条斜线(/), 表名该File对象对应一个绝对路径; Windows上, 开头是盘符, 则绝对路径.
- long lastModified(): 返回文件的最后修改时间.
- long length(): 返回文件内容的长度.
- boolean createNewFile()
- boolean delete()
- static File createTempFile(String prefix, String suffix): 在默认的临时文件目录中和创建一个临时空文件, 使用给定的前缀、系统生成的随机数和给定后缀作为文件名. prefix参数至少是三个字节长. suffix参数指定后缀(形如".txt"), 可以为null, 此时将使用默认的后缀".tmp".
- static File createTempFile(String prefix, String suffix, File directory)
- void deleteOnExit(): 注册一个删除钩子, 指定当Java虚拟机退出时, 删除File对象所对应的文件和目录.
-boolean mkdir(): 试图创建一个File对象所对应的目录. 调用该方法时File对象必须对应一个路径(不是文件).
- String[] list(): 列出File对象的所有子文件名和路径名.
public String[] list(FilenameFilter filter)
- File[] listFiles(): 列出File对象的所有子文件和路径.
- static File[] listRoots(): 列出系统所有的根路径(就是所有盘符).
import java.io.*; public class FileTest { public static void main(String[] args) throws IOException { File file = new File("."); System.out.println(file.getName()); System.out.println(file.getParent()); System.out.println(file.getAbsoluteFile().getParent()); File tmpFile = File.createTempFile("aaa", ".txt", file); tmpFile.deleteOnExit(); File newFile = new File(System.currentTimeMillis() + ""); System.out.println(newFile.exists()); newFile.createNewFile(); newFile.mkdir(); // ? 以newFile对象创建一个目录, 因为newFile已经存在所以无法创建该目录 String[] fileList = file.list(); for (String fileName: fileList) { System.out.println(fileName); } File[] roots = File.listRoots(); for (File root: roots) { System.out.println(root); } } }
// 列出当前路径下所有文件夹, 和以".java"结尾的文件 import java.io.*; public class FilenameFilterTest { public static void main(String[] args) { File file = new File("."); String[] nameList = file.list(new MyFilenameFilter()); for (String name : nameList) { System.out.println(name); } } } class MyFilenameFilter implements FilenameFilter { public boolean accept(File dir, String name) { return name.endsWith(".java") || new File(name).isDirectory(); } }2. Java的IO流
- 输入流: 只能从中读取数据, 不能写入.
- 输出流
# 划分输入/输出是从程序运行所在的内存的角度来考虑的.
# Java的输入流主要由InputStream和Reader作为基类, 输出流主要以OutputStream和Writer作为基类. (他们都是抽象类. 可以用FileInputStream/FileReader/FileOutputStream/FileWriter创建实例.)
# 用法几乎完全一样, 但字节流操作的数据单元是8位的字节, 字符流操作的数据单元是16位的字符.
# 字节流主要由InputStream和OutoutStream作为基类, 字符流以Reader和Writer.
- 节点流是可以从一个特定的IO设备读/写数据的流, 使用节点流是程序直接连接到实际的数据源. 节点流也叫低级流(Low Level Stream).
- 处理流用于的对一个已存在的流进行连接或封装, 通过封装后的流来实现读/写功能. 处理流也叫高级流.
# 使用处理流时程序不会直接连接到实际的数据源, 没有和实际的输入/输出节点连接.
# Java用处理流来包装节点流是"装饰器设计模式", 可以消除不同节点流的实现差异, 也能提供更方便的方法来完成输入/输出功能. 所以处理流也叫包装流.
- int read(): 从输入流读取单个字节, 返回所读取的字节数据(字节数据可直接转换成int类型).
- int read(byte[] b): 从输入流最多读取b.length个字节的数据, 并将其存储在字节数组b中, 返回实际读取的字节数.
- int read(byte[] b, int off, int len): 从输入流的off位置开始最多读取len个字节的数据, 并将其存储在数组b中. 返回实际读取的字节数.
- int read(): 字符数据可直接转换成int类型.
- int read(char[] cbuf)
- int read(char[] cbuf, int off, int len)
- void mark(int readAheadLimit): 在记录指针当前位置记录一个标记(mark).
- boolean markSupported(): 是否支持标记.
- void reset(): 将此流的记录指针重新定位到标记(mark)位置.
- long skip(long n): 记录指针向前移动你个字节/字符.
- void write(int c): 将指定的字节/字符输出到输出流中.
- void write(byte[]/char[] buf)
- void write(byte[]/char[] buf, int off, int len):将字节数组/字符数组中从off位置开始, 长度为len的字节/字符输出到输出流中.
//用PrintStream处理流包装OutputStream import java.io.*; public class PrintStreamTest { public static void main(String[] args) { try( FileOutputStream fos = new FileOutputStream("test.txt"); PrintStream ps = new PrintStream(fos)) { ps.println("normal string. "); ps.println(new PrintStreamTest()); } catch (IOException ioe) { ioe.printStack
Java的字符串是一个预定义的类型,也就是说一个字符串并不是一个数组,而是一个对象。需要注意的是,java的字符串是一个不可修改的字符串,所有对他的修改最后都生成了新的字符串。同时String类也是一个final类,所以不可对String类进行继承,来借以对它进行修改。如果要修改字串本身,可以采用StringBuilder(StringBuffer)对象。
一般,我们常用substring、StringTokenizer来分解字符串,StringTokenizer类实现了迭代器模式和枚举接口。
StringTokenizerst = new StringTokenizer("wang xiaohu, is a good man!","!,"); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); }
参数" !,"指定了字符串分割符,如果没有这个参数,字符串以空格为分隔符,分割后的字符串包括标点符号。在使用+号连接字符串时,编译器将自动构建一个StringBuiler对象,并且调用其append方法。StringBuilder对象在使用时,其所有的操作都是返回本身,这样对效率影响比较低。
使用堆栈来翻转字符串的方法为:
StringTokenizerst = new StringTokenizer("wang xiaohu, is a good man!","!,"); Stack s = new Stack(); while (st.hasMoreTokens()) { s.push(st.nextElement()); } while (!s.empty()) { System.out.print(s.pop()+""); }
正则表达式已经被列入Java1.4之后的运行环境,其语法不再赘述。使用方法为:1.测试模式,测试更定字符串是否符合正则表达式。2.查找匹配文本。3.替换匹配文本。例程如下:
1. 测试模式,测试更定字符串是否符合正则表达式。
"g8".matches("^g[a-zA-Z0-9]$")
2. 查找匹配文本
Pattern p =Pattern.compile("(.*), (.*)"); Matcher m = p.matcher("Smith,John Adams, John quincy"); System.out.println(m.groupCount()); if(m.find()) { System.out.println(m.group(1)+m.group(2)); }
3.替换匹配文本。一般文本编辑器命令中,左手边是替换模式,右手边是替换文本。
参考文章
1. JavaCookbook-1.编译、运行和调试
众所周知,Windows Phone 8 模拟器运行,必须开启hyper-v。最开始我安装的顺序是 VMware--->Win8--->WP8 SDK--->开启VMware的设置、处理器和内存、高级选项,选中“在此虚拟机中启用虚拟化管理程序”。但此步骤却不能正常开启hyper-v。
于是乎搜索网上各种教程,也问了几个大神。最后终于搞定,现在将我的操作步骤贴出来,希望能给有此需求的朋友一个借鉴。
步骤1、安装VMware Fusion(我装的版本是5.0.1)
步骤2、安装Windows 8(我装的是专业版),装好后将虚拟机内的Win8系统关闭。
步骤3、找到VMware的“虚拟机资源库”,
,
步骤4、右击你的资源,并点击“在Finder中显示”
步骤5、找到虚拟系统的资源后,右击--->显示包内容
步骤6、找到 "文件名.vmx" 文件后,右击--->打开方式--->文本编辑
步骤7、讲以下两行内容添加进去,并保存。(注意看看原文件内是否又以下内容,别加重复了)
hypervisor.cpuid.v0 = "FALSE"
vhv.enable = "TRUE"
步骤8、打开VMware的设置--->处理器和内存--->高级选项--->选中“在此虚拟机中启用虚拟化管理程序”。(最好处理器选成“2个处理器核心”,并分配4G内存)步骤9、重新运行模拟器,并将WIndows8的Hyper-v打开:控制面板--->程序和功能--->启用或关闭Windows功能--->选中Hyper-V。
步骤10、安装Windows Phone 8的SDK,之后再试试。看看能不能运行WP8的模拟器了……
OK。至此,也就完成了!屌丝的逆袭啊!!!哈哈……这里要多些各位大神的帮助哦.
附几个我参考的网址
http://www.dotblogs.com.tw/jasonyah/archive/2012/11/08/80959.aspx
http://www.dotblogs.com.tw/chou/archive/2012/11/06/80545.aspx
http://vniklas.djungeln.se/2012/04/23/windows-server-2012-8-beta-hyper-v-enabled-inside-a-vmware-fusion-vm/
http://www.veeam.com/blog/nesting-hyper-v-with-vmware-workstation-8-and-esxi-5.html