------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、File类
1、File类概述
该类对文件系统的中的文件以及文件夹进行对象的封装,方便对文件文件夹的属性信息如文件名、创建修改时间、大小、可读可写属性等进行操作,File对象可以作为参数传递给流的构造函数
File f1 = new file(“c:\\aaa\\a.txt”);
File f2 = new File(“c:\\aaa”,”b.txt”);
File d = new File(“c:\\abc”);
File f3 = new File(d,”c.txt”);
名称分隔符
C:\\aaa\\eds.txt 同 “C:”+ File.separator+”abc”++ File.separator+“aaa.txt”
2、File类常见方法:
1)创建
boolean createNewFile();在指定位置创建文件,如果该文件已经存在则不创建返回false,和输出流不一样,输出流对象一建立
boolean mkdir()创建文件夹
boolean mkdirs()创建多级文件夹
2)删除
boolean delete();删除失败返回false
Void deleteOnExit();在程序退出时删除指定文件
3)判断
boolean canExcause();是否可以执行
canRead();
canWrite();
boolean exist();
Boolean isFile();是否是文件,不存在为false,判断是文件或文件夹时必须判断是否存在exist();
Boolean isDirectory()是否是目录
Boolean isHidden() 是否是隐藏文件
Boolean isAbsolute();是否是绝对路径
4)获取信息
getName();
getPatn();获取相对路径
getParent();获取父目录,该方法返回new File()里的文件上一级目录
getAbsolutePath();获取绝对路径返回值可以是String 或File类
lastModified();最后修改时间
long Length();
5)移动 renameTo()例把“C:\\a.txt”) 移动到“D:\\a.txt”
File a = new File(“C:\\a.txt”);
File b = new File(“D:\\a.txt”);
a.renameTo(b);
例:递归方法列出目录下所有内容:
Public static void main(String[] args)
{
File dir = new File(“D:\\JAVA基础视频”);
showDir(dir);
}
Public static void showDir(File dir)
{
System.out.println(dir);
File[] files = dir.listFiles();
For(int x= 0;x<files.length;x++)
{
if(file[x].isDirectory())
showDir(files[x]);
else
System.out.println(files[x]);
}
}
删除带内容的目录:
原理:windows删除从里到外删除
Public static void removeDir(File dir)
{
File[] files = dir.listFiles();
For(int x=0;x<files.length;x++)
{
if(files[x].isHidden()&&files[x].isDirectory())
removeDir(files[x]);
}
}
二、其他流介绍
1、序列流
构造函数
SequenceInputStream(InputStream s1, InputStream s2)
SequenceOutputStream(OutputStream s1, OutputStream s2)
例:合并多个流:
public static void hebingSequenceInputStream() throws Exception {
InputStream in1 = new FileInputStream("c:/a.txt");
InputStream in2 = new FileInputStream("c:/b.txt");
InputStream in3 = new FileInputStream("c:/c.txt");
LinkedHashSet<InputStream> set = new LinkedHashSet<InputStream>();
set.add(in1);
set.add(in2);
set.add(in3);
final Iterator<InputStream> iter = set.iterator();
SequenceInputStream sin = new SequenceInputStream(
new Enumeration<InputStream>() {
@Override
public boolean hasMoreElements() {
return iter.hasNext();
}
@Override
public InputStream nextElement() {
return iter.next();
}
});
FileOutputStream out = new FileOutputStream("c:/z.txt");
for (int b = -1; (b = sin.read()) != -1;) {
out.write(b);
}
sin.close();
out.close();
}
例:切割文件 FileInputStream fis = new FileInputStream(“C:\\123.bmp”);
FileOutputStream fos = null;
Byte[] buf = new byte[1024*1024];
Int len = 0;
Int count =1;
While(len = fis.read(buf)!=-1)
{
Fos = new FileOutputStream((count++) +“.txt”);
Fos.write(buf,0,len);
Fos.close();
}
Fis.close();
2、对象的序列化
对象的序列化:将内存中的对象直接写入到文件设备中 ;对象的反序列化: 将文件设备中持久化的数据转换为内存对象。
ObjectInputStream ObjectOutputStream
存
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“abc.txt”))
oos.writeObject(new Person(“lisi”,39));
oos.close();
读
ObjectInputStream ois = new ObjectInputStream (new FileInputStream(“abc.txt”))
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
注:需要被序列化的类必须是实现Serializable接口,该接口中没有描述任何的属性和方法,称之为标记接口。如果对象没有实现接口Serializable,在进行序列化时会抛出:NotSerializableException 异常。
3、Properties
Properties 是hashtable的子类,可用于键值对形式的配置文件也就是说它具备map集合的特点.Properties:该集合不需要泛型,因为该集合中的键值对都是String类型。
Map
|--Hashtable
|--Properties
Properties常用方法:
1)存入键值对:setProperty(key,value);
Properties prop = new Properties();
prop.setProperty(“zhangsan”,”30”);
2)获取指定键对应的值value getProperty(key);
String value = prop.getProperty(“lisi”);
3)获取集合中所有键元素:Enumeration propertyNames();
在jdk1.6版本给该类提供一个新的方法。
Set<String> names = prop.stringPropertyNames();
For(String s:names)
{
String s = prop.getProperty(s);
]
4)列出该集合中的所有键值对,可以通过参数打印流指定列出到的目的地。
list(PrintStream);
list(PrintWriter);
5)可以将流中的规则数据加载进行集合,并称为键值对。
load(InputStream):
jdk1.6版本。提供了新的方法load(Reader):
6,可以将集合中的数据进行指定目的的存储。
store(OutputStram,String comment)方法。
jdk1.6版本。提供了新的方法 store(Writer ,String comment);使用该方法存储时,会带着当时存储的时间。
4、打印流
1,字节打印流PrintStream,System.out对应的类型就是PrintStream。
它的构造函数可以接收三种数据类型的值。
1)字符串路径。
2)File对象。
3)OutputStream。
打印流的三种方法
void print(数据类型 变量)
println(数据类型 变量) 提供换行,自动刷新
printf(String format, Object... args) 可以自定数据格式
JDK1.5之后Java对PrintStream进行了扩展,增加了格式化输出方式,可以使用printf()重载方法直接格式化输出。但是在格式化输出的时候需要指定输出的数据类型格式。
2、PrintWriter是一个字符打印流。
构造函数可以接收四种类型的值。对于1,2类型的数据,还可以指定编码表。也就是字符集。对于3,4类型的数据,可以指定自动刷新。
1,字符串路径。
2,File对象。
3,OutputStream
4,Writer
注意:该自动刷新值为true时,只有三个方法可以用:println,printf,format.
PrintWrter pw = newPrintWriter(new BufferdWriter(new OutputSteamWriter(newFileOutputStream("a.txt"),"utf-8")),true);
5、 操作数组的流对象
1)字节数组 ByteArrayInputStream以及ByteArrayOutputStream
toByteArray();
toString();
writeTo(OutputStream);
2)字符数组 CharArrayReader以及CharArrayWriter
对于这些流,源是内存。目的也是内存。而且这些流并未调用系统资源。使用的就是内存中的数组。所以这些在使用的时候不需要close。
注:操作数组的读取流在构造时,必须要明确一个数据源。所以要传入相对应的数组。
对于操作数组的写入流,在构造函数可以使用空参数。因为它内置了一个可变长度数组作为缓冲区。
6、操作基本数据类型的流对象
DataInputStream 从数据流读取字节,并将它们转换为正确的基本数据类型值或字符串。
DataOutputStream 将基本类型的值或字符串转换为字节,并且将字节输出到数据流。
1)DataInputStream类继承FilterInputStream类,并实现了DataInput接口。
DataInputStream
操作基本数据类型的方法:
int readInt():一次读取四个字节,并将其转成int值。
boolean readBoolean():一次读取一个字节。
short readShort();
long readLong();
String readUTF():按照utf-8修改版读取字符。注意,它只能读writeUTF()写入的字符数据。
2)DataOutputStream(OutputStream):
操作基本数据类型的方法:
writeInt(int):一次写入四个字节。write(int)只将该整数的最低一个8位写入。剩余三个8位丢弃。
writeBoolean(boolean);
writeShort(short);
writeLong(long);
writeUTF(String):按照utf-8修改版将字符数据进行存储。只能通过readUTF读取。