【JavaEE多线程】Java 文件操作

今天 2533阅读 0评论

目录

    • Java中操作文件
      • File概述
        • 属性
        • 构造方法
        • 方法
        • 文件内容的读写——文件流 stream
          • InputStream
          • FileInputStream概述
          • 利用 Scanner 进行字符读取
          • OutputStream 概述
          • 练习

            Java中操作文件

            Java 中通过 java.io.File类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。

            文件系统操作

            创建文件、删除文件、创建目录

            通过File对象来描述一个具体的文件,File对象可以对应到一个真实存在的文件,也可以对应到一个不存在的文件

            File概述

            属性
            修饰符及类型属性说明
            static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示
            static charpathSeparator依赖于系统的路径分隔符,char 类型的表示
            构造方法
            签名说明
            File(File parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例
            File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
            File(String parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示
            方法
            修饰符及返回值类型方法签名说明
            StringgetParent()返回 File 对象的父目录文件路径
            StringgetName()返回 FIle 对象的纯文件名称
            StringgetPath()返回 File 对象的文件路径
            StringgetAbsolutePath()返回 File 对象的绝对路径
            StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
            booleanexists()判断 File 对象描述的文件是否真实存在
            booleanisDirectory()判断 File 对象代表的文件是否是一个目录
            booleanisFile()判断 File 对象代表的文件是否是一个普通文件
            booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 true
            booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
            voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
            String[]list()返回 File 对象代表的目录下的所有文件名
            File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示
            booleanmkdir()创建 File 对象代表的目录
            booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
            booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
            booleancanRead()判断用户是否对文件有可读权限
            booleancanWrite()判断用户是否对文件有可写权限

            观察 get 系列的特点和差异

            //File的使用
            public class Demo1 {
                public static void main(String[] args) throws IOException {
                    File file=new File("./test.txt");
                    System.out.println(file.getParent());
                    System.out.println(file.getName());
                    System.out.println(file.getPath());
                    System.out.println(file.getAbsolutePath());
                    System.out.println(file.getCanonicalFile());
                }
            }
            //运行结果
            .
            test.txt
            .\test.txt
            C:\Users\幽琴健\java_Code\giteedemo\system_code\.\test.txt
            C:\Users\幽琴健\java_Code\giteedemo\system_code\test.txt
            

            普通文件的创建

            public class Demo2 {
                public static void main(String[] args) throws IOException {
                    File file=new File("./test.txt");
                    //创建文件
                    file.createNewFile();
                    System.out.println(file.exists());
                    System.out.println(file.isFile());
                    System.out.println(file.isDirectory());
                }
            }
            //运行结果
            true
            true
            false
            

            普通文件的删除

            //文件删除
            public class Demo3 {
                public static void main(String[] args) throws InterruptedException, IOException {
                    File file =new File("./test.txt");
                    System.out.println(file.createNewFile());
                    //System.out.println(file.delete());
                    //是等到程序退出了再删除,不是立即删除;
                    file.deleteOnExit();
                    System.out.println(file.exists());
                    Thread.sleep(5000);
                }
            }
            //运行结果
            true
            true
            

            观察目录的创建1

            public class Demo4 {
                public static void main(String[] args) {
                    File file=new File("./testDir");// 要求该目录不存在,才能看到相同的现象
                    System.out.println(file.mkdir());
                    System.out.println(file.isDirectory());
                }
            }
            //运行结果
            true
            true
            

            观察目录的创建2

            public class Demo4 {
                public static void main(String[] args) {
                    File file=new File("./testDir/111/222/333");// 要求该目录不存在,才能看到相同的现象
                    System.out.println(file.mkdirs());
                    System.out.println(file.isDirectory());
                }
            }
            //运行结果
            true
            true
            

            观察文件重命名

            //文件重命名
            public class Demo5 {
                public static void main(String[] args) {
                    File file=new File("./test.txt");
                    File file2=new File("./test1.txt");
                    System.out.println(file.renameTo(file2));
                }
            }
            //运行结果
            true
            

            以上文件系统的操作,都是基于File类来完成的。另外还需要文件内容的操作

            文件内容的读写——文件流 stream

            文件这里的内容本质是来自于硬盘,硬盘又是操作系统管理的。使用某个编程语言操作文件,本质上都是需要调用系统的api

            文件内容的操作核心步骤有四个:

            1. 打开文件 fopen
            2. 关闭文件 fclose
            3. 读文件 fread
            4. 写文件 fwrite

            字节流:InputStream、OutputStream,是操作字节为单位(二进制文件)

            字符流:Reader、Writer,是操作字符为单位(文本文件)

            Java lO 流是一个比较庞大的体系,涉及到非常多的类。这些不同类,都有各自不同的特性但是总的来说,使用方法都是类似的。

            1. 构造方法,打开文件
            2. close方法,关闭文件。(可以通过finally或者**try()**的方式去关闭,后者更优雅)
            3. 如果衍生自InputStream或者Reader就可以使用read方法来读数据
            4. 如果衍生自OutputStream或者Writer就可以使用write方法来写数据

            注意:close()方法这个释放必要的资源这个操作非常重要。让一个进程打开一个文件是要从系统这里申请一定的资源的(占用进程的PCB里的文件描述符表中的一个表项,这个表是个顺序表,长度有限且不会扩容),如果不释放就会出现“文件资源泄露”,如果一直打开,文件描述符表就会被占满,后续就无法继续打开新的文件了

            文本文件也可以用字节流打开,只不过此时你读到的每个字节就不是完整的字符了

            InputStream

            方法

            修饰符及返回值类型方法签名说明
            intread()读取一个字节的数据,返回 -1 代表已经完全读完了
            intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
            intread(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
            voidclose()关闭字节流

            说明

            InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用FileInputStream

            FileInputStream概述

            构造方法

            签名说明
            FileInputStream(File file)利用 File 构造文件输入流
            FileInputStream(String name)利用文件路径构造文件输入流
            //Reader使用
            public class Demo6 {
                public static void main(String[] args) throws IOException {
            //        FileReader 构造方法, 可以填写一个文件路径(绝对路径/相对路径都行), 也可以填写一个构造好的 File 对象
            //        Reader reader = new FileReader("d:/test.txt");
            //        try {
            //            // 中间的代码无论出现啥情况, close 都能保证执行到.
            //        } finally {
            //            // 抛出异常, 或者 return, close 就都执行不到了~~
            //            reader.close();
            //        }
                    // 上述使用 finally 的方式能解决问题, 但是不优雅.
                    // 使用 try with resources 是更好的解决方案.
                    try(Reader reader=new FileReader("d:/test.txt")){
                        while(true){
                            char[] buf=new char[1024];
                            int n=reader.read(buf);
                            if(n==-1){
                                //读到文件末尾了
                                break;
                            }
                            for(int i=0;i
                                System.out.print(buf[i]+" ");
                            }
                        }
                    }
                }
            }
            
                public static void main(String[] args) throws IOException {
                    try (InputStream inputStream = new FileInputStream("d:/test.txt")) {
                        while (true) {
                            byte[] buf = new byte[1024];
                            int n = inputStream.read(buf);
                            if (n == -1) {
                                break;
                            }
                            for (int i = 0; i 

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,2533人围观)

还没有评论,来说两句吧...

目录[+]