Matériel Java qui se produit régulièrement. Il a été décidé de sortir certaines informations sous forme de journal, mais après avoir envisagé de le sortir dans la base de données ou dans un fichier, j'ai décidé de sortir le journal dans un fichier, donc un mémo lors de l'examen préalable. La prémisse est Linux.
Les points de vue sont complètement différents, mais énumérer comme vous pouvez l'imaginer
J'ai donc créé un programme qui génère un journal d'une ligne composé de temps et de texte dans un fichier. Le fichier est généré mensuellement. Il semble facile d'utiliser la méthode synchronisée comme contrôle exclusif, j'ai donc choisi cette méthode. Bien sûr, il est important de ne pas utiliser le fichier journal autrement que par cette méthode.
LogWriter.java
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.io.*;
public class LogWriterNew{
public static SimpleDateFormat sdf = new SimpleDateFormat("YYYY/MM/dd HH:mm:ss");
public static synchronized void writeLog(String text){
Calendar calendar = Calendar.getInstance();
String OUTPUT_DIR= "out";
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
Date date = calendar.getTime();
String yearStr = String.format("%04d", year);
String monthStr = String.format("%02d", month);
//Sortie de journal
String file_name = OUTPUT_DIR + File.separator + yearStr + "_" + monthStr + ".log";
File file = new File(file_name);
FileWriter fw = null;
String line = sdf.format(date) + "," + text;
try{
fw = new FileWriter(file, true);
fw.write(line + "\n");
}catch(IOException e){
e.printStackTrace();
}finally {
if(fw != null) {
try {
fw.close();
}catch(Exception e2) {
e2.printStackTrace();
}
}
}
}
public static void main(String[] argv){
for(int i=0; i<1000;i++){
System.out.println(i);
writeLog(i + "aaa");
}
}
}
Comme ça.
2020/05/23 08:25:02,0aaa
2020/05/23 08:25:02,1aaa
2020/05/23 08:25:02,2aaa
2020/05/23 08:25:02,3aaa
2020/05/23 08:25:02,4aaa
2020/05/23 08:25:02,5aaa
2020/05/23 08:25:02,6aaa
2020/05/23 08:25:02,7aaa
2020/05/23 08:25:02,8aaa
2020/05/23 08:25:02,9aaa
2020/05/23 08:25:02,10aaa
・ ・ ・ ・
Sur un PC de petite taille, un débit de `` 850 caisses / s '' a été obtenu.
Comme FileWriter ne peut pas spécifier le code de caractère, j'ai essayé de rendre possible la spécification du code de caractère à l'aide de OutputStreamWriter.
//Méthode de sortie du journal
public static synchronized boolean writeLog(String fileName, String date, String[] items){
for(int i=0; i<items.length; i++){
items[i] = escape(items[i]);
}
String line = date + "," + String.join(",", items);
File file = new File(fileName);
PrintWriter pw = null;
try {
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), "Windows-31j")));
pw.println(line);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (pw != null) {
try {
pw.close();
} catch (Exception e2) {
e2.printStackTrace();
return false;
}
}
}
La prochaine fois, je vérifierai si le contrôle exclusif est réellement effectué par ce synchronisé.