如何使用TreeMap缓存我正在从目录中的文本文件集合中读取的数据?

时间:2015-05-01 14:13:56

标签: java caching treemap

如何使用TreeMap缓存我正在从目录中的文本文件集中读取的数据?目前,我的程序从目录中的多个文本文件中读取数据,并将该信息保存在名为output.txt的文本文件中。我想缓存这些数据,以便以后使用它。我怎么能用TreeMap类做到这一点? 这些是键,值:TreeMap 我想要缓存的数据是(文件的日期,文件的时间,当前时间)。

以下是.text中包含的数据示例。文件。

和 是 如 在 奖 奖项 是 但 通过 centsales 对于 他 你好 她的 她的 他的 如果 在 到 是 它 我 矿 没有 不 的 上 要么 小号 这样 Ť 那 该 其 他们 然后 那里 这些 他们 这个 至 是 将 同 您 您的 你的 一个”- ä»-A»¬ ä½ ä½ä»¬ æ“ æ'们 一个 一个 和 是 如 在 是 但 通过 对于 如果 在 到 是 它 没有 不

import java.io.*;

public class CacheData {

    public static void main(String[] args) throws IOException {
        String target_dir = "C:\\Files";
        String output = "C:\\files\\output.txt";
        File dir = new File(target_dir);
        File[] files = dir.listFiles();

        // open the Printwriter before your loop
        PrintWriter outputStream = new PrintWriter(output);

        for (File textfiles : files) {
            if (textfiles.isFile() && textfiles.getName().endsWith(".txt")) {
                BufferedReader inputStream = null;

                // close the outputstream after the loop
                outputStream.close();

                try {
                    inputStream = new BufferedReader(new FileReader(textfiles));
                    String line;
                    ;
                    while ((line = inputStream.readLine()) != null) {
                        System.out.println(line);

                        // Write Content 
                        outputStream.println(line);

                    }

                } finally {
                    if (inputStream != null) {
                        inputStream.close();

                    }
                }
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

如果要分隔每个文件的行,可以执行以下操作:

Map<String, List<String>> filesAndContents = new TreeMap<>();

for (File textfiles : files) {
    if (textfiles.isFile() && textfiles.getName().endsWith(".txt")) {
        List<String> lines = new ArrayList<>();
        filesAndContents.put(textfiles.getName(), lines);
        BufferedReader inputStream = null;

        // close the outputstream after the loop
        outputStream.close();

        try {
            inputStream = new BufferedReader(new FileReader(textfiles));
            String line;
            while ((line = inputStream.readLine()) != null) {
                System.out.println(line);
                // Write Content 
                outputStream.println(line);
                lines.add(line);
            }
        } finally {
            if (inputStream != null) {
                 inputStream.close();
            }
        }                
    }
}    

此处,filesAndContents会将文件名映射到内容行(按阅读顺序)。由于使用了TreeMap,因此地图中的条目将按文件名的自然排序进行排序(即按字母顺序排列)。

根据您的评论,您似乎只想将文件元数据存储在缓存中。如果您使用的是Java 7/8,则可以从BasicFileAttributes获取此信息:

Map<String, BasicFileAttributes> filesAndMetadata = new TreeMap<>();

for (File textfiles : files) {
    if (textfiles.isFile() && textfiles.getName().endsWith(".txt")) {
        filesAndMetadata.put(textfiles.getName(),
            Files.readAttributes(textFiles.toPath(),
                BasicFileAttributes.class));
    // ....

如果您还需要文件的所有者,可以通过FileOwnerAttributeView这样获得:

FileOwnerAttributeView ownerAttributeView = Files.getFileAttributeView(
    textFiles.toPath(),
    FileOwnerAttributeView.class);

您也可以考虑创建自己的包装类,以保存缓存所需的所有元数据。