私のJavaコードは、twitterのようなストリームデータを受け取ります。データを保存する必要があります。各ファイルごとに10000レコード。したがって、新しいファイルを作成してからデータを書き込むには、file writer
とbuffered writer
を再作成する必要があります。java.io.IOException:ストリームが閉じられました。ストリームデータを複数のファイルに書き込む最善の方法は何ですか?
// global variables
String stat;
long counter = 0;
boolean first = true;
Date date;
SimpleDateFormat format;
String currentTime;
String fileName;
BufferedWriter bw = null;
FileWriter fw = null;
public static void main(String[] args) {
String dirToSave = args[0];
String fileIdentifier = args[1];
createFile(dirToSave, fileIdentifier);
StatusListener listener = new StatusListener() {
@Override
public void onStatus(Status status) {
stat = TwitterObjectFactory.getRawJSON(status);
try {
if(bw!=null){
bw.write(stat + "\n");
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
counter++;
if (counter == 10000) {
createFile(dirToSave, fileIdentifier);
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
counter = 0;
}
}
};
TwitterStream twitterStream = new TwitterStreamFactory(confBuild.build()).getInstance();
twitterStream.addListener(listener);
// twitterStream.filter(filQuery);
}
public static void createFile(String path, String fileIdentifier) {
date = new Date();
format = new SimpleDateFormat("yyyyMMddHHmm");
currentTime = format.format(date);
fileName = path + "/" + fileIdentifier + currentTime + ".json";
// if there was buffer before, flush & close it first before creating new file
if (!first) {
try {
bw.flush();
bw.close();
fw.close();
} catch (IOException ex) {
Logger.getLogger(LocalFile_All_en.class
.getName()).log(Level.SEVERE, null, ex);
}
} else {
first = false;
}
// create a new file
try {
fw = new FileWriter(fileName);
bw = new BufferedWriter(fw);
} catch (IOException ex) {
Logger.getLogger(Stack.class
.getName()).log(Level.SEVERE, null, ex);
}
}
ただし、数時間後にはいつもエラーが発生します。
SEVERE: null
java.io.IOException: Stream closed
EDIT:エラーメッセージは、これらのコードは、私のコードの問題であり、どのようなエラーに
if (counter == 10000) {
createFile(dirToSave, fileIdentifier);
...
と
bw.flush();
を投げると言いますか?またはこのようなストリームデータを書き込むための良い方法がありますか?
マルチスレッドプログラムですか? – Alex
@Alexいいえ、それは1つのスレッドだけです。ストリームデータの受信とファイルへの格納。 –
メソッド 'onStatus'はどのように呼び出されていますか?どの行が例外をスローしますか? – Alex