Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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 更新文件中的行_Java - Fatal编程技术网

Java 更新文件中的行

Java 更新文件中的行,java,Java,我以前从未使用过文件,但我试图实现的是能够获取和设置数据 我已经有了获取数据的方法,而且效果很好。(这也可能不是最好的方式) 我还有一种设置数据的方法。但问题是,当我设置数据时,它不仅起作用,而且数据本身也会复制 以下是我的变量: private File file; private FileReader fr; private BufferedReader reader; private Formatter f; private Map<String, String> dataL

我以前从未使用过文件,但我试图实现的是能够获取和设置数据

我已经有了获取数据的方法,而且效果很好。(这也可能不是最好的方式) 我还有一种设置数据的方法。但问题是,当我设置数据时,它不仅起作用,而且数据本身也会复制

以下是我的变量:

private File file;
private FileReader fr;
private BufferedReader reader;
private Formatter f;

private Map<String, String> dataList = new HashMap<String, String>(); 
private List<String> itemList;
私有文件;
私人文件阅读器;
专用缓冲读卡器;
专用格式化程序f;
私有映射数据列表=新HashMap();
私人清单项目清单;
这是我用来检索数据的:

public void getData() {
    String line = null;
    openFileReader();
    BufferedReader buffReader = new BufferedReader(fr);
    StringBuffer sb = new StringBuffer();
    try {
        while((line = buffReader.readLine()) != null) {
            sb.append(line);
            sb.append("\n");
        }
        String[] items = sb.toString().split("\n");
        itemList = new ArrayList<String>(Arrays.asList(items));
        for(String item : itemList) {
            String[] itemData = item.split(":");
            if(!(buffReader.readLine() == null)) {
                dataList.put(itemData[0], itemData[1]);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    closeFileReader();
}
public void getData(){
字符串行=null;
openFileReader();
BufferedReader buffReader=新的BufferedReader(fr);
StringBuffer sb=新的StringBuffer();
试一试{
而((line=buffReader.readLine())!=null){
某人附加(行);
某人附加(“\n”);
}
String[]items=sb.toString().split(“\n”);
itemList=newarraylist(Arrays.asList(items));
用于(字符串项:itemList){
字符串[]itemData=item.split(“:”);
如果(!(buffReader.readLine()==null)){
dataList.put(itemData[0],itemData[1]);
}
}
}捕获(IOE异常){
e、 printStackTrace();
}
closeFileReader();
}
以下是我用来设置数据的方法:

public void getData() {
    String line = null;
    openFileReader();
    BufferedReader buffReader = new BufferedReader(fr);
    StringBuffer sb = new StringBuffer();
    try {
        while((line = buffReader.readLine()) != null) {
            sb.append(line);
            sb.append("\n");
        }
        String[] items = sb.toString().split("\n");
        itemList = new ArrayList<String>(Arrays.asList(items));
        for(String item : itemList) {
            String[] itemData = item.split(":");
            if(!(buffReader.readLine() == null)) {
                dataList.put(itemData[0], itemData[1]);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    closeFileReader();
}
我的方法是获取数据并将其存储在arraylist/hashmap中,删除文件,创建文件,删除不需要的行,然后将所有数据设置到文件中

public void set(String section, String data) {
    openFileWriter();

    if(hasKey(section)) {
        file.delete();
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        for(Map.Entry<String, String> entry : dataList.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();

            //I don't think this block actually works...
            String beforeStringOfData = key + ":" + value;
            dataList.remove(section);
            if(itemList.contains(beforeStringOfData)) {
                itemList.remove(beforeStringOfData);
            }

            String finalStringOfData = section + ":" + data;
            itemList.add(finalStringOfData);
            dataList.put(section, data);
            for(String items : itemList) {
                f.format("%s%n", items);
            }
        }
    } else {
        dataList.put(section, data);
        String finalStringOfData = section + ":" + data;
        itemList.add(finalStringOfData);
        for(String i: itemList) {
            f.format("%s%n", i);
        }
    }

    closeFileWriter();
}

private boolean hasKey(String key) {
    if(dataList.containsKey(key))
        return true;
    return false;
}
公共无效集(字符串部分,字符串数据){
openFileWriter();
if(hasKey(第节)){
delete();
试一试{
createNewFile();
}捕获(IOE异常){
e、 printStackTrace();
}
对于(Map.Entry:dataList.entrySet()){
String key=entry.getKey();
字符串值=entry.getValue();
//我认为这个街区实际上不起作用。。。
字符串beforestingofdata=key+“:”+值;
数据列表。删除(节);
if(itemList.contains(beforeStringOfData)){
itemList.remove(在数据预存之前);
}
字符串finalStringOfData=section+“:”+数据;
itemList.add(finalStringOfData);
dataList.put(节,数据);
用于(字符串项:itemList){
f、 格式(“%s%n”,项目);
}
}
}否则{
dataList.put(节,数据);
字符串finalStringOfData=section+“:”+数据;
itemList.add(finalStringOfData);
for(字符串i:itemList){
f、 格式(“%s%n”,i);
}
}
closeFileWriter();
}
私有布尔hasKey(字符串键){
if(dataList.containsKey(键))
返回true;
返回false;
}
我不是要求重新编写我的代码。只是关于我应该如何着手解决我的问题的一点提示或提示


非常感谢您的帮助。谢谢

您的代码有很多错误,如果(!(buffReader.readLine()==null)),“dataList”
Map
将不包含任何条目,因为此语句
if(!(buffReader.readLine()==null))
,此条件将始终为
false
,因为此时在代码中您已经读取了文件中的所有行。此外,当您尝试从“itemList”中删除项目时,您将在
集合(…)
方法中获得
ConcurrentModificationException
Map
@Titus那么你认为我应该在为文件设置内容的同时读取文件,而不是只读取一次文件吗?我的意思是,在进入第二个循环(用于
循环的
)之前,你已经从文件中读取了所有数据并将其存储在“项目列表”中
ArrayList
此时您可以关闭“buffReader”。