天天看點

關于讀取txt檔案并根據檔案每行更改檔案名,踩坑以及解決

讀取txt檔案每行内容​​​​

public Map<Integer, String> Txt(String filePath) {
        //将讀出來的一行行資料使用Map存儲
        Map<Integer, String> map = new HashMap<Integer, String>();
        try {
            File file = new File(filePath);
            int count = 0;//初始化 key值
            if (file.isFile() && file.exists()) {  //檔案存在的前提
                InputStreamReader isr = null;
                try {
                    isr = new InputStreamReader(new FileInputStream(file), "utf-8");
                } catch (java.io.UnsupportedEncodingException e1) {
                    e1.printStackTrace();
                }
                BufferedReader br = new BufferedReader(isr);
                String lineTxt = null;
                while ((lineTxt = br.readLine()) != null) {  //
                    if (!"".equals(lineTxt)) {
//                        String reds = lineTxt.split("\\+")[0];  //java 正規表達式
                        String reds = lineTxt;
                        map.put(count, reds);//依次放到map 0,value0;1,value2
                        count++;
                    }
                }
                isr.close();
                br.close();
            }else {
                Toast.makeText(getApplicationContext(),"can not find file",Toast.LENGTH_SHORT).show();//找不到檔案情況下
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }      

根據讀出内容修改檔案名

String []filename;
File []teamVideo;
int i=0;
private void ChangeFileName(File file){
    Map<Integer, String> map=orderByName(file.toString());
    File[] fs = file.listFiles();
    filename=new String[map.size()];
    teamVideo=new File[map.size()];
    for (int j=0;j<map.size();j++){
        if (map.get(j).endsWith(".mp4")){
            filename[i]=map.get(j);
            teamVideo[i] =new File(filename[i]);
            if (i==0){
                String start=Txt(IdrmsApplication.USBURL+ConstantConfig.BEIKE_TEAM_VIDEO_URL+"/videoname.txt").get(i);
                String start2 = start.substring(1, start.length());
                teamVideo[i].renameTo(new File(IdrmsApplication.USBURL+ConstantConfig.BEIKE_TEAM_VIDEO_URL+"/"+start2));
                i=i+1;
            }else {
            teamVideo[i].renameTo(new File(IdrmsApplication.USBURL+ConstantConfig.BEIKE_TEAM_VIDEO_URL+"/"+
                    Txt(IdrmsApplication.USBURL+ConstantConfig.BEIKE_TEAM_VIDEO_URL+"/videoname.txt").get(i)));
                i=i+1;
            }
        }
    }
}      

因為如果是正常的file.listFiles();方法的話,是不保證所列出檔案夾下所有檔案名是按某種順序排列的,是以重命名可能會出現命名檔案不對應的狀況。是以實作為listFile()後檔案名按某種順序排列,有以下實作排列方法:

public static Map<Integer, String> orderByName(String filePath) {
    File file = new File(filePath);
    File[] files = file.listFiles();
    List fileList = Arrays.asList(files);
    String lastfile;
    Map<Integer, String> map = new HashMap<Integer, String>();
    int count=0;
    Collections.sort(fileList, 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;
            return o1.getName().compareTo(o2.getName());
        }
    });
    for (File f : files) {
        lastfile=f.getAbsolutePath();
        map.put(count,lastfile);
        count++;
    }
    return map;
}      

遇到的問題:如果你沒有對讀取txt内容進行隔離第一個字元的處理,将會出現後續打開檔案時,檔案名與代碼不符合而報空或不存在此檔案。

原因:windows下的txt檔案會在首行第一個位置添加一個辨別符用于辨識編碼方式的,而我們是不可見的。但在程式運作讀取後可能會出現看不見的單個字元或者”?“,

這時解決方法就如上面例子中的:

String start=Txt(IdrmsApplication.USBURL+ConstantConfig.BEIKE_TEAM_VIDEO_URL+"/videoname.txt").get(i);

String start2 = start.substring(1, start.length());

将首字元删除,将解決出現問題

繼續閱讀