java A线程向C目录写文件,B线程从C目录移动文件,如何防止B线程移动A线程正在写入的文件,或者当遇到特殊情况,比如断电,如何保证文件的完整?
package thread;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestFileTrans {
public static void main(String[] args) {
String inPath = "D:" + File.separator + "testFile" + File.separator + "inPath";
File inPathFile = new File(inPath);
String outPath = "D:" + File.separator + "testFile" + File.separator + "outPath";
File outPathFile = new File(outPath);
if (!inPathFile.exists()) {
inPathFile.mkdirs();
}
if (!outPathFile.exists()) {
outPathFile.mkdirs();
}
// A 线程以100毫秒的速度写入文件
new Thread(new WriteFile(inPath, 100), "w:").start();
// B 线程以1毫秒的速度移动文件
new Thread(new removeFile(inPath, outPath, 1), "m:").start();
}
}
class WriteFile implements Runnable {
String inPath;
int time;
WriteFile(String path, int time) {
this.inPath = path;
this.time = time;
}
@Override
public void run() {
while (true) {
try {
// 需要移动的是一个10.9 MB (11,486,712 字节) 的文件
File testFile = new File("D:/soft/FoxitReader431_chs_Setup.exe");
FileInputStream is = new FileInputStream(testFile);
byte[] b = new byte[1024 * 10];
int temp;
File file = new File(inPath + File.separator + System.nanoTime() + ".txt");
FileOutputStream os = new FileOutputStream(file);
while ((temp = is.read(b)) != -1) {
os.write(b, 0, temp);
}
os.flush();
os.close();
is.close();
System.out.println(Thread.currentThread().getName() + file.getName());
Thread.sleep(time);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class removeFile implements Runnable {
String inPath;
String outPath;
int time;
removeFile(String inPath, String outPath, int time) {
this.inPath = inPath;
this.outPath = outPath;
this.time = time;
}
@Override
public void run() {
while (true) {
try {
File[] files = new File(inPath).listFiles();
Pattern pattern = Pattern.compile("^\\d{14}.txt$");
for (File file : files) {
Matcher matcher = pattern.matcher(file.getName());
if (matcher.matches()) {
File outFile = new File(outPath, file.getName());
FileInputStream is = new FileInputStream(file);
FileOutputStream os = new FileOutputStream(outFile);
byte[] b = new byte[1024 * 10];
int temp;
while ((temp = is.read(b)) != -1) {
os.write(b, 0, temp);
}
os.flush();
os.close();
is.close();
file.delete();
System.out.println(Thread.currentThread().getName() + outFile.getName());
}
}
Thread.sleep(time);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
java 的小例子。多线程控制按钮移动。
JAVA多线程实验,字符移动、小球碰撞两个实验来说明JAVA的多线程
3.1 Java线程 3.2 创建线程 3.3 使用线程的缺点 3.3.1 初始启动变慢 3.3.2 资源利用 3.3.2 资源利用 3.4 线程管理 3.5 共享资源的使用同步 3.5.1 同步方法和同步代码块的嵌套调用...
java多线程实现画圆画方的小程序 方和圆相对移动
利用Java多线程和JFrame编写程序,实现企鹅在界面里移动
利用多线程技术编写applet程序。其中包含一个滚动的字符串,字符串从左向右移动,当所有的字符都从屏幕的右边消失后,字符串重新从左边出现并继续向右移动
2.3基本功能:(1)文件和目录的基本操作,比如文件和目录的创建、删除、复制、移动、重命名和文件内容的显示,文件和目录的基本检索,快速文件搜索采用多线程技术加快文件的检索速度;(2)进程和线程的使用,进程和...
使用多线程的方式实现钟时分秒针的移动,首创!
我们公司是搞移动增值业务的,这是我弄出来的新人培训的内部资料,虽然不是公司编写的,但是公司搜集的。 这个资料对于培训新人来说非常有用,照着资料看一天,敲一天代码基本就会了。
如果下载后无法直接运行,则查看电脑是否有F盘,如果没有,可修改jar包中的配置文件,将默认路径设置到其他盘,如C盘 说明: 1、这是myDownloader2.0自制下载器,在1.0版本的基础上做了修正和功能上的扩展; 2、该...
线程及多线程技术及应用线程及多线程技术及应用
该程序采用良好的格式,美观的界面,通俗易懂,本例题是采用多线使一小球在界面不断移动
Java的线程回顾 匿名内部类 Android的多线程技术之Handler Android的多线程技术之AsyncTask HTTP概述 HTTPClient
键盘线程控制汽车限制在窗口内移动(源码+图片) 涉及到的方面有:线程、图片加载、键盘监听、Graphics画笔方法应用、图片的坐标控制等。 简单的小程序对联系面向对象有很多好处,适合java初学者学习并练习。
介绍多线程的.不多说了
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...