我是用下面这种方法向文件里写数据的,请问如果我要修改,或者删除里面的数据该怎么办!!
老师说可以用到向量,但是就是不晓得用向量要怎么才能实现!!
麻烦哪位大哥指点一下,给写个小程序,演示给我看一下,谢谢了!!
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(
"Data\\RegisterInfo.txt")));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(
"Data\\RegisterInfo.txt", true)));
boolean leap = false;
String strID = "";
while (strID != null) {
strID = br.readLine();
if (("用户名:" + textID.getText().toString())
.equalsIgnoreCase(strID)) {
leap = true;
break;
}
}
br.close();
if (leap) {
JOptionPane.showMessageDialog(frame,
"该用户名已存在,请重新输入用户名!", "提示",
JOptionPane.YES_NO_CANCEL_OPTION);
textID.setText("");
} else {
bw.write("用户名:" + textID.getText().toString());
bw.newLine();
bw.write("姓名:" + textName.getText().toString());
bw.newLine();
bw.write("密码:" + strPSW);
bw.newLine();
if (btnSexMale.isSelected())
bw.write("性别:" + btnSexMale.getText().toString());
else
bw.write("性别:" + btnSexFemale.getText().toString());
bw.newLine();
bw.write("出生日期:"
+ cbRegisterYear.getSelectedItem().toString()
+ "年"
+ cbRegisterMonth.getSelectedItem().toString()
+ "月"
+ cbRegisterDay.getSelectedItem().toString());
bw.newLine();
bw.write("身份证:" + textIdCard.getText());
bw.newLine();
bw.newLine();
bw.flush();
bw.close();
JOptionPane.showMessageDialog(frame, "恭喜你注册成功!", "提示",
JOptionPane.YES_NO_CANCEL_OPTION);
textID.setText("");
textName.setText("");
textPSW.setText("");
textRPSW.setText("");
btnSexMale.setSelected(true);
cbRegisterYear.setSelectedItem("1989");
cbRegisterMonth.setSelectedItem("1");
cbRegisterDay.setSelectedItem("1");
textIdCard.setText("");
}
} catch (IOException ei) {
JOptionPane.showMessageDialog(frame,
"RegisterInfo.txt文件不存在!", "写入错误!",
JOptionPane.ERROR_MESSAGE);
}

解决方案 »

  1.   

    你的老师在忽悠你,或者是你听错了处理的方式其实很简单:
    1、删除数据的方式,重新写一个方法去读你的注册信息文件,还是行遍历,全部存入一个新的StringBuffer,删除的行跳过就好了,读完直接写回去。
    2、修改同上,替换需要修改的行,然后写回去
      

  2.   


    首先我的老师没有在忽悠我,而是你在忽悠我!因为Java不像C++,Java不能直接对记事本里面的数据直接在记事本里面进行修改或者删除,必须要先读入内存,然后在内存里面进行修改,修改完了之后,再重新写入记事本!而在内存里面进行修改的话,那么就要用向量或者数组!
      

  3.   


    谁说不能的? 用java NIO包可以直接呀。我今天在另一个贴子里有例子,只不过是读的,写也是一个道理。
    http://topic.csdn.net/u/20090615/17/1aa652d3-d865-4867-b063-dcce44bb1b14.html
      

  4.   

    java.nio API可以对文件进行任意位置的读写操作(random file access),不用读入内存,效率也超高。
      

  5.   


    这个不太可能吧?不读入内存,cpu(jvm)怎么处理文件里的数据?
    我知道你英文很好,你再确认一下。
      

  6.   


    可以是我没说清楚,没太理解我的意思.我的想思是说通过java.nio可以高效的读取文件中的任意一部分(可以从文件中间直接读),而不用把整个文件读入内存。
    写也是一样的,只有知道在写入位置,就可以直接写过那个文件的相应位置,覆盖那个位置的内容。不用像普通IO操作要全读入内存,再修改,再保存回去。今天另一个贴子里我有给出例子。URL在上面。
      

  7.   

    好像有一个RandomAccseeFile,在java.io中。
      

  8.   


    是的,区别是:
    RandomAccessFile类中只能是一个字节一个字节的读和写,也是是io包的通病,效率很低。NIO包可以一块一块的读和写,如在效大的文件操作时,可以一下子读写几兆,几十至上百兆数据。想想看要是用普通io,要读写到什么时候?
      

  9.   


    有道理。应该好好学习一下Channel
      

  10.   

    接15楼:还有一个重要区别是io包是blocking thread,也就是在读入时会等待,直到有数据读入,这期间,使用那个io的线程是被锁住的。
    而NIO包是non-blocking,是没有上面那个问题的。这在io操作中很重要。在底层的实现有也区别,io是stream(流)的,NIO用的是channel(通道). (我也没细看过相关的资料,具体的区别不清楚)15楼刚才还有一个地方说的不太准确, io也是可以一次读写多个字节,只是底层的实现上,效率远比nio低。
      

  11.   


    会用就好了,自1.4以来,NIO逐渐的取代了io,只是现在的NIO用着实在没有io方便简易。建议只有在对性能要求高的时候才用NIO。NIO以后应该会慢慢完善。JDK7中对NIO有不少的改进。