黑马程序员——IO(二)File类,其它IO类

java.io.File类
1.凡是与输入、输出相关的类、接口等都定义在java.io包下
2.File是一个类,可以有构造器创建其对象。此对象对应着一个文件(.txt .avi .doc .ppt .mp3 .jpg)或文件目录
3.File类对象是与平台无关的。
4.File中的方法,仅涉及到如何创建、删除、重命名等等。只要涉及文件内容的,File是无能为力的,必须由io流来完成。
5.File类的对象常作为io流的具体类的构造器的形参。

File类的常用方法:
createNewFile();创建文件
delete();删除文件
mkDir():创建一个文件目录。只有在上层文件目录存在的情况下,才能返回true
mkDirs():创建一个文件目录。若上层文件目录不存在,一并创建
list()列出文件名称
listFiles(),列出文件
路径:
绝对路径:包括盘符在内的完整的文件路径
相对路径:在当前文件目录下的文件的路径

File dir1 = new File(“D:/IOTest/dir1”);
if (!dir1.exists()) { // 如果D:/IOTest/dir1不存在,就创建为目录
dir1.mkdir(); }
// 创建以dir1为父目录,名为”dir2”的File对象
File dir2 = new File(dir1, “dir2”);
if (!dir2.exists()) { // 如果还不存在,就创建为目录
dir2.mkdirs(); }
File dir4 = new File(dir1, “dir3/dir4”);
if (!dir4.exists()) {
dir4.mkdirs();
}
// 创建以dir2为父目录,名为”test.txt”的File对象
File file = new File(dir2, “test.txt”);
if (!file.exists()) { // 如果还不存在,就创建为文件
file.createNewFile();}

示例:

public class TestFile {
    /*
     *  createNewFile()
        delete()
        mkDir():创建一个文件目录。只有在上层文件目录存在的情况下,才能返回true
        mkDirs():创建一个文件目录。若上层文件目录不存在,一并创建
        list()
        listFiles()
     */
    @Test
    public void test3() throws IOException{
        File file1 = new File("d:/io/helloworld.txt");
        System.out.println(file1.delete());

        if(!file1.exists()){
            boolean b = file1.createNewFile();
            System.out.println(b);
        }

        File file2 = new File("d:\\io1\\io2");
        if(!file2.exists()){
            boolean b = file2.mkdirs();
            System.out.println(b);
        }

        File file3 = new File("d:\\teach");
        String[] strs = file3.list();
        for(int i = 0;i < strs.length;i++){
            System.out.println(strs[i]);
        }

        System.out.println();

        File[] files = file3.listFiles();
        for(int i = 0;i < files.length;i++){
            System.out.println(files[i].getName());
        }
    }

    /*
     *  exists()
        canWrite()
        canRead()
        isFile()
        isDirectory()
        lastModified()
        length()

     */
    @Test
    public void test2(){
        File file1 = new File("d:/io/helloworld.txt");
        File file2 = new File("d:\\io\\io1");

        System.out.println(file1.exists());
        System.out.println(file1.canWrite());
        System.out.println(file1.canRead());
        System.out.println(file1.isFile());
        System.out.println(file1.isDirectory());
        System.out.println(new Date(file1.lastModified()));
        System.out.println(file1.length());

        System.out.println();

        System.out.println(file2.exists());
        System.out.println(file2.canWrite());
        System.out.println(file2.canRead());
        System.out.println(file2.isFile());
        System.out.println(file2.isDirectory());
        System.out.println(new Date(file2.lastModified()));
        System.out.println(file2.length());

    }

    /*
     * 路径:
     * 绝对路径:包括盘符在内的完整的文件路径
     * 相对路径:在当前文件目录下的文件的路径
     * 
     *  getName()
        getPath()
        getAbsoluteFile()
        getAbsolutePath()
        getParent()
        renameTo(File newName)

     */
    @Test
    public void test1(){
        File file1 = new File("d:/io/helloworld.txt");
        File file2 = new File("hello1.txt");

        File file3 = new File("d:\\io\\io1");
        File file4 = new File("d:\\io2");

        System.out.println(file1.getName());
        System.out.println(file1.getPath());
        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getParent());
        System.out.println(file1.getAbsolutePath());

        System.out.println();

        System.out.println(file3.getName());
        System.out.println(file3.getPath());
        System.out.println(file3.getAbsoluteFile());
        System.out.println(file3.getParent());
        System.out.println(file3.getAbsolutePath());

        //renameTo(File newName):重命名
        //file1.renameTo(file2):file1重命名为file2.要求:file1文件一定存在,file2一定不存在
        boolean b = file1.renameTo(file2);
        System.out.println(b);

