java filewriter写入不完整的实例数据
java filewriter write incomplete data of instance
我有一个包含 45311 个实例的输入文件。在应用我的编程任务之后。当我将它写回新文件时,它实际上写了 43371 个实例 only.it 是 运行 成功但是我剩下的实例在哪里。
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
}
}
你应该在写完所有数据后调用writer.close()
。
而不是writer.write(sb.toString()+"\n");
尝试writer.write(sb.toString()+writer.newLine());
并以
完成你的写作进度
writer.flush();
writer.close();
我自己在使用“\n”时遇到了一些问题,也许这就是问题所在。
关于缓冲文件编写器的一个简单事实是,它们接受您的输入并保留它,直到缓冲区已满。这减少了 i/o 操作。最多一次写入操作适合一个硬盘写入缓冲区,因此操作系统将整个缓冲区作为一个 i/o 命令。缺点是如果最后如果不flush()
缓冲区的话,剩下的内容将不会写入磁盘。如果您调用 close()
任何挂起的字节将被写入并释放资源。在 java 7 及更高版本中,您只需在 try
语句中打开流即可使用自动关闭功能:
try(Inputstream is = new ...) {
如果你的代码后面可能有数据要写入,可以使用.flush()
来保证数据写入。
缓冲区大小默认设置为8k,但这可能与jre和版本有关。
我有一个包含 45311 个实例的输入文件。在应用我的编程任务之后。当我将它写回新文件时,它实际上写了 43371 个实例 only.it 是 运行 成功但是我剩下的实例在哪里。
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
}
}
你应该在写完所有数据后调用writer.close()
。
而不是writer.write(sb.toString()+"\n");
尝试writer.write(sb.toString()+writer.newLine());
并以
完成你的写作进度writer.flush();
writer.close();
我自己在使用“\n”时遇到了一些问题,也许这就是问题所在。
关于缓冲文件编写器的一个简单事实是,它们接受您的输入并保留它,直到缓冲区已满。这减少了 i/o 操作。最多一次写入操作适合一个硬盘写入缓冲区,因此操作系统将整个缓冲区作为一个 i/o 命令。缺点是如果最后如果不flush()
缓冲区的话,剩下的内容将不会写入磁盘。如果您调用 close()
任何挂起的字节将被写入并释放资源。在 java 7 及更高版本中,您只需在 try
语句中打开流即可使用自动关闭功能:
try(Inputstream is = new ...) {
如果你的代码后面可能有数据要写入,可以使用.flush()
来保证数据写入。
缓冲区大小默认设置为8k,但这可能与jre和版本有关。