IO学习笔记

153 阅读2分钟

文档的遍历案例:

//文档遍历案例
@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个字母和上面一行的一样?

image.png

每次读的时候删除前面读的数组,然后在填入这次读的数据。最后一次读的时候只有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();

结果:

image.png

字符流

字符输出流: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();


}