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

JAVA读取文件

 
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;

    }



}

 

你可能感兴趣的:(java)