Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将HashMap属性保存到属性文件,然后将这些属性加载回HashMap_Java_Hashmap_Properties File - Fatal编程技术网

Java 将HashMap属性保存到属性文件,然后将这些属性加载回HashMap

Java 将HashMap属性保存到属性文件,然后将这些属性加载回HashMap,java,hashmap,properties-file,Java,Hashmap,Properties File,因此,我在将HashMap属性存储到properties文件时遇到了一个强制转换问题,因为HashMap的键是一个不能强制转换到java.lang.String的对象,因为属性必须是(String,String),而我的HashMap是(object,Long) 我只想将HashMap的内容保存到一个文件中,以便下次运行程序时将这些内容加载回HashMap 我经历了大量毫无意义的尝试,试图用保存前包含的对象重新填充HashMaps。我试图想出一种简单的方法将对象转换为字符串,我可以这样做,但由于

因此,我在将
HashMap
属性存储到
properties
文件时遇到了一个强制转换问题,因为
HashMap
的键是一个不能强制转换到
java.lang.String
的对象,因为属性必须是
(String,String)
,而我的
HashMap
(object,Long)

我只想将
HashMap
的内容保存到一个文件中,以便下次运行程序时将这些内容加载回
HashMap

我经历了大量毫无意义的尝试,试图用保存前包含的对象重新填充
HashMaps
。我试图想出一种简单的方法将对象转换为字符串,我可以这样做,但由于
属性
哈希映射
没有索引,我无法将这些字符串更改回它们需要的对象。如何做到这一点

以下是我试图做的:

    public File savedHashMaps = new File("SavedHashMaps.list");
// in my case, the object is 'Location' from an implemented API
public Map<Location, Long> map = new HashMap<Location, Long>();

public void saveMaps() {
    Properties prop = new Properties();
    try {
        if (!map.isEmpty()) {
            prop.load(new FileInputStream(savedHashMaps));
            prop.putAll(map);
            prop.store(new FileOutputStream(savedHashMaps), null);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void loadMaps() {
    Properties prop = new Properties();
    try {
        prop.load(new FileInputStream(savedHashMaps));
        if (!prop.isEmpty()) {
            map.putAll((Map)prop);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public File savedHashMaps=新文件(“savedHashMaps.list”);
//在我的例子中,对象是来自已实现API的“位置”
publicmap=newhashmap();
公共void saveMaps(){
Properties prop=新属性();
试一试{
如果(!map.isEmpty()){
加载(新文件输入流(savedHashMaps));
道具putAll(地图);
prop.store(新文件输出流(savedhashmap),null);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共void loadMaps(){
Properties prop=新属性();
试一试{
加载(新文件输入流(savedHashMaps));
如果(!prop.isEmpty()){
map.putAll((map)道具);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}

使用
对象输入/输出流

public File savedHashMaps = new File("SavedHashMaps.list");
public Map<Location, Long> map = new HashMap<Location, Long>();

public void saveMaps() {
    try {
        ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream(savedHashMaps));
        oos.writeObject(map);
        oos.close();
    } catch (Exception e) {
        // Catch exceptions
    }
}

public void loadMaps() {
    try {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(savedHashMaps));
        Object readMap = ois.readObject();
        if(readMap != null && readMap instanceof HashMap) {
            map.putAll((HashMap) readMap);
        }
        ois.close();
    } catch (Exception e) {
        // Catch exceptions
    }
}
public File savedHashMaps=新文件(“savedHashMaps.list”);
publicmap=newhashmap();
公共void saveMaps(){
试一试{
ObjectOutputStream oos=新的ObjectOutputStream(新文件OutputStream(savedHashMaps));
oos.writeObject(映射);
oos.close();
}捕获(例外e){
//捕获异常
}
}
公共void loadMaps(){
试一试{
ObjectInputStream ois=新ObjectInputStream(新文件InputStream(savedHashMaps));
Object readMap=ois.readObject();
if(readMap!=null&&readMap instanceof HashMap){
putAll((HashMap)readMap);
}
ois.close();
}捕获(例外e){
//捕获异常
}
}

这是来自内存的,很抱歉出现错误,但是这将保存并重新加载所有位置、长映射。另外需要注意的是,Location类必须实现
Serializable
(或者有一个实现它的超类)(它是一个标记接口(请参见java.dzone.com/articles/marker interfaces java),所以您只需添加
implements Serializable
)。

属性文件不是保存数据的正确方法(
Map
)。您应该提出自己的数据文件格式,以适合要保存/检索的数据。为此,您最好使用
ObjectInputStream
ObjectOutputStream
而不是属性格式,除非您希望另一个程序读取/写入它。如果对象不存在,您会怎么做可序列化?您必须实现自己的保存/检索对象的方法。例如在XML中。至于实现,这将取决于文件的内容。可以实现一个使用[Reflection API]的[因此,您可以保存任何对象,但这在小程序中不起作用。我最终创建了一个serializedLocation类,该类刚刚实现了serializable,并处理了与标准位置对象和序列化位置对象之间的转换。我使其正常工作!感谢您的帮助!