A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 十七 中级黑马   /  2014-10-23 19:50  /  1291 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 十七 于 2014-10-25 15:27 编辑

神们,能给个指点吗?怎样加一个循环语句,使程序不用列出所有文件名称就可以遍历多个文件?
  1. package mysql;

  2. import static java.lang.System.out;  

  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.nio.ByteBuffer;  
  7. import java.nio.channels.FileChannel;  
  8. import java.util.Arrays;  
  9.   
  10.   
  11. public class merge {  
  12.       
  13.     public static final int BUFSIZE = 1024 * 8;  
  14.       
  15.     public static void mergeFiles(String outFile, String[] files) {  
  16.         FileChannel outChannel = null;  
  17.         //out.println("Merge " + Arrays.toString(files) + " into " + outFile);  
  18.         try {  
  19.             outChannel = new FileOutputStream(outFile).getChannel();  
  20.             for(String f : files){  
  21.                 FileChannel fc = new FileInputStream(f).getChannel();   
  22.                 ByteBuffer bb = ByteBuffer.allocate(BUFSIZE);  
  23.                 while(fc.read(bb) != -1){  
  24.                     bb.flip();  
  25.                     outChannel.write(bb);  
  26.                     bb.clear();  
  27.                 }  
  28.                 fc.close();  
  29.             }  
  30.             //out.println("Merged!! ");  
  31.         } catch (IOException ioe) {  
  32.             ioe.printStackTrace();  
  33.         } finally {  
  34.             try {if (outChannel != null) {outChannel.close();}} catch (IOException ignore) {}  
  35.         }  
  36.     }  
  37.    
  38.     public static void main(String[] args) {  
  39.         mergeFiles("f:/ex/output.txt", new String[]{"f:/ex/new.txt","f:/ex/new1.txt"});  
  40.     }  
  41. }  
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
付江涛 发表于 2014-10-23 22:28
类 SequenceInputStream

好的,谢谢了
回复 使用道具 举报
香草芭芙 发表于 2014-10-23 21:25
图片合并没效果(只能看第一张图片,大小是变了.), txt倒是能合并, 字节流的 mp3 也能合并,
...

你的代码很清晰,谢谢,我试下下面那个
回复 使用道具 举报
付江涛 发表于 2014-10-23 22:28
类 SequenceInputStream

毕老师没有讲枚举, T. T Enumeration , Vector , 用 SequenceInputStream类 能大大缩减代码量,  厉害, 又学到一招了, 感谢.
回复 使用道具 举报
类 SequenceInputStream
回复 使用道具 举报
图片合并没效果(只能看第一张图片,大小是变了.), txt倒是能合并, 字节流的 mp3 也能合并,
  1. package test;

  2. import java.io.*;
  3. import java.util.*;

  4. public class Test6
  5. {
  6.         public static void main(String[] args) throws Exception
  7.         {
  8.                 String s = "D:/out.mp3"; // 输出目录 & 文件名
  9.                 List<String> list = new ArrayList<String>();
  10.                 File dir = new File("D:/aaa"); // 要遍历的目录, 用递归拿文件,文件太多就完蛋.
  11.                 recursion(dir.listFiles(), list); // 递归函数
  12.                 String[] ss = new String[list.size()];
  13.                 for (int i = 0; i < ss.length; i++)
  14.                 {
  15.                         ss[i] = list.get(i);
  16.                 }
  17.                 System.out.println();
  18.                 combine(s, ss);
  19.         }
  20.         public static void recursion(File[] fs, List<String> list) // 递归得所有子目录的.mp3文件.
  21.         {
  22.                 for (File f : fs)
  23.                 {
  24.                         if (f.isDirectory())
  25.                         {
  26.                                 recursion(f.listFiles(), list);
  27.                         }
  28.                         else
  29.                         {
  30.                                 if (f.getName().endsWith(".mp3"))
  31.                                 {
  32.                                         list.add(f.getAbsolutePath());
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37.         private static boolean combine(String outFile, String[] inFiles) throws Exception
  38.         {
  39.                 File out = new File(outFile);
  40.                 File[] files = new File[inFiles.length];
  41.                 for (int i = 0; i < files.length; i++)
  42.                 {
  43.                         files[i] = new File(inFiles[i]);
  44.                 }
  45.                 FileInputStream fis = null;
  46.                 FileOutputStream fos = new FileOutputStream(outFile, true); // 合并其实就是文件的续写,写成true
  47.                 for (int i = 0; i < files.length; i++)
  48.                 {
  49.                         fis = new FileInputStream(files[i]);
  50.                         int len = 0;
  51.                         for (byte[] buf = new byte[1024 * 1024]; (len = fis.read(buf)) != -1;)
  52.                         {
  53.                                 fos.write(buf, 0, len);
  54.                         }
  55.                 }
  56.                 fis.close();
  57.                 fos.close();
  58.                 return true;
  59.         }
  60. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马