美文网首页
Java实现文件读取操作

Java实现文件读取操作

作者: shiguangfeixu | 来源:发表于2020-10-11 16:16 被阅读0次

Java实现文件操作方式有很多,这里写了几个小工具,需要的话可以直接拷贝使用,或者优化后使用。

基本概念

  • FileChannel是一个用读写,映射和操作一个文件的通道,也是Java NIO对应于磁盘等存储设备文件操作的通道。除了读写操作之外,还有裁剪特定大小文件truncate(),强制在内存中的数据刷新到硬盘中去force(),对通道上锁lock()等功能。

  • RandomAccessFile类的主要功能是完成随机读取功能,可以读取指定位置的内容。
    之前的File类只是针对文件本身进行操作的,而如果要想对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机读取一个文件中指定位置的数据。

  • 在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAccessFile来获取一个FileChannel实例。

写文件操作

    /**
     * 写文件
     * @param fileName
     * @throws IOException
     */
    public void doWrite(String fileName) throws IOException {
        outFile = new RandomAccessFile(fileName, "rw");
        outChannel = outFile.getChannel();
        String newData = "New String to write to file... \n";
        buf.clear();
        buf.put(newData.getBytes());
        buf.flip();
        while (buf.hasRemaining()){
            outChannel.write(buf);
        }
        outChannel.close();
        System.out.println("Write Over!\n");
    }

读文件操作

    /**
     * 读文件
     * @param fileName
     * @throws IOException
     */
    public void doRead(String fileName) throws IOException {
        inFile = new RandomAccessFile(fileName, "rw");
        inChannel = inFile.getChannel();
        int bytesRead = inChannel.read(buf);
        while (bytesRead != -1) {
            System.out.println("Read " + bytesRead);
            buf.flip();
            while (buf.hasRemaining()){
                System.out.print((char) buf.get());
            }
            buf.clear();
            bytesRead = inChannel.read(buf);
        }
        inFile.close();
    }

文件拷贝操作

    /**
     * 拷贝文件
     * @param sourceFile
     * @param targetFile
     * @throws IOException
     */
    public void doCopy(String sourceFile, String targetFile) throws IOException {
        inFile = new RandomAccessFile(sourceFile, "rw");
        inChannel = inFile.getChannel();
        RandomAccessFile bFile = new RandomAccessFile(targetFile, "rw");
        FileChannel outChannel = bFile.getChannel();
        inChannel.transferTo(0, inChannel.size(), outChannel);
        System.out.println("Copy over");
        inChannel.close();
    }
    /**
     * 按照行读文件
     * @param fileName
     * @throws IOException
     */
    public void doReadLine(String fileName) throws IOException {
        inFile = new RandomAccessFile(fileName, "rw");
        int lineNum = 0;
        inFile.seek(lineNum);
        String line = "";
        while((line = inFile.readLine())!=null){
            line =  new String(line.getBytes("UTF-8"), "UTF-8");
            System.out.println(line);
        }
        inFile.close();
    }

特殊情况下倒序拷贝文件操作

    /**
     * 倒序拷贝文件
     * @param sourceFile
     * @param targetFile
     * @throws IOException
     */
    public void reverseCopy(String sourceFile, String targetFile) throws IOException {
        inFile = new RandomAccessFile(sourceFile, "r");
        inChannel = inFile.getChannel();
        outFile = new RandomAccessFile(targetFile, "rw");
        outChannel = outFile.getChannel();
        // 文件长度
        long len = inFile.length();
        System.out.println("文件开始指针为"+0);
        //指针是从0到length-1
        long nextEnd =  len - 1;
        String line;
        //seek到最后一个字符
        inFile.seek(nextEnd);
        int c = -1;
        while (nextEnd >= 0) {
            c = inFile.read();
            //只有行与行之间才有\r\n,这表示读到每一行上一行的末尾的\n,而执行完read后,指针指到了这一行的开头字符
            if (c == '\n')
            {
                line =  new String(inFile.readLine().getBytes("UTF-8"), "UTF-8");
                System.out.println(line);
                writeLine(line, outChannel);
            }
            // 当文件指针退至文件开始处,输出第一行
            if (nextEnd == 0) {
                //不需要为下次做准备了,但是因为read()方法指针从0到了1,需重置为0
                inFile.seek(0);
                line =  new String(inFile.readLine().getBytes("UTF-8"), "UTF-8");
                System.out.println(line);
                writeLine(line, outChannel);
            } else {
                //为下一次循环做准备
                inFile.seek(nextEnd-1);
            }
            nextEnd--;
        }
        System.out.println("Reverse Copy over");
        outChannel.close();
        inChannel.close();
    }

    private void writeLine(String line, FileChannel outChannel)throws IOException{
        // 写入文件
        line += "\n";
        buf.clear();
        buf.put(line.getBytes());
        buf.flip();
        while (buf.hasRemaining()){
            outChannel.write(buf);
        }
    }

完整代码

源码参考

小技巧

文件按照行倒序输出可以使用这个命名

perl -e 'print reverse <>' filename

相关文章

  • Java实现文件读取操作

    Java实现文件操作方式有很多,这里写了几个小工具,需要的话可以直接拷贝使用,或者优化后使用。 基本概念 File...

  • java读取大文件解决思路

    1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作。...

  • 聪聪工作室---Java---文件创建与读取写入

    今天学习了用java语言在本机中创建文件并进行读取和写入用java语言来实现操作 主要代码: 代码截图: 实现效果...

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

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

  • java XML解析——DOM方式

    参照:XML解析——DOM方式Java文件操作①——XML文件的读取

  • java IO 流

    1.什么是java IO?通过java一些列文件操作的API,对文件进行读取,写入等操作。即为java IO;这里...

  • Spring Boot 菜鸟教程 12 EasyPoi导出Exc

    Java操作excel框架 Java Excel俗称jxl,可以读取Excel文件的内容、创建新的Excel文件、...

  • JavaSE常用API之File

    java可以对文件进行操作,包括但不限于创建、删除、读取文件内容,写入文件内容等操作,非常的强大! java.io...

  • Python 进阶——什么是上下文管理器

    错误读取文件 java思维读取文件 使用with读取文件 上下文管理器语法 一个类在 Python 中,只要实现以...

  • Java高级特性-文件操作

    通过Java程序完成对于文件和文件夹的创建,删除,移动,读取和写入等操作。 基本操作 文件流操作 定义向文件里面写...

网友评论

      本文标题:Java实现文件读取操作

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