用于根据块大小将文本文件拆分为块的java代码

时间:2014-10-12 10:38:40

标签: java file chunks chunking

我需要将给定的文本文件拆分成相同大小的块并将它们存储到数组中。输入是同一文件夹中的一组许多文本文件。我使用以下代码:

int inc = 0;
File dir = new File("C:\\Folder");
    File[] files = dir.listFiles();
    for (File f : files) {
        if(f.isFile()) {
            BufferedReader inputStream = null;
            try {
                inputStream = new BufferedReader(new FileReader(f));
                String line;

                while ((line = inputStream.readLine()) != null) {
                    String c[] = splitByLength(line, chunksize);
                    for (int i=0;i<c.length;i++) {
                        chunk[inc] = c[i];
                        inc++;
                    }
                }
            }
            finally {
                if (inputStream != null) {
                    inputStream.close();
                }
            }
        }
    }

public static String[] splitByLength(String s, int chunkSize) {  

    int arraySize = (int) Math.ceil((double) s.length() / chunkSize);  
    String[] returnArray = new String[arraySize];  
    int index = 0;  
    for(int i=0; i<s.length(); i=i+chunkSize) {  
        if(s.length() - i < chunkSize) {  
            returnArray[index++] = s.substring(i);  
        }   
        else {  
            returnArray[index++] = s.substring(i, i+chunkSize);  
        }  
    }
    return returnArray;  
}

这里的块值存储在&#34; chunk&#34;阵列。但这里的问题是因为我使用readLine()命令来解析文本文件,只有当块大小小于一行中的字符数时,获得的结果才是正确的。让我们说每行有10个字符,文件中的行数是5.然后,如果我提供任何大于10的值的块大小,它总是将文件分成10个块,每个块中的每一行。

例如,考虑一个包含以下内容的文件,

abcdefghij
abcdefghij
abcdefghij
abcdefghij
abcdefghij

如果块大小= 5那么,

abcde | fghij | abcde | fghij | abcde | fghij | abcde | fghij | abcde | fghij |

如果块大小= 10那么,

abcdefghij | abcdefghij | abcdefghij | abcdefghij | abcdefghij |

如果块大小&gt; 10然后我的代码也提供与以前相同的内容,

abcdefghij | abcdefghij | abcdefghij | abcdefghij | abcdefghij |

我尝试使用RandomAccessFile和FileChannel,但我无法获得所需的结果...... 任何人都可以帮我解决这个问题吗?谢谢..

1 个答案:

答案 0 :(得分:0)

那是因为BufferedReader.readLine()只读取一行而不是整个文件。

我认为换行符\r\n不属于您感兴趣的正常内容。

也许这有帮助。

// ...
StringBuilder sb = new StringBuilder(); 
String line;
while ((line = inputStream.readLine()) != null) {
    sb.append(line);

    // if enough content is read, extract the chunk
    while (sb.length() >= chunkSize) {

        String c = sb.substring(0, chunkSize);
        // do something with the string

        // add the remaining content to the next chunk
        sb = new StringBuilder(sb.substring(chunkSize));
    }
}
// thats the last chunk
String c = sb.toString();
// do something with the string