【问题标题】:java filewriter write incomplete data of instancejava filewriter写入实例的不完整数据
【发布时间】:2015-06-12 13:22:31
【问题描述】:

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

package kmean;
//package greenblocks.statistics;

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;

/**
 *
 * @author admin
 */
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
    }
}

【问题讨论】:

    标签: java file csv inputstream filewriter


    【解决方案1】:

    关于缓冲文件写入器的一个简洁事实是,它们接收您的输入并保留它,直到缓冲区已满。这减少了 i/o 操作。一个写操作充其量适合一个硬盘写缓冲区,因此操作系统将整个缓冲区作为一个 i/o 命令。缺点是如果最后如果你没有flush()这个缓冲区,剩下的内容将不会被写入磁盘。如果您调用close(),任何挂起的字节都将被写入并释放资源。在 java 7 及更高版本中,您只需在 try 语句中打开流即可使用自动关闭功能:

    try(Inputstream is = new ...) {
    

    如果您的代码之后可能有任何数据要写入,您可以使用.flush() 确保数据已写入。

    缓冲区大小默认设置为 8k,但这可能与 jre 和版本有关。

    【讨论】:

      【解决方案2】:

      你应该在写完所有数据后最后调用writer.close()

      【讨论】:

        【解决方案3】:

        writer.write(sb.toString()+"\n");

        试试writer.write(sb.toString()+writer.newLine());

        并用

        完成你的写作进度
        writer.flush();
        writer.close();
        

        我自己对“\n”有一些问题,这可能就是问题所在。

        【讨论】:

          猜你喜欢
          • 2016-01-30
          • 1970-01-01
          • 2020-08-28
          • 1970-01-01
          • 2020-09-29
          • 2013-07-19
          • 2011-12-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多