代码之家  ›  专栏  ›  技术社区  ›  Stanley Mungai

在读取文本文件时跳过一定数量的行-BufferedReaderJava

  •  2
  • Stanley Mungai  · 技术社区  · 6 年前

    我有几个文件在一个目录,我打算跳过一定数量的行。获取要跳过的行的唯一方法是获取字符长度为1的行的第一个匹配项。唯一可用的信息是该行出现在第60行之前的任何位置。因此,我编写了以下方法来尝试跳过字符之前的行。但最终得到的文件与原始文件相同:

    public static void editSplitFiles(File sourceDir) {
        FilenameFilter only = new OnlyExt("RPT");
        log.debug("Editing Split Files........");
        String[] filenames = sourceDir.list(only);
        try {
            for (int k = 0; k < filenames.length; k++) {
                FileInputStream fs = new FileInputStream(sourceDir.getAbsolutePath() + System.getProperty("file.separator") + filenames[k]);
                BufferedReader br = new BufferedReader(new InputStreamReader(fs));
                FileOutputStream fos = new FileOutputStream(sourceDir.getAbsolutePath() + System.getProperty("file.separator") + filenames[k] + ".LST");
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
                String strLine;
                int num = 0;
                int splitLine = 0;
                while ((strLine = br.readLine()) != null) {
                    num++;
                    if (strLine.length() == 1) {
                        splitLine = num;
                    }
    
                    bw.write(strLine);
                    bw.newLine();
                    bw.flush();
                }
                if (splitLine < 60) {
                    log.debug("File Name" + filenames[k] + "Line Number - " + splitLine);//This gives me the correct line number where the character is for each file.
                    br.readLine();
                }
    
                fs.close();
                br.close();
                fos.close();
                bw.close();
            }
        } catch (Exception asd) {
            log.debug(asd.getMessage());
        }
    }
    

    我不知道我做错了什么,但它看起来像是在我跳过之前被写入的文件。我如何做到这一点?

    编辑 Sample File

    1 回复  |  直到 6 年前
        1
  •  0
  •   Stanley Mungai    6 年前

    我通过在地图中存储每个文件的要跳过的行值来解决这个问题。然后遍历映射并跳过每个文件的行数。我想应该有个简单的方法。

    public static Map getSplitMap(File sourceDir) {
            FilenameFilter only = new OnlyExt("RPT");
            log.debug("Getting split Map........");
            Map<String, Integer> map = new HashMap();
            String[] filenames = sourceDir.list(only);
            try {
                for (int k = 0; k < filenames.length; k++) {
                    FileInputStream fs = new FileInputStream(sourceDir.getAbsolutePath() + System.getProperty("file.separator") + filenames[k]);
                    BufferedReader br = new BufferedReader(new InputStreamReader(fs));
    
                    String strLine;
                    int num = 0;
                    int splitLine = 0;
                    while ((strLine = br.readLine()) != null) {
                        num++;
                        if (strLine.length() == 1) {
                            splitLine = num;
    
                        }
                        if (splitLine < 60) {
                            map.put(filenames[k], splitLine);
                        }
                    }
    
                    fs.close();
                    br.close();
                }
            } catch (Exception asd) {
                log.debug(asd.getMessage());
            }
            return map;
        }
    

    然后跳过每个文件的行:

     public static void splitFile(File sourceDir) {
            Map<String, Integer> map = getSplitMap(sourceDir);
            try {
                for (Map.Entry<String, Integer> entry : map.entrySet()) {
                    FileInputStream fs = new FileInputStream(sourceDir.getAbsolutePath() + System.getProperty("file.separator") + entry.getKey());
                    BufferedReader br = new BufferedReader(new InputStreamReader(fs));
                    FileOutputStream fos = new FileOutputStream(sourceDir.getAbsolutePath() + System.getProperty("file.separator") + entry.getKey() + ".LST");
                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
                    for (int i = 1; i < entry.getValue(); i++) {
                        br.readLine();
                    }
                    String strLine;
                    while ((strLine = br.readLine()) != null) {
                        bw.write(strLine);
                        bw.newLine();
                        bw.flush();
                    }
                    fs.close();
                    br.close();
                    fos.close();
                    bw.close();
                    File files = new File(sourceDir.getAbsolutePath() + System.getProperty("file.separator") + entry.getKey());
                    files.delete();
                }
            } catch (Exception asd) {
                log.debug(asd.getMessage());
            }
        }