String[] list()和 File[] listFiles()的区别:
String[] list()这个方法返回的是当前目录下的文件以及文件夹名称,他只有名称
File[] listFiles() 这个方法往回返的是当前目录下的文件以及文件夹的对象, 这里边得到的是对象我们可以通过getName()获得名称也可以getPath获取路径,在开发用这个比较好,里边的信息都能获得到。
递归思想:
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。
递归要注意:
1,限定条件。
2,要注意递归的次数。尽量避免内存溢出。
class File
{
public static void main(String[] args)
{
要注意的是:递归的话必须在这里建立对象。
File dir= new File("D:\\myjava");
int num = getSum(100);如果这里等于一万就内存溢出。因为栈内存满了
System.out.println("num="+num);
}
public static int getSum(int num)
{
if (num==1)
return 1;
return num+getSum(num-1);
}
}
主函数调用 showA(); 这就是递归
void showA()
{
showB();
System.out.println("A");
}
void showB()
{
showC();
System.out.println("B");
}
void showC()
{
System.out.println("C");
}
Properties
Properties是hashtable的子类。也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。不需要泛型。是集合中和IO技术相结合的集合容器。该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时,需要数据有固定格式:键=值。
凡是文档中前边加井号的都是注释信息不会被Properties加载。Properties加载的信息必须是键值对。
能够读取对象的读写流
用了ObjectOutputStream就必须用ObjectInputStream 读出来他们俩要成对出现,这可以直接对对象进行读写。
这个对象必须被序列化。静态是不能被序列化的。
ObjectOutputStreamoos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.writeObject(newPerson("lisi",30));把对象写入到硬盘上,是数据持久化
ObjectInputStreamois = new ObjectInputStream(new FileInputStream("obj.txt"));
Person p = (Person)ois.readObject();从硬盘上读取对象,并取出对象,很方便
System.out.println(p);
他们俩要成对出现,用了ObjectOutputStream 就必须用ObjectInputStream 读出来
随即读写流:
随机读取访问,优点是可以分段读写数据。
raf.seek();调整对象中的指针位置来进行指定的数据读取和写入,数据分段用处很大。
RandomAccessFileraf = new RandomAccessFile("ran.txt","r");
该类不是算是IO体系中子类。而是直接继承自Object。但是它是IO包中成员。因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。其实完成读写的原理就是内部封装了字节输入流和输出流。
用于操作字节数组的流对象。
ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。
ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
数据源
ByteArrayInputStream bis = newByteArrayInputStream("美女".getBytes());
数据目的 发现源和目的都在内存中
ByteArrayOutputStream bos = newByteArrayOutputStream();
可以用于操作基本数据类型的数据的流对象:DataInputStream与DataOutputStream
DataInputStreamdis = new DataInputStream(new FileInputStream("abcd.txt"));
DataOutputStreamdos = new DataOutputStream(new FileOutputStream("utfdate.txt"));
这里边有操作基本数据类型的功能读Int写Int等等,那么他的作用在于,把基本数据类型和流相结合,他能操作基本数据类型,所以构造函数要传递一个流进来。要传字节流因为Data* 他是字节流的小弟。
编码:字符串变成字节数组
解码:字节数组变成字符串
String -->byte[]: str.getBytes();指定编码表str.getBytes(charsetName);
byte[] -->String: new String(byte[]);指定编码表new String(byte[],charsetName); new一个对象就行了
知识点:当用GBK或者UTF-8编码,而用ISO8859-1解码失败的时候,是可以通过重新对失败的文件进行在进行编码,之后再解码一次就OK了。
但是当用GBK或者UTF-8编码,而用UTF-8或者Gbk解码失败的时候,不能通过重新对失败的文件进行在进行编码,因为这两种编码集都识别中文。utf-8和gbk都识别中文,但是同一个中文在这两个表中的代表的编码是不一样的,gbk编码是两个字节代表一个字。u8编码是三个字节代表一个字。
|