csv java filewriter写入示例的不完整数据

9vw9lbht  于 5个月前  发布在  Java
关注(0)|答案(3)|浏览(79)

我有一个包含45311个示例的输入文件。在应用了我的编程任务之后,当我将它写回一个新文件时,它实际上只写了43371个示例。它成功运行了,但是我剩下的示例在哪里呢?

package kmean;

import java.io.IOException;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;

import weka.clusterers.SimpleKMeans;
import weka.core.Instances;

public class Kmean {

    public static BufferedReader readDataFile(String filename) {
        BufferedReader inputReader = null;

        try {
            inputReader = new BufferedReader(new FileReader(filename));
        } catch (FileNotFoundException ex) {
            System.err.println("File not found: " + filename);
        }

        return inputReader;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, Exception {
        BufferedWriter writer = null;

        try {
            writer = new BufferedWriter(new FileWriter("perturbed1.csv"));
        }
        catch (IOException e) {
        }
        SimpleKMeans kmeans = new SimpleKMeans();

        kmeans.setSeed(10);

        //important parameter to set: preserver order, number of cluster.
        kmeans.setPreserveInstancesOrder(true);
        kmeans.setNumClusters(5);

        BufferedReader datafile = readDataFile("elecNormNew.arff"); 
        // BufferedReader datafile = readDataFile("perturbed.csv"); 
        Instances data = new Instances(datafile);

        kmeans.buildClusterer(data);

        // This array returns the cluster number (starting with 0) for each instance
        // The array has as many elements as the number of instances
        int[] assignments = kmeans.getAssignments();
        StringBuilder sb = new StringBuilder();
        int i=0;
        for(int clusterNum : assignments) {
           // System.out.printf("Instance %d -> Cluster %d \n", i, clusterNum);
            sb.append(i);
            sb.append(";");
            sb.append(clusterNum);
            sb.append("\n");
            //System.out.printf("\n");
            i++;
        }
        System.out.println(sb.toString());           
        writer.write(sb.toString()+"\n");
        // TODO code application logic here
    }
}

字符串

noj0wjuj

noj0wjuj1#

关于缓冲文件写入器的一个简单的事实是,它们接收你的输入并保存它,直到缓冲区满了。这减少了I/O操作。最多一个写操作适合一个HDD写缓冲区,所以操作系统将整个缓冲区作为一个I/O命令。缺点是,如果在最后如果你不flush()缓冲区,其余的内容将不会写入磁盘。如果调用close(),任何挂起的字节将被写入,资源将被释放。在Java 7及更高版本中,您可以通过在try语句中打开流来使用自动关闭功能:

try(Inputstream is = new ...) {

字符串
如果您在代码之后可能有任何数据要写入,则可以使用.flush()来确保写入数据。
缓冲区大小默认设置为8 k,但这可能因JRE和版本而异。

oymdgrw7

oymdgrw72#

在写入所有数据后,您应该在最后调用writer.close()

zzwlnbp8

zzwlnbp83#

代替writer.write(sb.toString()+"\n");
尝试writer.write(sb.toString()+writer.newLine());
并完成你的写作进度与一个

writer.flush();
writer.close();

字符串
我自己也有一些问题,也许这就是问题所在。

相关问题