public static void handleLogs(List<SmsSend> list) {
     StringBuffer sb = new StringBuffer();
try {
RandomAccessFile rf = new RandomAccessFile(System.getProperty("user.dir")+ File.separatorChar + fileName + getTime() + ".txt","rw");
rf.seek(rf.length());//将指针移动到文件末尾 
int size = list.size();
for(int i = 0; i < size; i++) {
sb.append(list.get(i).getMobile()+"|"+list.get(i).getAllContent().replaceAll("\\|", "")+"|"+list.get(i).getMark());
sb.append("\r\n");
}
rf.write(sb.toString().getBytes());
rf.close();//关闭文件流 
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}     public static List<SmsSend> getLogs() throws IOException {
     List<SmsSend> list = new LinkedList<SmsSend>();
     renameFile("", "temp");
     File f = new File(System.getProperty("user.dir")+ File.separatorChar + fileName + getTime() + "temp.txt");
     if(f.exists()) {
     FileReader fr = new FileReader(System.getProperty("user.dir")+ File.separatorChar + fileName + getTime() + "temp.txt"); 
     BufferedReader br = new BufferedReader(fr);
     String tempStr;
     tempStr = br.readLine();
     while (tempStr != null) {
     SmsSend s = new SmsSend();
     String[] temp = tempStr.split("\\|");
     s.setMobile(temp[0]);
     s.setAllContent(temp[1]);
     s.setMark(Integer.parseInt(temp[2]));
     list.add(s);
     tempStr = br.readLine();
     }
     }
    
return list;
    }
    总共有两个线程在跑 一个在写文件,一个在读文件 ,但我觉得这样有问题 就是我在写文件的时候,读文件也开始了,这个时候是不能读文件的。这里的线程安全怎么控制 

解决方案 »

  1.   

    从 JDK 1.4 开始 NIO 中有一个 FileChannel 类,通过这个类可以获得 FileLock 对象,通过这个对象可以锁住整个或者部分文件。这种锁是在操作系统层面上实现的,只要这个文件被锁住,那不管什么程序都无法访问。这是解决方案之一。下面还有一个方案:如果是在同一个程序的多线程环境中,你可以使用 JDK 5 并发包中的读写锁 java.util.concurrent.locks.ReadWriteLock,JDK 5 中的实现类为 java.util.concurrent.locks.ReentrantReadWriteLock读写锁中有两把锁,读锁和写锁,他们会有这样的特色:*  当有一线程持有写锁或者读锁时,其他线程不能获得写锁
    *  当有一线程持有写锁时,其他线程不能获得读锁
    *  读锁可以被任意多的线程所持有