美文网首页File
Java基础---文件操作

Java基础---文件操作

作者: iwen大大怪 | 来源:发表于2019-08-14 23:10 被阅读0次

    前言

    文件操作在java程序中可以说是一个比较重要的点,如果没有这个基础的话,后期的Java学习可能会比较艰难,但是文件操作的话,它的点并不多,理解了以后就比较简单,下面我将从基本的字节流和字符流开始,为大家讲解java中是如何操作文件的。

    字节流与字符流

    1.字节流:字节流读取的时候,读到一个字节就返回一个字节;主要用于读取图片,MP3,AVI视频文件。
    2.字符流:字符流使用了字节流读到一个或多个字节,如读取中文时,就会一次读取2个字节。只要是处理纯文本数据,就要优先考虑使用字符流。

    字节流和字符流区别

    字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
    字节流默认不使用缓冲区;字符流使用缓冲区。
    字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

    创建文件

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
            //创建文件
            File file = new File(path.concat("/1.txt"));
            //判断该文件是否存在
            if (file.exists() == false) {
                //不存在就创建
                // 处理异常的方法
                // 1. throws IOException
                file.createNewFile();
            }
        }
    }
    

    当程序在执行完毕的时候,会在工程目录下创建一个名字为:1.txt 文档;,这就是java中创建文件的一种方法,在java中有三种方法可以创建文件,方法大同小异,在这里就不展开讲了。

    在使用文件操作的一些方法时可能会提示异常,这里有两种解决方法

    1.给调用层处理:

    public static void main(String[] args) throws IOException
    
    1. 用try捕获异常:
    try {
              file.createNewFile();
    }catch (IOException e){
             System.out.println("IO异常了");
    }
    

    向文件写入数据--字节流的方式

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
            //创建文件
            File file = new File(path.concat("/1.txt"));
            //判断该文件是否存在
            if (file.exists() == false) {
                //不存在就创建
                // 处理异常的方法
                // 1. throws IOException
                file.createNewFile();
            }
            // 向文件写入数据--字节流
            // 1.创建文件输出流对象
            FileOutputStream fos = new FileOutputStream(file);
    
            // 2.调用Write方法写入
            byte[] text = {'1','2','3','4'};
            fos.write(text);
    
            // 3.操作完毕要关闭对象
            fos.close();
        }
    }
    

    程序执行完毕以后会在1.txt文档中保存byte数组中的几个数
    注意:在对文件操作结束以后要调用close方法将文件关闭,否则会浪费系统资源

    向文件写入数据--字符流的方式

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
            //创建文件
            File file = new File(path.concat("/1.txt"));
            //判断该文件是否存在
            if (file.exists() == false) {
                //不存在就创建
                // 处理异常的方法
                // 1. throws IOException
                file.createNewFile();
            }
            // 向文件写入数据--字符流
            // 1.创建对象
            FileWriter fw = new FileWriter(file);
    
            char[] nane = {'安','卓','开','发'};
            fw.write(nane);
    
            fw.close();
        }
    }
    

    向文件写入数据--字符串的方式

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
            //创建文件
            File file = new File(path.concat("/1.txt"));
            //判断该文件是否存在
            if (file.exists() == false) {
                //不存在就创建
                // 处理异常的方法
                // 1. throws IOException
                file.createNewFile();
            }
            // 向文件写入数据--字符串的方式
            // 1.创建文件输出流对象  使用FileWriter创建对象
            FileWriter fos = new FileWriter(file);
    
            // 2.调用Write方法写入
            String text= "hello word";
            fos.write(text);
            // 刷新缓冲区 刷新过后才会将数据存入文件
            fos.flush();
    
            // 3.操作完毕要关闭对象
            fos.close();
        }
    }
    

    这里使用了FileWrite来创建对象,在FileWrite里面有一个方法:flush();就是用来刷新缓冲区,只有调用这个方法以后数据才会写入文件,否则不行

    介绍了如何创建文件和怎样将数据写入文件后,接下来就是读取文件了

    文件的读取--方式一:

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
            //创建文件
            File file = new File(path.concat("/1.txt"));
    
            // 读取文件内容
            // 创建文件对象
            FileInputStream fis = new FileInputStream(file);
    
            // 创建字节数组
            byte[] name = new byte[12];
    
            // 查看字节数组到底读了多少个字节
            int count = fis.read(name);
            
            // 读取文件
            fis.read(name);
            
            //关闭文件
            fis.close();
            
            System.out.println(count);
            // 转化为String类型并且打印
            System.out.println(new String(name));
        }
    }
    

    文件的读取--方式二:

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
            //创建文件
            File file = new File(path.concat("/1.txt"));
    
            // 读取文件内容
            // 创建文件对象
            FileInputStream fis = new FileInputStream(file);
    
            // 创建字节数组
            byte[] name = new byte[12];
    
            // 查看字节数组到底读了多少个字节
            int count = fis.read(name);
            
            // 创建FileReader对象
            FileReader fr = new FileReader(file);
            
            char[] book = new char[4];
            count = fr.read(book);
            fr.close();
            System.out.println(count);
            System.out.println(new String(book));
    
        }
    }
    

    向文件中写入对象

    实现类

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            
            //用数组保存文件地址
            String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
            //创建文件
            File file = new File(path.concat("/1.txt"));
    
            /** 
             * 向文件里面存一个对象
             *序列化 serializable
             *保存对象必须要实现serializable接口
             */
            // 创建对象
            Person xw = new Person();
            xw.name = "小王";
            xw.age = 20;
            // 创建对象读取文件的数据
            OutputStream os = new FileOutputStream(file);
            // 创建对象接收上面读取的数据
            ObjectOutputStream oos = new ObjectOutputStream(os);
            // 将读取到的数据写入
            oos.writeObject(xw);
            //关闭文件
            oos.close();
        }
    }
    

    对象类--必须要实现serializable接口

    public class Person implements Serializable {
        //要将对象保存道文件 需要实现serializable接口
        public String name;
        public int age;
    }
    

    将一个文件拷贝到另外一个位置 方法一

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            /**
             * 将一个文件拷贝到另外一个位置
             */
            // 1.原文件路径
            String sourcePath = "C://Users//18168//Desktop//yz.jpg";
    
            // 2.目标文件的路径
            String desPath = "C://Users//18168//Desktop//AndroidText//yz1.jpg";
    
            // 3.图片->用字节流
            // 读取原文件
            FileInputStream fis = new FileInputStream(sourcePath);
            // 写入文件
            FileOutputStream fos = new FileOutputStream(desPath);
    
            byte[] in = new byte[1024];//一次读取1024KB
    
            int count = 0;
            // 方法1
            while (true){
                // 用读取到的数据来判断是否读取完
                count = fis.read(in);
                if (count!=-1){
                    // 说明没有读到末尾
                    // 将这一次读取的内容写入目标文件 原因:数组不够大
                    fos.write(in, 0, count);//0--从头开始写到count
                }else {
                    break;
                }
            }
        }
    }
    

    由于有些文件过大,定义存储的数组时不知道该定义多大,所以在程序中加入了if判断语句,判断是否读完,同时数组存满一次就写入一次

    将一个文件拷贝到另外一个位置 方法二

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            /**
             * 将一个文件拷贝到另外一个位置
             */
            // 1.原文件路径
            String sourcePath = "C://Users//18168//Desktop//yz.jpg";
    
            // 2.目标文件的路径
            String desPath = "C://Users//18168//Desktop//AndroidText//yz1.jpg";
    
            // 3.图片->用字节流
            // 读取原文件
            FileInputStream fis = new FileInputStream(sourcePath);
            // 写入文件
            FileOutputStream fos = new FileOutputStream(desPath);
    
            byte[] in = new byte[1024];//一次读取1024KB
    
            int count = 0;
            while ((count = fis.read(in)) != -1){
                fos.write(in, 0, count);//0--从头开始写到count
            }
            fis.close();
            fos.close();
        }
    }
    

    将一个文件拷贝到另外一个位置 方法三

    public class MyClass {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            /**
             * 将一个文件拷贝到另外一个位置
             */
            // 方法3(快速)
            long start =  System.currentTimeMillis();
            // 1.原文件路径
            String sourcePath = "C://Users//18168//Desktop//yz.jpg";
    
            // 2.目标文件的路径
            String desPath = "C://Users//18168//Desktop//AndroidText//yz1.jpg";
            
            // 读取数据
            InputStream is = new FileInputStream(sourcePath);
            BufferedInputStream bis = new BufferedInputStream(is);
            // 写入数据
            OutputStream os = new FileOutputStream(desPath);
            BufferedOutputStream bos = new BufferedOutputStream(os);
    
            byte[] in = new byte[1024];
            int count = 0;
            while ((count = bis.read(in)) != -1){
                bos.write(in, 0, count);
            }
            // 关闭文件
            bis.close();
            bos.close();
            // 测试时间
            long end =  System.currentTimeMillis();
            System.out.println(end-start);
        }
    }
    

    经过测试方法三是最快的方法!!

    相关文章

      网友评论

        本文标题:Java基础---文件操作

        本文链接:https://www.haomeiwen.com/subject/nurojctx.html