尝试一次写入多个文件 - Java

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16447097/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 22:58:43  来源:igfitidea点击:

Trying to Write Multiple Files at Once - Java

javafile-iodictionary

提问by dsiebert424

I am trying to split a dictionary file that I have into multiple dictionaries of different lengths, for example if I want take it and put it into smaller dictionaries of length 2, 3, 4, ..... n, where I can then search them quicker. When I say quicker I mean that I will know the input length and therefore accessing the corresponding length dictionary (a fraction of the whole) will mean quicker accesses. This is my current implementation that generates the files but doesn't write to them like I desire. Ideally, all words of length 2 for example will be written into the length2 text file. Anyone have any suggestions?

我正在尝试将我拥有的字典文件拆分为多个不同长度的字典,例如,如果我想将其放入长度为 2、3、4、..... n 的较小字典中,然后我可以更快地搜索它们。当我说更快时,我的意思是我将知道输入长度,因此访问相应的长度字典(整体的一小部分)将意味着更快的访问。这是我当前的实现,它生成文件但不像我想要的那样写入它们。理想情况下,例如长度为 2 的所有单词都将写入 length2 文本文件。有人有什么建议吗?

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {
    FileReader fr = new FileReader("dictionary.txt");
    PrintWriter l2 = new PrintWriter("dictionary_length2.txt", "UTF-8");
    PrintWriter l3 = new PrintWriter("dictionary_length3.txt", "UTF-8");
    PrintWriter l4 = new PrintWriter("dictionary_length4.txt", "UTF-8");
    PrintWriter l5 = new PrintWriter("dictionary_length5.txt", "UTF-8");
    PrintWriter l6 = new PrintWriter("dictionary_length6.txt", "UTF-8");
    PrintWriter l7 = new PrintWriter("dictionary_length7.txt", "UTF-8");
    PrintWriter l8 = new PrintWriter("dictionary_length8.txt", "UTF-8");
    PrintWriter l9 = new PrintWriter("dictionary_length9.txt", "UTF-8");
    PrintWriter l10 = new PrintWriter("dictionary_length10.txt", "UTF-8");
    PrintWriter l11 = new PrintWriter("dictionary_lengty11.txt", "UTF-8");
    PrintWriter l12 = new PrintWriter("dictionary_length12.txt", "UTF-8");
    PrintWriter l13 = new PrintWriter("dictionary_length13.txt", "UTF-8");
    PrintWriter l14 = new PrintWriter("dictionary_length14.txt", "UTF-8");
    PrintWriter l15 = new PrintWriter("dictionary_length15.txt", "UTF-8");
    PrintWriter l16 = new PrintWriter("dictionary_length16.txt", "UTF-8");
    PrintWriter l17 = new PrintWriter("dictionary_length17.txt", "UTF-8");
    PrintWriter l18 = new PrintWriter("dictionary_length18.txt", "UTF-8");
    PrintWriter l19 = new PrintWriter("dictionary_length19.txt", "UTF-8");
    PrintWriter l20 = new PrintWriter("dictionary_length20.txt", "UTF-8");
    PrintWriter l21 = new PrintWriter("dictionary_length21.txt", "UTF-8");

    BufferedReader tr = new BufferedReader(fr);
    String temp;
    int temp_length;

    for(int i = 0; i < 60388; i++){
        temp = new String(tr.readLine());
        temp_length = temp.length();
        if(temp_length == 2)
            l2.println(temp);
        if(temp_length == 3)
            l3.println(temp);
        if(temp_length == 4)
            l4.println(temp);
        if(temp_length == 5)
            l5.println(temp);
        if(temp_length == 6)
            l6.println(temp);
        if(temp_length == 7)
            l7.println(temp);
        if(temp_length == 8)
            l8.println(temp);
        if(temp_length == 9)
            l9.println(temp);
        if(temp_length == 10)
            l10.println(temp);
        if(temp_length == 11)
            l11.println(temp);
        if(temp_length == 12)
            l12.println(temp);
        if(temp_length == 13)
            l13.println(temp);
        if(temp_length == 14)
            l14.println(temp);
        if(temp_length == 15)
            l15.println(temp);
        if(temp_length == 16)
            l16.println(temp);
        if(temp_length == 17)
            l17.println(temp);
        if(temp_length == 18)
            l18.println(temp);
        if(temp_length == 19)
            l19.println(temp);
        if(temp_length == 20)
            l20.println(temp);
        if(temp_length == 21)
            l21.println(temp);
    }

    tr.close();
    l2.close();
    l3.close();
    l4.close();
    l5.close();
    l6.close();
    l7.close();
    l8.close();
    l9.close();
    l10.close();
    l11.close();
    l12.close();
    l13.close();
    l14.close();
    l15.close();
    l16.close();
    l17.close();
    l18.close();
    l19.close();
    l20.close();
    l21.close();
    System.out.println("Complete.");
}
}

回答by user2246674

Tangental "answer" follows. (This shouldalso print out contents to the files, unless I'm missing something very basic.)

切线“答案”如下。(这也应该将内容打印到文件中,除非我遗漏了一些非常基本的东西。)



Whenever there is a set of variables in the form xN(e.g. l2, l3, l22), they should usuallybe replaced with a List collection type such as an ArrayList.

只要表单中有一组变量xN(例如l2, l3, l22),它们通常应该替换为 List 集合类型,例如ArrayList

This is just an example to show howcan be reduce duplication and fixed bounds:

这只是一个示例,用于展示如何减少重复和固定边界:

int MAX_WORD_LEN = 22; // making this dynamic left as an excercise
List<PrintWriter> writers = new ArrayList<PrintWriter>();

for (int i = 0; i <= MAX_WORD_LEN; i++) {
    PrintWriter w = new PrintWriter("dictionary_length" + i + ".txt", "UTF-8");
    writers.Add(w);
}

String line;
while ((line = tr.readLine()) != null) {
   int len = line.length();
   if (len < writers.size()) {
       writers.get(len).println(line);
   }
}

for (PrintWriter w : writers) {
    w.close();
}

Slight adjustments can be made to not create a "0" or "1" file.

可以稍作调整以不创建“0”或“1”文件。