使用 BufferedWriter 写入 java 中的文件

Writing to file in java using BufferedWriter

我正在尝试从文件中随机抽取一些样本并进行一些操作,然后将它们写入另一个文件。但是我在使用 grepLine 方法写入文件时遇到了问题,可以在下面找到。

在 grepLine 函数的 while 循环中,当我使用 writer1.write 时,我得到一个包含许多空行的空白文件。请尽量避开程序的逻辑。提前致谢。

public   List<String> list1 = new ArrayList<String>();

private void init() throws Exception {

    BufferedWriter writer = new BufferedWriter(new FileWriter("D:\Dataset14.txt",false));

    try {
        lines = Files.readAllLines(Paths.get(fileName),
                StandardCharsets.UTF_8);
    } catch (IOException e) {
        System.out.println("File can't be opened.");
    }
for(int i=0;i<100;i++)
{
    int randomWordIndex = getRandomNumber(1, lines.size());
    String eachLine=lines.get(randomWordIndex);
    String lineArray= eachLine.substring(0, eachLine.indexOf(","));
    list1.add(lineArray);
    writer.write(lineArray);
    writer.newLine(); 

}
writer.close();

for(int j=0;j<100;j++){
    new RandomSampling().grepLineNumber("D:\Dataset13.txt", list1.get(j));
}}

public int grepLineNumber(String file, String word,) throws Exception {
  BufferedWriter writer1 = new BufferedWriter(new FileWriter("D:\Dataset15.txt",false));

    BufferedReader buf = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream(file))));


    String line;
    String lineCopy;
    int totalLines= 100000;

    int height,width;

    while ((line = buf.readLine()) != null)   {
        lineCopy=line;
        String [] LineArray=lineCopy.split(",");
        lineCopy=LineArray[0];
        if (word.equals(lineCopy)) {
            System.out.println(line);
            writer1.write(line);
        }
        writer1.newLine();
    }
    writer1.close();
    buf.close();
    return -1;
}

private int getRandomNumber(int min, int max) {
    return min + (int) (Math.random() * ((max - min) + 1));
}        
}

Dataset13.txt :

0,0,1,1
0,0,2,2
0,0,469,469
2,2,0,0
2,2,3,3
3,3,2,2
3,3,4,4
3,3,419,419
3,3,422,422
4,4,3,3
4,4,5,5
4,4,98,98
4,4,420,420
5,5,4,4
5,5,6,6
5,5,98,98
6,6,1,1
6,6,5,5
7,7,8,8
7,7,9,9
7,7,79,79
8,8,7,7
8,8,33,33
9,9,7,7
9,9,10,10
9,9,84,84
10,10,9,9
10,10,11,11
10,10,84,84
10,10,110,110
11,11,10,10
11,11,12,12
11,11,110,110
12,12,11,11
12,12,13,13
12,12,95,95
12,12,108,108
13,13,12,12
13,13,14,14
13,13,94,94
13,13,95,95
14,14,13,13
14,14,15,15
14,14,16,16
14,14,77,77
15,15,14,14
16,16,14,14
16,16,17,17
17,17,16,16
17,17,18,18
17,17,77,77
17,17,3254,3254
18,18,17,17
18,18,19,19
18,18,3254,3254
19,19,18,18
19,19,20,20
19,19,23,23
20,20,19,19
20,20,21,21
20,20,22,22
21,21,20,20
22,22,20,20
23,23,19,19
23,23,24,24
23,23,25,25
24,24,23,23
25,25,23,23
25,25,26,26
25,25,27,27
26,26,25,25
27,27,25,25
27,27,28,28
27,27,29,29
28,28,27,27
29,29,27,27
29,29,30,30
29,29,3255,3255
30,30,29,29
30,30,31,31
30,30,3247,3247
30,30,3253,3253
31,31,30,30
31,31,32,32
31,31,3246,3246
32,32,31,31
32,32,33,33
32,32,2203,2203
33,33,8,8
33,33,32,32
33,33,34,34
34,34,33,33
35,35,36,36
35,35,50,50
35,35,1199,1199
36,36,35,35
36,36,37,37
36,36,35885,35885
36,36,1645159,1645159
37,37,36,36
37,37,38,38
37,37,1641586,1641586
38,38,37,37
38,38,39,39
38,38,1641586,1641586
39,39,38,38
39,39,40,40
39,39,1641587,1641587
40,40,39,39
40,40,41,41
40,40,1641577,1641577
41,41,40,40
41,41,42,42
41,41,1641355,1641355
42,42,41,41

这只是其中的一部分。原始文件有很多节点和边。

我只将第一个节点写入下一个文件。

在您的代码的这一部分

 while ((line = buf.readLine()) != null)   {
    lineCopy=line;
    String [] LineArray=lineCopy.split(",");
    lineCopy=LineArray[0];
    if (word.equals(lineCopy)) {
        System.out.println(line);
        writer1.write(line);


    }

    writer1.newLine();


}
writer.close();

您可能应该将 writer.close() 替换为 writer1.close();,因为代码中出现的唯一其他编写器变量是 init 方法中的局部变量,所以我认为这只是一个输入错误。

由于您是在测试条件后插入对 writer1.newLine() 的调用,因此您仍将让作者插入一个跳行,这会导致您有一个包含多行的空白文件。

所以先把那段代码改成:

 while ((line = buf.readLine()) != null)   {
    lineCopy=line;
    String [] LineArray=lineCopy.split(",");
    lineCopy=LineArray[0];
    if (word.equals(lineCopy)) {
        System.out.println(line);
        writer1.write(line);
        writer1.newLine();
    }

现在,您可能会得到一个没有空行的空白文件。您需要调试并查看为什么条件永远不会满足,这可能是您遇到了案例问题,所以只需替换

if (word.equals(lineCopy)) {

作者:

 if (word.equalsIgnoreCase(lineCopy)) {
    ....
 }

这样,如果您要查找的词是 Test,但文件中的词是 tEsT 或任何其他字母大写或小写组合,它仍会找到它。

您的问题可能还有其他原因,但如果不进一步解释您的代码,将很难进行调查

[编辑] 好的,既然满足了条件,那么在每一行之后刷新编写器怎么样:

 while ((line = buf.readLine()) != null)   {
    lineCopy=line;
    String [] LineArray=lineCopy.split(",");
    lineCopy=LineArray[0];
    if (word.equals(lineCopy)) {
        System.out.println(line);
        writer1.write(line);
        writer1.newLine();
        writer1.flush();
    }

还有这个:

for(int j=0;j<100;j++){
    new RandomSampling().grepLineNumber("D:\Dataset13.txt", list1.get(j));
}

表示它将调用 grepLineNumber 方法的次数与 j 个值的次数相同,即 100 次,并且每次只处理一个节点值。这就是为什么你只有三行写入你的文件。更改以下行

BufferedWriter writer1 = new BufferedWriter(new 
    FileWriter("D:\Dataset15.txt",false));

BufferedWriter writer1 = new BufferedWriter(new 
    FileWriter("D:\Dataset15.txt",true));

对于最后一个布尔参数append表示

  • 如果为真,它将在文件末尾追加新的写入操作
  • 如果为 false,它将生成一个新文件。

这应该最终解决了您的问题