75906


プロパティファイルに書き込む際に上に行のような部分が自動でついてきます。その部分をなにかフォーマット的なものや設定でJava上で削除することはできないのでしょうか。

fruit.csvファイル

[![fruit.csvファイル](https://i.stack.imgur.com/da3ED.png)](https://i.stack.imgur.com/da3ED.png)

count.prppertyファイル

[![count.prppertyファイル](https://i.stack.imgur.com/Cbijs.png)](https://i.stack.imgur.com/Cbijs.png)

[code]

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.io.Writer;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Properties;
    public class logPractice {
    
        public static void main(String[] args) {
            // TODO 自動生成されたメソッド・スタブ
            Writer fw  =null;
            Map<String, Integer> m = new LinkedHashMap<String, Integer>();
            File f = new File("fruit.csv");
            FileInputStream input =null;
            int v = 0;
            Properties p = new Properties();
    
            try {
                input = new FileInputStream(f);
            } catch (FileNotFoundException e1) {
                // TODO 自動生成された catch ブロック
                e1.printStackTrace();
            }
            InputStreamReader is =null;
            try {
                is = new InputStreamReader(input, "SJIS");
            } catch (UnsupportedEncodingException e1) {
                // TODO 自動生成された catch ブロック
                e1.printStackTrace();
            }
            BufferedReader br = new BufferedReader(is);
    
            String line;
            try {
    
                // 1行ずつCSVファイルを読み込む
                while ((line = br.readLine()) != null) {
    
                    String[] data = line.split(",", 0); // 行をカンマ区切りで配列に変換
    
                    for (String elem : data) {
    
                        if (m.containsKey(elem)) {
                            // Mapに登録済み
                            v = m.get(elem) + 1;
                        } else {
                            //Mapに入れる前に数字かどうか判断をする
    
                            // Mapに未登録
                            v = 1;
                        }
                        try {
                            Integer.parseInt(elem);
                        } catch (NumberFormatException e) {
                            m.put(elem, v);
                        }
    
                    }
                }
                fw = new FileWriter("count.properties");
                for(Map.Entry<String, Integer> s : m.entrySet()) {
                    p.setProperty(s.getKey(),s.getValue().toString());//.toString()使わないとStringとIntegerで型が違うからエラーだった
                }
                p.store(fw,"");
    
            } catch (IOException e) {
                System.out.println(e);
            }finally {
                try {
                    br.close();
                    fw.close();
                } catch (IOException e) {
                    // TODO 自動生成された catch ブロック
                    e.printStackTrace();
                }
            }
    
        }
    }
    
[/code]


CC BY-SA 4.0
2021-05-17T05:01:09.623
75888
2021-05-18T02:16:50.913
2021-05-17T05:07:34.287
3060
41769
question
java
Java propertyファイルの作成について


一行目の `#` は、`p.store(fw, null);` とすることで出力しないようにできます。  
しかし、二行目の `#(日付)` は必ず出力されてしまいます。  
<https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/Properties.java#L914-L918>

Key や Value に記号( `=:#!` )や改行など( `\r\n\f\t` )を含まないのであれば、Properties
クラスの代わりに、BufferedWriter を使ってファイルに書き出すことで、回避できます。

[code]

    try (BufferedWriter bw = Files.newBufferedWriter​(Paths.get("count.properties")) {
      for(Map.Entry<String, Integer> s : m.entrySet()) {
        bw.write(s.getKey());
        bw.write("=");
        bw.write(s.getValue());
        bw.newLine();
      }
    }
    
[/code]


CC BY-SA 4.0
2021-05-18T02:16:50.913
75906
2021-05-18T02:16:50.913
14334
75888
answer