        boolean b1 = file4.renameTo(file3);
        System.out.println(b1);
    }
}

使用File的方法,删除文件夹
思路:
删除带内容的目录,在windows中,删除目录,从里面往外删除的就是需要用到递归。
递归简单来说就是自己调用自己
代码:

/*
 * 指定一个文件夹,删除该文件夹的内容和文件夹
 */
public class RemoveDemo {
    public static void main(String[] args){
        File f=new File("G:\\dddd");
        removeDir(f);
    }
    public static void removeDir(File dir){//自定义删除方法
        File[] file=dir.listFiles();//获取文件列表
        for (File f:file){
            //遍历文件列表,如果是目录,则递归
            if (f.isDirectory())
                removeDir(f);
            else
            //不是目录则删除文件
                System.out.println(f.toString()+"--"+f.delete());
        }
        System.out.println(dir+"--"+dir.delete());
    }
}

示例
将一个指定Java文件的绝对路径,存储到一个文本文件中
建立一个java文件列表
思路:
最指定目录文件递归
获取递归过程中所有java文件的路径
将这些路径存储到集合中
将集合中的数据写入文件中

 * 
 *
 */
public class JavaFileList {
    public static void main(String[] args){
        File dir=new File("F:\\360Downloads\\Software");
        ArrayList<File> list=new ArrayList<File>();
        fileToList(dir, list);
        System.out.println(list);
        File fi=new File("E:\\ExeList.txt");
        fileToWrite(list,fi);
    }
    public static void fileToList(File dir,ArrayList<File> list){
        File[] file=dir.listFiles();
        for (File f:file){
            if (f.isDirectory())
                fileToList(f,list);
            else {
                if (f.getName().endsWith(".exe"))
                    list.add(f);
            }
        }
    }
    public static void fileToWrite(ArrayList<File> list,File f){
        BufferedWriter bufw=null;
        try {
            bufw=new BufferedWriter(new FileWriter(f));
            for (File fe:list){
                bufw.write(fe.getAbsolutePath());
                bufw.newLine();
                bufw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (bufw!=null)
                try {
                    bufw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}

管道流:
PipedInputStreamhe PipeOutStream
可以将读取流和输出流链接
示例:

public class PipedRead implements Runnable {
    private PipedInputStream in;
    public PipedRead(PipedInputStream in) {
        this.in = in;
    }

    @Override
    public void run() {
        byte[] buf=new byte[1024];
        int len=0;
        try {
            len=in.read(buf);
            String s=new String(buf,0,len);
            System.out.println(s);
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public class PipedWrite implements Runnable {
    private PipedOutputStream out;//管道输出流
    public PipedWrite(PipedOutputStream out) {
        this.out = out;
    }
    @Override
    public void run() {
        try {
            out.write("数据来了:".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
public class PipedDemo {
    public static void main(String[] args) throws IOException { PipedOutputStream out=new PipedOutputStream();
        PipedInputStream in=new PipedInputStream();
        in.connect(out);//将管道输出流,读取流链接
        PipedWrite pw=new PipedWrite(out);
        PipedRead pr=new PipedRead(in);

        Thread t1=new Thread(pw);
        Thread t2=new Thread(pr);
        t1.start();
        t2.start();
    }

}

RandomAccessFile
该类本不算是IO体系中的子类,直接继承自Object,但他是IO包中成员,因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组元素操作,通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置,其实完成读写的原理就是内部疯转了字节输入流,和字节输出流。
通过构造函数看出,该类只能操作文件,而且要传入操作的mode(人r,rw,rws,rwd)而且该对象操作的文件不存在则会创建,如果存在不会覆盖。如果模式为只读(r),不会创建文件,会读取一个存在的文件,如果文件不存在则会报异常。如果模式为rw,操作的文件不存在则会创建,如果存在则不会覆盖。
示例:

public class RandomDemo {
    public static void main(String[] args) throws IOException {
        randWrite();
        randRead();
    }

    public static void randWrite() throws IOException {
        RandomAccessFile raf = new RandomAccessFile("G:\\r.txt", "rw");
        byte[] buf = new byte[1024];
        raf.seek(8 * 4);
        raf.write("赵六".getBytes());
        raf.writeInt(100);
        raf.write("周期".getBytes());
        raf.writeInt(101);
        raf.close();
    }

    public static void randRead() throws IOException {
        RandomAccessFile raf = new RandomAccessFile("G:\\r.txt", "r");
        byte[] buf = new byte[4];
        raf.seek(8 * 0);
        raf.skipBytes(8);
        raf.read(buf);
        String name = new String(buf);
        int age = raf.readInt();
        System.out.println("name=" + name + "::age=" + age);

        System.out.println();
    }
}

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值