Java 各种读取文件方法以及文件合并

来源:互联网 发布:新疆人口普查数据 编辑:程序博客网 时间:2024/06/05 16:45
1、按字节读取文件内容
2、按字符读取文件内容
3、按行读取文件内容

4、随机读取文件内容 

public class ReadFromFile {    /**     * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。     */    public static void readFileByBytes(String fileName) {        File file = new File(fileName);        InputStream in = null;        try {            System.out.println("以字节为单位读取文件内容,一次读一个字节:");            // 一次读一个字节            in = new FileInputStream(file);            int tempbyte;            while ((tempbyte = in.read()) != -1) {                System.out.write(tempbyte);            }            in.close();        } catch (IOException e) {            e.printStackTrace();            return;        }        try {            System.out.println("以字节为单位读取文件内容,一次读多个字节:");            // 一次读多个字节            byte[] tempbytes = new byte[100];            int byteread = 0;            in = new FileInputStream(fileName);            ReadFromFile.showAvailableBytes(in);            // 读入多个字节到字节数组中,byteread为一次读入的字节数            while ((byteread = in.read(tempbytes)) != -1) {                System.out.write(tempbytes, 0, byteread);            }        } catch (Exception e1) {            e1.printStackTrace();        } finally {            if (in != null) {                try {                    in.close();                } catch (IOException e1) {                }            }        }    }    /**     * 以字符为单位读取文件,常用于读文本,数字等类型的文件     */    public static void readFileByChars(String fileName) {        File file = new File(fileName);        Reader reader = null;        try {            System.out.println("以字符为单位读取文件内容,一次读一个字节:");            // 一次读一个字符            reader = new InputStreamReader(new FileInputStream(file));            int tempchar;            while ((tempchar = reader.read()) != -1) {                // 对于windows下,\r\n这两个字符在一起时,表示一个换行。                // 但如果这两个字符分开显示时,会换两次行。                // 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。                if (((char) tempchar) != '\r') {                    System.out.print((char) tempchar);                }            }            reader.close();        } catch (Exception e) {            e.printStackTrace();        }        try {            System.out.println("以字符为单位读取文件内容,一次读多个字节:");            // 一次读多个字符            char[] tempchars = new char[30];            int charread = 0;            reader = new InputStreamReader(new FileInputStream(fileName));            // 读入多个字符到字符数组中,charread为一次读取字符数            while ((charread = reader.read(tempchars)) != -1) {                // 同样屏蔽掉\r不显示                if ((charread == tempchars.length)                        && (tempchars[tempchars.length - 1] != '\r')) {                    System.out.print(tempchars);                } else {                    for (int i = 0; i < charread; i++) {                        if (tempchars[i] == '\r') {                            continue;                        } else {                            System.out.print(tempchars[i]);                        }                    }                }            }        } catch (Exception e1) {            e1.printStackTrace();        } finally {            if (reader != null) {                try {                    reader.close();                } catch (IOException e1) {                }            }        }    }    /**     * 以行为单位读取文件,常用于读面向行的格式化文件     */    public static void readFileByLines(String fileName) {        File file = new File(fileName);        BufferedReader reader = null;        try {            System.out.println("以行为单位读取文件内容,一次读一整行:");            reader = new BufferedReader(new FileReader(file));            String tempString = null;            int line = 1;            // 一次读入一行,直到读入null为文件结束            while ((tempString = reader.readLine()) != null) {                // 显示行号                System.out.println("line " + line + ": " + tempString);                line++;            }            reader.close();        } catch (IOException e) {            e.printStackTrace();        } finally {            if (reader != null) {                try {                    reader.close();                } catch (IOException e1) {                }            }        }    }    /**     * 随机读取文件内容     */    public static void readFileByRandomAccess(String fileName) {        RandomAccessFile randomFile = null;        try {            System.out.println("随机读取一段文件内容:");            // 打开一个随机访问文件流,按只读方式            randomFile = new RandomAccessFile(fileName, "r");            // 文件长度,字节数            long fileLength = randomFile.length();            // 读文件的起始位置            int beginIndex = (fileLength > 4) ? 4 : 0;            // 将读文件的开始位置移到beginIndex位置。            randomFile.seek(beginIndex);            byte[] bytes = new byte[10];            int byteread = 0;            // 一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。            // 将一次读取的字节数赋给byteread            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 e1) {                }            }        }    }    /**     * 显示输入流中还剩的字节数     */    private static void showAvailableBytes(InputStream in) {        try {            System.out.println("当前字节输入流中的字节数为:" + in.available());        } catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        String fileName = "C:/temp/newTemp.txt";        ReadFromFile.readFileByBytes(fileName);        ReadFromFile.readFileByChars(fileName);        ReadFromFile.readFileByLines(fileName);        ReadFromFile.readFileByRandomAccess(fileName);    }}

5、在贴个合并文件的代码,每个文件介绍之后都加入换行代码,其中使用了普通Io和Nio,这个是我自己的需求,文件目录例如:c:/文件夹1/文件夹2/test.txt,代码中传入参数为c:/文件夹1

package mergesql;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.Date;import java.util.List;import java.util.Scanner;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;/** * 合并sql脚本文件工具类 *  * @author webapp *  */public class MergeSqlFileUtil extends JFrame implements ActionListener {    /**     *      */    private static final long serialVersionUID = 1L;    private final static String fileName = ".sql";    /**     * 获取当前路径下的所有文件中     *      * @time 2014年8月25日     * @auther yuxu.feng     * @param filepath     * @return     */    private static List<File> getFiles(String filepath) {        File file = new File(filepath);        if (!file.exists() | file.listFiles(new MyFileFileter()) == null)            return null;        List<File> fileList = Arrays                .asList(file.listFiles(new MyFileFileter()));        // 最好在这里把 文件过滤掉 只获取文件夹        return sortFolder(fileList);    }    /**     * 按照文件夹按照文件名进行升序 或按着文件名的名字进行升序     *      * @time 2014年8月25日     * @auther yuxu.feng     * @param files     * @return     */    private static List<File> sortFolder(List<File> files) {        if (files.size() == 0)            return null;        Collections.sort(files, new Comparator<File>() {            @Override            public int compare(File o1, File o2) {                if (o1.isDirectory() && o2.isFile())                    return -1;                if (o1.isFile() && o2.isDirectory())                    return 1;                if (o1.isDirectory() && o2.isDirectory())                    return sortFolderName(o1.getName(), o2.getName());                else                    return 0;            }        });        return files;    }    /**     * 根据文件夹名称排序     *      * @time 2014年8月25日     * @auther yuxu.feng     * @param startName     * @param endName     * @return     */    private static int sortFolderName(String startName, String endName) {        if ((parseFloderName(startName) - parseFloderName(endName)) >= 0)            return 1;        else            return -1;    }    /**     * 将文件夹的名字(格式为 A.B.C.D) 转换为long型的数字     *      * @time 2014年8月25日     * @auther yuxu.feng     * @param floderName     * @return     */    private static long parseFloderName(String floderName) {        Scanner sc = new Scanner(floderName).useDelimiter("\\.");        return (sc.nextLong() << 24) + (sc.nextLong() << 16)                + (sc.nextLong() << 8) + (sc.nextLong());    }    /**     * 使用NIO进行文件合并     *      * @time 2014年8月25日     * @auther yuxu.feng     * @param filepath     */    public static void mergerNIO(String filepath) {        SimpleDateFormat fd = new SimpleDateFormat("yyyyMMddHHmmss");        String nowTime = fd.format(new Date());        List<File> fileList = getFiles(filepath);        if (fileList == null)            return;        File fout = new File(filepath + File.separator + nowTime + fileName);        try {            @SuppressWarnings("resource")            FileChannel mFileChannel = new FileOutputStream(fout).getChannel();            FileChannel inFileChannel;            List<File> files = null;            for (File folder : fileList) {                if (folder.isDirectory()) {                    files = Arrays.asList(folder.listFiles());                    // sortFolder(files);                    for (File fin : files) {                        // if (fin.getName().endsWith(fileName)) {                        // inFileChannel = new FileInputStream(fin)                        // .getChannel();                        // inFileChannel.transferTo(0, inFileChannel.size(),                        // mFileChannel);                        //                        // inFileChannel.close();                        // }                        if (fin.getName().endsWith(fileName)) {                            inFileChannel = new FileInputStream(fin)                                    .getChannel();                            inFileChannel.transferTo(0, inFileChannel.size(),                                    mFileChannel);                            inFileChannel.close();                            mFileChannel.write(ByteBuffer.wrap("\r\n"                                    .getBytes()));                        }                    }                }            }            mFileChannel.close();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 使用普通IO进行拷贝文件     *      * @time 2014年8月27日     * @auther yuxu.feng     * @param filepath     */    public static void mergerIO(String filepath) {        SimpleDateFormat fd = new SimpleDateFormat("yyyyMMddHHmmss");        String nowTime = fd.format(new Date());        List<File> fileList = getFiles(filepath);        if (fileList == null)            return;        File fout = new File(filepath + File.separator + nowTime + fileName);        BufferedInputStream inBuff = null;        BufferedOutputStream outBuff = null;        try {            outBuff = new BufferedOutputStream(new FileOutputStream(fout));            List<File> files = null;            FileInputStream finput = null;            for (File folder : fileList) {                if (folder.isDirectory()) {                    files = Arrays.asList(folder.listFiles());                    for (File fin : files) {                        finput = new FileInputStream(fin);                        inBuff = new BufferedInputStream(finput);                        byte[] b = new byte[finput.available()];                        int len;                        while ((len = inBuff.read(b)) != -1) {                            outBuff.write(b, 0, len);                        }                        inBuff.close();                        outBuff.flush();                    }                }            }            outBuff.close();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     *      * @time 2014年8月27日     * @auther yuxu.feng     * @param filepath     */    public static void mergeByBuffWriter(String filepath) {        SimpleDateFormat fd = new SimpleDateFormat("yyyyMMddHHmmss");        String nowTime = fd.format(new Date());        List<File> fileList = getFiles(filepath);        if (fileList == null)            return;        try {            File fout = new File(filepath + File.separator + nowTime + fileName);// 输出文件位置            List<File> files = null;            BufferedReader br = null;            BufferedWriter bw = null;            FileOutputStream fops = new FileOutputStream(fout);            bw = new BufferedWriter(new OutputStreamWriter(                    fops, "UTF-8"));//            bw.write('\ufeff'); 带有bom格式的utf-8//            fops.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); 带有bom格式的utf-8            for (File folder : fileList) {                if (folder.isDirectory()) {                    files = Arrays.asList(folder.listFiles());                    for (File fin : files) {                        FileInputStream finput = new FileInputStream(fin);                        br = new BufferedReader(new InputStreamReader(finput,                                "UTF-8"));                        char[] cbuf = new char[finput.available()];                        int len = cbuf.length;                        int off = 0;                        int ret = 0;                        while ((ret = br.read(cbuf, off, len)) > 0) {                            off += ret;                            len -= ret;                        }                        br.close();                        bw.write(cbuf, 0, off);                                                bw.newLine();                        bw.flush();                    }                }            }            bw.close();        } catch (IOException e) {            e.printStackTrace();        }    }    // /////////////////swing界面////////////////////////    private JLabel lblUsername;    private JTextField tfUsername;    private JButton btnOK;    private JButton btnExit;    public MergeSqlFileUtil() {        JPanel p1 = new JPanel();        p1.setLayout(new BorderLayout());        lblUsername = new JLabel("合并的文件目录:");        tfUsername = new JTextField(20);        p1.add(lblUsername, BorderLayout.WEST);        p1.add(tfUsername, BorderLayout.EAST);        JPanel p2 = new JPanel();        p2.setLayout(new BorderLayout());        JPanel p3 = new JPanel();        btnOK = new JButton("确定");        btnOK.addActionListener(this);        btnExit = new JButton("取消");        btnExit.addActionListener(this);        p3.add(btnOK);        p3.add(btnExit);        this.add(p1, BorderLayout.NORTH);        this.add(p2, BorderLayout.CENTER);        this.add(p3, BorderLayout.SOUTH);        this.setLocation(400, 300);        this.setSize(350, 110);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        this.setVisible(true);    }    @Override    public void actionPerformed(ActionEvent e) {        if (e.getActionCommand().equals("确定")) {            String path = tfUsername.getText();            Long endIo = System.currentTimeMillis();            MergeSqlFileUtil.mergerIO(path);//            MergeSqlFileUtil.mergeByBuffWriter(path);            Long endNio = System.currentTimeMillis();            JOptionPane.showMessageDialog(this, "运行时间为:" + (endNio - endIo));        } else if (e.getActionCommand().equals("取消")) {            System.exit(0);        }    }    public static void main(String[] args) {        new MergeSqlFileUtil();    }}


package mergesql;import java.io.File;import java.io.FileFilter;public class MyFileFileter implements FileFilter{    @Override    public boolean accept(File pathname) {        if(pathname.isDirectory()){            return true;        }        return false;    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 为什么qq群查不到信息怎么办 tiger杯子油漆划掉了怎么办 手被油漆弄到了怎么办 被油漆弄到衣服怎么办 QQ发表情成问号怎么办 qq登不了微信怎么办 qq不能登录微信怎么办 qq号一年没用了怎么办 微信里别人可以看到我手机号怎么办 用手机号注册的微信换号后怎么办 微信群推送名片很多人加怎么办 志高制冷显示ff怎么办 百度账号手机号换了怎么办 别人盗取手机号的通讯录该怎么办 58简历看不到真实号码怎么办 淘宝更换手机号码说已注册怎么办 系统把qq冻结了怎么办 qq被永久冻结好友怎么办 群发不小心发错怎么办 qq群成员满了怎么办 qq知道密码没手机号验证怎么办 改房本上的名字怎么办 支付宝租给别人怎么办 微信麻将房间卡怎么办 皮肤挤伤了发黑怎么办 指甲被挤了黑了怎么办 手指被挤了变黑怎么办 榆次买房太原户口怎么办 皮肤又红又黑怎么办 打仙桃晃晃老输怎么办 微信支付忘了摇怎么办 苹果手机微信摇一摇摇不了怎么办 打麻将牌背的时候怎么办 打麻将背的时候怎么办 同城游台球初使化失败怎么办 qq密码改忘了怎么办啊 qq头像显示不出来怎么办 qq的重要数据被清理怎么办 把qq数据删除了怎么办 手机qq头像显示不同怎么办 手机qq图片显示不出来怎么办