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) {

            }
        }
    }
}

 

posted on 2017-05-12 19:27  web369  阅读(459)  评论(0编辑  收藏  举报

导航