java文件读取与写入

package com.myjava;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by 14061371 on 2017/5/12.
 */
public class FileUtils {
    //获取当前路径

    /** 按字节读取
     *
     * @param fileName
     */
    public static void readFileByBytes(String fileName){
        File file=new File(fileName);
        if(!file.exists()){
            return;
        }
        InputStream in = null;
        try {
            in = new FileInputStream(file);
            byte[] tempbytes = new byte[100];
            int byteread = 0;
            in = new FileInputStream(fileName);
            // 读入多个字节到字节数组中,byteread为一次读入的字节数
            while ((byteread = in.read(tempbytes)) != -1) {
                System.out.write(tempbytes, 0, byteread);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
            }
        }
    }

    /**
     * 按字符读取
     * @param fileName
     */
    public static void readFileByChars(String fileName){
        File file=new File(fileName);
        if(!file.exists()){
            return;
        }
        Reader reader=null;
        try {
            reader=new InputStreamReader(new FileInputStream(file));
            int tempChart;
            char[] tempchars = new char[30];
            while((tempChart=reader.read(tempchars))!=-1){
                System.out.print(tempchars);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(reader!=null){
                try{
                    reader.close();
                }catch (IOException e){

                }
            }
        }
    }

    /**
     * 按行读取
     * @param fileName
     */
    public static void readFileByLines(String fileName){
        File file=new File(fileName);
        if(!file.exists()){
            return;
        }
        BufferedReader reader=null;
        try {
            reader=new BufferedReader(new FileReader(file));
            String tempString=null;
            int line=1;
            while((tempString=reader.readLine())!=null){
                System.out.println(line+tempString);
                line++;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(reader!=null){
                try{
                    reader.close();
                }catch(IOException e){

                }
            }
        }
    }

    /**
     * random读取文件
     * @param fileName
     */
    public static void readFileByRandomAccess(String fileName){
        RandomAccessFile randomFile=null;
        try {
            randomFile=new RandomAccessFile(fileName,"r");
            long fileLength=randomFile.length();
            randomFile.seek(0);
            byte[] bytes=new byte[10];
            int byteread=0;
            while((byteread=randomFile.read(bytes))!=-1){
                System.out.write(bytes,0,byteread);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (randomFile != null) {
                try {
                    randomFile.close();
                } catch (IOException e) {

                }
            }
        }
    }

    /**
     * 读取文件最后N行
     *
     * 根据换行符判断当前的行数,
     * 使用统计来判断当前读取第N行
     *
     * PS:输出的List是倒叙,需要对List反转输出
     *
     * @param file 待文件
     * @param numRead 读取的行数
     * @return List<String>
     */
    public static List<String> readLastNLine(File file, long numRead) {
        // 定义结果集
        List<String> result = new ArrayList<String>();
        //行数统计
        long count = 0;

        // 排除不可读状态
        if (!file.exists() || file.isDirectory() || !file.canRead()) {
            return null;
        }

        // 使用随机读取
        RandomAccessFile fileRead = null;
        try {
            //使用读模式
            fileRead = new RandomAccessFile(file, "r");
            //读取文件长度
            long length = fileRead.length();
            //如果是0,代表是空文件,直接返回空结果
            if (length == 0L) {
                return result;
            } else {
                //初始化游标
                long pos = length - 1;
                while (pos > 0) {
                    pos--;
                    //开始读取
                    fileRead.seek(pos);
                    //如果读取到\n代表是读取到一行
                    if (fileRead.readByte() == ‘\n‘) {
                        //使用readLine获取当前行
                        String line = fileRead.readLine();
                        //保存结果
                        result.add(line);
                        //打印当前行
                        // System.out.println(line);
                        //行数统计,如果到达了numRead指定的行数,就跳出循环
                        count++;
                        if (count == numRead) {
                            break;
                        }
                    }
                }
                if (pos == 0) {
                    fileRead.seek(0);
                    result.add(fileRead.readLine());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileRead != null) {
                try {
                    //关闭资源
                    fileRead.close();
                } catch (Exception e) {
                }
            }
        }
        Collections.reverse(result);
        return result;
    }

    /**
     * 使用RandomAccessFile追加文件
     * @param fileName
     */
    public static void appendFileByAccess(String fileName,String content){
        try {
            RandomAccessFile randomFile=new RandomAccessFile(fileName,"rw");
            long fileLength=randomFile.length();
            randomFile.seek(fileLength);
            randomFile.writeBytes(content);
            randomFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用FileWriter 追加文件内容
     * @param fileName
     * @param content
     */
    public static void appendFile(String fileName,String content){
        try {
            FileWriter writer=new FileWriter(fileName,true);
            writer.write(content);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 往文件头插入数据
     * @param filename
     * @param pos
     * @param insertContent
     */
    public static void insert(String filename, int pos, String insertContent){
        RandomAccessFile raf=null;
        FileOutputStream tmpOut=null;
        FileInputStream tmpIn=null;
        try{
            File tmp = File.createTempFile("tmp", null);
            tmp.deleteOnExit();
            raf = new RandomAccessFile(filename, "rw");
            tmpOut = new FileOutputStream(tmp);
            tmpIn = new FileInputStream(tmp);
            raf.seek(pos);//首先的话是0
            byte[] buf = new byte[64];
            int hasRead = 0;
            while ((hasRead = raf.read(buf)) > 0) {
                //把原有内容读入临时文件
                tmpOut.write(buf, 0, hasRead);

            }
            raf.seek(pos);
            raf.write(insertContent.getBytes());
            //追加临时文件的内容
            while ((hasRead = tmpIn.read(buf)) > 0) {
                raf.write(buf, 0, hasRead);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if (raf != null) {
                    raf.close();
                }
                if (tmpOut != null) {
                    tmpOut.close();
                }
                if (tmpIn != null) {
                    tmpIn.close();
                }
            } catch (IOException e) {

            }
        }
    }
}
时间: 2024-10-11 04:08:43

java文件读取与写入的相关文章

Java底层代码实现单文件读取和写入(解决中文乱码问题)

需求: 将"E:/data/车站一次/阿坝藏族羌族自治州.csv"文件中的内容读取,写入到"E:/data//车站一次.csv". 代码: public class FileOpe { public static void main(String[] args) { sigle(); } public static void sigle(){ BufferedReader bufr = null; BufferedWriter bufw = null; try {

Java底层代码实现多文件读取和写入

需求: "E:/data/"目录下有四个文件夹,如下: 每个文件夹下有几个.csv文件,如下: 将每个文件夹下的.csv文件合并成一个以该文件夹命名的.csv文件. 做法: 找到"E:/data"这个目录,循环读取目录下的四个文件夹: 针对每个文件夹,循环读取目录下的文件列表: 将读取的文件写入要合并的文件中. 代码: public class FileOperation { public static void main(String[] args) { comb

Apache commons-io实现单文件读取和写入

Apache commons-io提供了很多类,这里只介绍FileUtils类. FileUtils类提供了一些操作文件对象的实用方法,包括文件的读取.写入.复制和比较等. 比如逐句读取和写入一个文件可以使用如下方法: File file = new File("E:/data/a.csv"); List lines = FileUtils.readLines(file,"UTF-8"); FileUtils.writeLines(file2, lines, tru

Apache commons-io实现多文件读取和写入

需求: "E:/data/"目录下有四个文件夹,如下: 每个文件夹下有几个.csv文件,如下: 将每个文件夹下的.csv文件合并成一个以该文件夹命名的.csv文件. 做法: 找到"E:/data"这个目录,循环读取目录下的四个文件夹: 针对每个文件夹,循环读取目录下的文件列表: 将读取的文件写入要合并的文件中. 代码: package com.file_readwrite; import java.io.File; import java.io.IOExceptio

java文件读取

java文件读取 刚开始用java,作为之前C语言的重度使用者,发现以前熟悉的文件读取file.read()在java.io.File类里找不到了.替代之的是java.io.InputStream, InputStream为一个I/O操作的抽象类,其中FileInputStream:read实现了读取文件的方法 File f = new File(fileName); InputStream in = new FileInputStream(f); byte data[] = new byte[

java文件读取的路径问题解惑和最佳实践,让你远离FileNotFoundException

使用java读取jar或war下的配置文件,是开发者经常需要处理的事情,大家是不是经常遇到FileNotFoundException呢?java读取文件的方式也有很多,比如new File(),Class.getResource(),ClassLoader.getResource(),这些方式的差别是什么呢?开源框架struts2的ClassLoaderUtils和Spring提供ClassPathResource,都提供了对资源读取进行封装的工具类,你是否了解他们的实现原理呢?本文结合网上的一

JAVA文件读取FileReader

JAVA文件读取FileReader 导包import java.io.FileReader 创建构造方法public FileReader(String filename),参数是文件的路径及文件名(默认是当前执行文件的路径)FileReader fr = new FileReader(文件名(要包含路径)); fr.read()读取单个字符对应到ASCII与Unicode的值fr.read(char[] array)一次请读取数组长度的字符值(这里不是读取的数字)fr.close()关闭读取

Java中IO流文件读取、写入和复制

//构造文件File类 File f=new File(fileName); //判断是否为目录 f.isDirectory(); //获取目录下的文件名 String[] fileName=f.list(); //获取目录下的文件File[] files=f.listFiles();  1.Java怎么读取文件 package com.yyb.file; import java.io.File; import java.io.FileInputStream; import java.io.In

CSharp文件读取与写入入门图解

C#是微软公司发布的一种面向对象的.运行于.NET Framework之上的高级程序设计语言.并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似:它包括了诸如单一继承.接口.与Java几乎同样的语法和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角. 用c#来读取