使用BufferedWriter在java中写入文件

使用BufferedWriter在java中写入文件,java,filewriter,random-sample,bufferedwriter,file-writing,Java,Filewriter,Random Sample,Bufferedwriter,File Writing,我试图从一个文件中随机抽取一些样本,进行一些操作,然后将它们写入另一个文件。但是我在用格雷普林方法写入文件时遇到了问题,可以在下面找到 在grepLine函数的while循环中,当我使用writer1.write时,会得到一个包含许多空行的空白文件。请尽量避免程序的逻辑。提前谢谢 public List<String> list1 = new ArrayList<String>(); private void init() throws Exception {

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

在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));
}        
}
这只是其中的一部分。原始文件有许多节点和边


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

在代码的这一部分中

 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();
您可能应该用
writer1.close()替换
writer.close()
由于您在条件测试后插入了对
writer1.newLine()
的调用,因此您仍然需要writer插入一个行跳过,这将导致您有一个包含许多行的空白文件

因此,首先将该部分代码更改为:

 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)) {
作者:

这样,如果您正在查找的单词是例如
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();


}
writer.close();
[编辑] 好的,既然条件满足了,那么在每行之后刷新writer怎么样

 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));
}

对于最后一个布尔参数
append
means

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

这将最终解决您的问题

如果(word.equals(lineCopy))
word是否曾经等于
lineCopy
?可以!我通过System.out.println()获得输出。我只是不在文件中保存很多时间和像这样的神秘错误,请使用try/with语法。但是,条件是满足的,因为我通过System.out.println()@KaushikS获得了输出。我编辑了我的答案:try a
writer1.flush()在换行指令之后;实际上,文件中有两个节点用逗号分隔。我只取第一个节点,并将其与另一个文件中的每一行进行比较,只写那些匹配的。刷新后,它只向具有相同开始节点和不同结束节点的文件写入三行。@Kaushik然后主要问题是由于缺少刷新。现在,您谈论的第二个问题与您正在实现的逻辑有关。也许你可以分享这两个文件的样本内容,并用其他信息编辑你的问题,这样我们就可以help@KaushikS非常欢迎你!!!很高兴与您一起使用
java
。回头见。最美好的祝福。
for(int j=0;j<100;j++){
    new RandomSampling().grepLineNumber("D:\\Dataset13.txt", list1.get(j));
}
BufferedWriter writer1 = new BufferedWriter(new 
    FileWriter("D:\\Dataset15.txt",false));
BufferedWriter writer1 = new BufferedWriter(new 
    FileWriter("D:\\Dataset15.txt",true));