大家好,又见面了,我是你们的朋友全栈君。
在实际的项目中我们经常会与遇到操作文件的情况,这是很常见的,但是我们在实际中用传统的I/O操作不能满足我们项目的需要并且对文件的写特别慢,操作比较麻烦。那么我们怎么样实现呢?最近在项目中我们遇到了高并发的事情,我是这样操作的。利用JavaNIO实现非阻塞式的读写,通过锁机制完成高并发下的文件的操作。
代码语言:javascript复制public void run() {
File file = new File("/home/test.txt");
RandomAccessFile fout = null;
FileChannel fcout = null;
try {
fout = new RandomAccessFile(file, "rw");
long filelength = fout.length();//获取文件的长度
fout.seek(filelength);//将文件的读写指针定位到文件的末尾
fcout = fout.getChannel();//打开文件通道
FileLock flout = null;
while (true) {
try {
flout = fcout.tryLock();//不断的请求锁,如果请求不到,等一秒再请求
break;
} catch (Exception e) {
System.out.print("lock is exist ......");
sleep(1000);
}
}
String str = " hello word!!!!n";//需要写入的内容
fout.write(str.getBytes());//将需要写入的内容写入文件
flout.release();
fcout.close();
fout.close();
} catch (IOException e1) {
e1.printStackTrace();
System.out.print("file no find ...");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (fcout != null) {
try {
fcout.close();
} catch (IOException e) {
e.printStackTrace();
fcout = null;
}
}
if (fout != null) {
try {
fout.close();
} catch (IOException e) {
e.printStackTrace();
fout = null;
}
}
}
}
上面的代码实现了在文件的末尾追加内容,要想在文件的中间插入内容,这个方法还不能实现,必须读出来,当读到添加内容的位置,添加到StringBuffer中,然后读完文件,将文件读写指针定位开始,再将StringBuffer中的内容写回去就可以了。这个思想是可以实现的。我就不重复的添加代码了。如果在实现上遇见问题,随时留言。一起学习。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144697.html原文链接:https://javaforall.cn