-------android培训、java培训、期待与您交流! ----------
.File类(java.io包):
1)用来将文件或者文件夹封装成对象
2)方便对文件与文件夹的属性信息进行操作。//流只能操作数据。
3)File对象可以作为参数传递给流的构造函数。
4)了解File类中的常用方法。
2.深入介绍File类
1)<1>文件和目录路径名的抽象表示形式。
用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录
<2>文件系统可以对一个对象设置多个访问权限。例如,一个设置可能适用于对象的所有者,
另一个设置则可能适用于所有其他用户。对象上的访问权限可能导致此类的某些方法执行失败
<3>File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
2)字段摘要:
separator-----跨平台的目录分隔符
public static final String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
此字符串只包含一个字符,即 separatorChar。
3)构造函数:
<1>public File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
如果给定字符串是空字符串,那么结果是空抽象路径名。
参数:
pathname - 路径名字符串
抛出:
NullPointerException - 如果 pathname 参数为 null
<2>public File(String parent,
String child)根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
如果 parent 为 null,则创建一个新的 File 实例,
这与调用以给定 child 路径名字符串作为参数的单参数 File 构造方法效果一样。
否则,parent 路径名字符串用于表示目录,child 路径名字符串用于表示目录或文件。
如果 child 路径名字符串是绝对路径名,则用与系统有关的方式将它转换为一个相对路径名。
如果 parent 是空字符串,则通过将 child 转换为抽象路径名,并根据与系统有关的默认目录解析结果
来创建新的 File 实例。否则,将每个路径名字符串转换为一个抽象路径名,
并根据父抽象路径名解析子抽象路径名。
参数:
parent - 父路径名字符串
child - 子路径名字符串
抛出:
NullPointerException - 如果 child 为 null
<3>public File(File parent,String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
如果 parent 为 null,则创建一个新的 File 实例,
这与调用给定 child 路径名字符串的单参数 File 构造方法的效果一样。
02-IO流(File对象功能)
File类常见方法:
1.创建:
boolean createNewFile()
throws IOException
在指定位置创建文件,如果该文件已经存在,则不创建,返回false.
和输出流不一样,输出流对象一建立创建文件,而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2.删除:
<1>boolean delete()
删除此抽象路径名表示的文件或目录。 删除失败返回false.
<2>void deleteOnExit()
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。在程序退出时删除指定文件。
注意:若前面的代码发生异常,则此时后面的删除操作就执行不到,此时就会产生垃圾。
就算是在finally中删除有时也未必有效。因为正在被流操作的文件会报提示无法删除。
此时用deleteOnExit()退出时删除方法就很容易解决这个问题了。
3.判断:
<1>boolean canExecute()
测试应用程序是否可以执行此抽象路径名表示的文件。
<2>boolean canRead()
测试应用程序是否可以读取此抽象路径名表示的文件。
<3>boolean canWrite()
测试应用程序是否可以修改此抽象路径名表示的文件。
<4>int compareTo(File pathname)
按字母顺序比较两个抽象路径名。
<5>boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
<6>boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。
<7>boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
<8>boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
<9>boolean isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。
注意:文件夹也可能叫a.txt
4.获取信息:
<1>String getName()
返回由此抽象路径名表示的文件或目录的名称。
<2>String getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
<3>File getParentFile()
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
<4>String getPath()
将此抽象路径名转换为一个路径名字符串。
<5>String getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
<6>long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。
<7>long length()
返回由此抽象路径名表示的文件的长度。
<8>boolean renameTo(File dest)
重新命名此抽象路径名表示的文件。
5.文件列表
文件列表功能:
1)static File[] listRoots()
列出可用的文件系统根。
2)String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
3)String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
6.文件列表2:
1)String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
2)File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
3)File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
4)File[] listFiles(FilenameFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
03.IO流(列出目录下所有内容-递归)
1.需求:
列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。
2.递归:
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
3.递归要注意:
1)限定条件。
2)要注意递归的次数。尽量避免内存溢出。
4.原理分析:
如图:
Day20-07-递归原理分析图
Day20-07-递归原理2--求和演示
04.IO流(练习:创建java文件列表)
1.练习:
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表文件。
2.思路:
1)对指定的目录进行递归。
2)获取递归过程所有的java文件的路径。
3)将这些路径存储到集合中。
4)将集合中的数据写入到一个文件中。
05.IO流(Properties简述)
1.Map ---> Hashtable---->Properties类(java.util包)
1)Properties是Hashtable的子类。
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。
但在加载数据时,需要数据有固定格式:键=值。
2)构造方法:
Properties()
创建一个无默认值的空属性列表。
Properties(Properties defaults)
创建一个带有指定默认值的空属性列表。
3)方法:
<1>String getProperty(String key)
用指定的键在此属性列表中搜索属性。
<2>String getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性。
<3>Object setProperty(String key, String value)
调用 Hashtable 的方法 put。
<4>Set<String> stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,
如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
06.IO流(Properties存取配置文件)
1.Properties的方法:
1)void list(PrintStream out)
将属性列表输出到指定的输出流。
2)void list(PrintWriter out)
将属性列表输出到指定的输出流。
3)void load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。
4)void load(Reader reader)
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
5)void store(OutputStream out, String comments)//comments为注释
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,
将此 Properties 表中的属性列表(键和元素对)写入输出流。
6)void store(Writer writer, String comments)
以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)
写入输出字符。
2.演示:
如何将流中的数据存储到集合中。
想要将info.txt中键值数据存到集合中进行操作。
1)用一个流和info.txt文件关联。
2)读取一行数据,将该行数据用“=”进行切割。
3)等号左边作为键,右边作为值。存入到Properties集合中即可。
07.IO流(Properties练习)
1.需求:
用于记录应用程序运行次数。
如果使用次数已到,那么给出注册提示。
2.分析:
很容易想到的是:计数器。
可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。
可是随着该应用程序的退出,该计数器也在内存中消失了。
下一次再启动该程序,又重新开始从0计数。
这样不是我们想要的。
程序即使结束,该计数器的值也存在。
下次程序启动在会先加载该计数器的值并加1后再重新存储起来。
所以要建立一个配置文件。用于记录该软件的使用次数。
该配置文件使用键值对的形式。
这样便于阅读数据,并操作数据。
键值对数据是map集合。
数据是以文件形式存储,使用io技术。
那么map+io -->properties.
配置文件可以实现应用程序数据的共享。
3.补充:
配置文件有两种:
1)以“.properties”结尾的。
如:name=zhangsan
age=20;
2)以".xml"结尾的
如:
<persons>
<person id="001">
<name>zhangsan</name>
<age>30</age>
<address>bj</address>
</person>
<person>
<name>lisi</name>
</person>
</persons>
4. 注意:
所以要想使用某个软件不续费而继续使用的话,可以删除配置文件即可,
如果配置文件放在了C:\WINDOWS\sytem32中,则删除也无用。
08.IO流(PrintWriter)
1.IO包中的其他类
1)打印流
PrintWriter与PrintStream
可以直接操作输入流和文件。
2)序列流
SequenceInputStream
对多个流进行合并。
3)操作对象
ObjectInputStream与ObjectOutputStream
被操作的对象需要实现Serializable(标记接口);
2.打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
1)字节打印流:
PrintStream
构造函数可以接收的参数类型:
<1>file对象。File
<2>字符串路径。String
<3>字节输出流。OutputStream
2)字符打印流:
PrintWriter
构造函数可以接收的类型:
<1>file对象。File
<2>字符串路径。String
<3>字节输出流。OutputStream
<4>字符输出流。Writer.
3.Writer ---> PrintWriter类(java.io)
1)向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。
它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format
的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。
这些方法使用平台自有的行分隔符概念,而不是换行符。
此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。
客户端可能会查询调用 checkError() 是否出现错误。
2)字段摘要
protected Writer out
此 PrintWriter 的底层字符输出流。
3)构造方法摘要
<1>PrintWriter(File file)
使用指定文件创建不具有自动行刷新的新 PrintWriter。
<2>PrintWriter(OutputStream out)
根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
<3>PrintWriter(OutputStream out, boolean autoFlush)
通过现有的 OutputStream 创建新的 PrintWriter。
<4>PrintWriter(String fileName)
创建具有指定文件名称且不带自动行刷新的新 PrintWriter。
<5>PrintWriter(Writer out)
创建不带自动行刷新的新 PrintWriter。
<6>PrintWriter(Writer out, boolean autoFlush)
创建新 PrintWriter。
4)特有方法:
void println(Object x)
打印 Object,然后终止该行。
4.注意:
System.out ---- PrintStream(OutputStream的子类)
System.in ----- InputStream
09.IO流(合并流)
InputStream ---> SequenceInputStream类(java.io包)
1)SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,
并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,
直到到达包含的最后一个输入流的文件末尾为止。
2)构造方法摘要
<1>SequenceInputStream(Enumeration<? extends InputStream> e)
通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。
<2>SequenceInputStream(InputStream s1, InputStream s2)
通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。
3)方法摘要
<1>int available()
返回不受阻塞地从当前底层输入流读取(或跳过)的字节数的估计值,方法是通过下一次调用当前底层输入流的方法。
<2>void close()
关闭此输入流并释放与此流关联的所有系统资源。
<3>int read()
从此输入流中读取下一个数据字节。
<4>int read(byte[] b, int off, int len)
将最多 len 个数据字节从此输入流读入 byte 数组。
10.IO流(切割文件)
合并文件的时候,要用到集合,而Vector的效率太低,所以选择用ArrayList.
读取里要用用序列流SequenceInputStream.但该序列流要传入枚举类型的参数。
而枚举是Vector中的方法,ArrayList 中没有枚举方法,只有相似的Iterator迭代器
。故可建立枚举的匿名类,复写类中的方法以返回调用Iterator的方法即可。
注:匿名内部类访问的局部变量要用final修饰。