文档的遍历案例:
//文档遍历案例
@Test
public void test1() {
File e = new File("D:\ceshi\");
File[] files = e.listFiles();//将D盘中的文件放入数组files中
listFiles(files);
}
//找到有没有.png文件
public void listFiles(File[] files) {
if (files != null && files.length >= 0) {
for (File file : files) {
if (file.isFile()) { //如果是一个文件
if (file.getName().endsWith(".png")) {
System.out.println("找到了一个png文件:"+file.getAbsolutePath());
// file.delete();
}
} else {//如果是一个文件夹
File[] files2 = file.listFiles();
listFiles(files2);//递归调用
}
}
}
}
文档过滤器:
//文档遍历案例
@Test
public void test1(){
File e = new File("D:\ceshi\");
listFiles(e);
}
//找到有没有.png文件
public void listFiles(File file){
//创建一个过滤器并描述规则
FileFilter filter = new pngFileFilter();
//通过文件获取子文件夹
File[] files = file.listFiles(filter);//存入的文档通过过滤器的规则存入files数组中
if(files!=null||files.length>0) {
for (File f : files) {
if (f.isDirectory()/*如果是文件夹*/) {
listFiles(f);
} else {
System.out.println("找个一个png文件: " + f.getAbsolutePath());
}
}
}
}
//过滤器
class pngFileFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
if(pathname.getName().endsWith(".png")||pathname.isDirectory()){//如果是文件夹
return true;
}
return false;
}
}
不过上面的方法太麻烦了,可以通过匿名内部类来完成:
@Test
public void test1(){
File e = new File("D:\ceshi\");
listFiles(e);
}
//找到有没有.png文件
public void listFiles(File file){
//通过文件获取子文件夹,存入的文档通过过滤器的规则存入files数组中
File[] files = file.listFiles(new FileFilter(){ //创建一个过滤器并描述规则
@Override
public boolean accept(File pathname) {
if(pathname.getName().endsWith(".png")||pathname.isDirectory()){//如果是文件夹
return true;
}
return false;
}
});
if(files!=null||files.length>0) {
for (File f : files) {
if (f.isDirectory()/*如果是文件夹*/) {
listFiles(f);
} else {
System.out.println("找个一个png文件: " + f.getAbsolutePath());
}
}
}
}
字节流:
FileOutputStream:
FileInputStream:
//字节输入流:FileInputStream
@Test
public void test3() throws IOException {
FileInputStream fis = new FileInputStream("D://a.txt");//ABCDE
while(true){
byte b = (byte)fis.read();
if(b==-1)
break;
System.out.println((char)b);//ABCDE
}
fis.close();
}
来个案例:a.txt文件中有a-z的字母,为什么第三次读入的最后4个字母和上面一行的一样?
每次读的时候删除前面读的数组,然后在填入这次读的数据。最后一次读的时候只有6个数据,所有就读了6个数据然后放在了上次读的前6个位置,如何解决?
byte[] b = new byte[10];//创建一个长度为10的数组
int len = fis.read(b);//把读入的数据的长度保存到len中
System.out.println(new String(b,0,len));
len = fis.read(b);
System.out.println(new String(b,0,len));
len = fis.read(b);
System.out.println(new String(b,0,len));
fis.close();
结果:
字符流
字符输出流:Writer
//字符流输出:Writer
@Test
public void test4() throws IOException {
FileWriter fw = new FileWriter("D://a.txt");
fw.write('a');//删除原来的数据,输出’a‘到文件中
fw.append("窗前明月光");//append(): 追加一段文字
fw.append("窗前明月光").append("疑是地上霜").append("举头望明月");
fw.close();//不关闭流,数据是不会输出到文件中的
}
字符输入流:
//字符流输入:Reader
@Test
public void test5() throws IOException {
FileReader fr = new FileReader("d://a.txt");
while ((true)){
int c = fr.read();
if(c==-1){
break;
}
System.out.println((char)c);
}
}
序列化和反序列化:
//※※序列化和反序列化:
@Test
public void test6() throws IOException, ClassNotFoundException {
//序列化技术:
Book1 b = new Book1("金苹果","描述了苹果种植经历");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://book.txt"));
oos.writeObject(b);
oos.close();
//反序列化技术
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D://book.txt"));
Book1 o = (Book1)ois.readObject();
System.out.println(o.getInfo());
ois.close();
}