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

Java基础---文件操作

作者: xianxun | 来源:发表于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学习路线

    javaSE java基础语法 java文件操作 java网络操作 java多线程 java数据库操作 java ...

  • Java基础---文件操作

    前言 文件操作在java程序中可以说是一个比较重要的点,如果没有这个基础的话,后期的Java学习可能会比较艰难,但...

  • Java实现文件目录操作书目录

    Java实现文件目录操作之使用IO和NIO创建目录 Java实现文件目录操作之递归遍历目录和文件 Java实现文件...

  • 【JAVA】将InputStream文件流转换为File文件

    其实这个只是很简单的文件流操作,基本学过JAVA基础的都会学到文件流,但由于以前上课开小差,对流这一操作不太熟悉,...

  • Java----IO操作

    Java----IO流操作 1、基础操作 2、补充要点 2.1、文件的拆分与合并 2.2、对象的序列化输出输入:将...

  • java流,文件,IO基础操作

    1.从控制台读入字符,字符串 2.读文件,写文件从file.txt文件中读取数据,然后存放到dest.txt文件中...

  • Python-文件操作

    字符编码 文件操作 基础读 基础写 with语法 操作模式 游标操作 文件的遍历 字符编码: 三种字符串: 文件操...

  • 文件与流-1

    文件与流 持久化操作:(文件里、数据库里)Java.io 文件分隔符 目录操作 文件操作

  • Java到处运行的基础之Class文件

    Java 实现一次编译到处运行的基础,来源于 Java 虚拟机屏蔽了操作系统的底层细节。使用 class 文件存储...

  • IO流分类讲解

    1 IO流基础 javaIO就是输入输出体系,简单的理解就是java对于文件内存网络资源的操作,在java传统的I...

网友评论

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

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