Java 各种读取文件方法以及文件合并
JAVA读取文件
1、按字节读取文件内容
2、按字符读取文件内容
3、按行读取文件内容
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; } }