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 多线程 控制按钮移动 例子"中,提到的是使用多线程来实现GUI(图形用户界面)中的按钮动态移动,这通常涉及到事件处理和线程同步。 【描述】提到了多线程的概念,它允许并发执行多个指令流,每个...
本实验通过“字符移动”和“小球碰撞”两个实例,深入浅出地展示了Java多线程的概念、创建与管理。 首先,我们要理解什么是线程。线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们共享进程的...
Java多线程下载是利用Java编程语言实现的一种高效下载大文件的技术。在传统的单线程下载方式中,如果网络环境不稳定或文件较大,下载过程可能会很慢,甚至中断。而多线程下载则是将文件分割成多个部分,每个部分由一...
在Java编程语言中,移动文件夹下所有文件是一项常见的任务,尤其在处理文件系统操作时。这个场景描述了一个程序能够遍历指定文件夹中的所有文件,并将它们移动到另一个目标文件夹,同时保持原有的文件结构。这样的...
在本项目中,"用java多线程写的贪吃蛇"是一个基于Java编程语言实现的经典游戏——贪吃蛇。这个程序利用了Java的多线程技术来管理游戏的各个组件,如蛇、食物以及游戏窗口的更新。让我们深入探讨一下其中涉及的关键...
在Java中,我们可以使用`java.util.concurrent`包中的`ExecutorService`、`Future`和`Callable`接口来创建和管理线程。创建一个固定线程池,然后为每个文件段创建一个`Callable`任务,提交到线程池执行,最后合并...
综上所述,本文通过实例代码向我们展示了如何利用Java中的多线程和同步辅助类来高效读取多个文件。通过创建自定义线程类、使用同步辅助工具类和文件I/O操作相结合的方式,我们可以灵活地处理大量文件读取任务,并...
在Java编程语言中,多线程是其核心特性之一,它允许程序同时执行多个任务,提高了应用程序的效率和响应性。本示例着重探讨如何在Java中实现多线程,并通过一个具体的小球运动模拟来阐述相关概念。 一、多线程基础 ...
理解线程动画首先需要掌握Java线程的基础知识。 1. **线程基础** - **线程定义**:线程是程序执行的流,一个进程中可以有多个并发执行的线程。 - **创建线程**:Java中可以通过继承Thread类或实现Runnable接口来...
`Java帮助文件`可能涵盖了Java的基础语法、类、对象、接口、异常处理、集合框架、多线程、网络编程等方面的知识,对于开发者来说是宝贵的参考资料。 C语言是低级编程语言,因其高效和灵活性而被广泛用于操作系统、...
在本项目中,“Java多线程测试程序”利用了这一特性,结合图形用户界面(GUI)框架JFrame,实现了企鹅在界面上的动态移动效果。 首先,我们来深入理解Java多线程。在Java中,每个运行的程序都有一个主线程,而多...
可以通过`FileWriter`和`PrintWriter`向文件追加或覆盖内容。`append()`方法用于追加,而`write()`方法用于覆盖现有内容。 8. **文件和目录的属性查询**: `File`类提供了许多方法来获取文件或目录的属性,如`...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。在本案例中,我们探讨的主题是如何利用多线程来制作动画,这通常涉及到两个线程:一个控制图形的半径变化,另一个控制图形中心...
在Java编程中,多线程是一项关键技能,尤其在创建实时动画或图形应用程序时。"java 多线程编程 月食效果"这个项目显然利用了这一特性来模拟月食的动态过程。以下是对这个主题的详细解释: 1. **Java多线程**:Java...
在`Clock.java`文件中,可能包含了`Clock`类以及三个表示指针的线程类。`Clock`类可能包含了一个`Canvas`或者`JPanel`来绘制钟面,并使用`repaint()`方法来刷新界面。每个指针类的`run()`方法会不断更新指针的位置,...
在Java编程领域,多线程是一项关键特性,它使得程序能够同时执行多个任务,从而提高系统效率和用户体验。本文将围绕“Java多线程实现坦克大战游戏带声音图片”这一主题,深入探讨如何利用Java的多线程技术来构建一个...
Java 文件管理器是一款基于Java语言开发的文件管理系统,它提供了用户友好的图形用户界面(GUI),使得用户可以方便地进行文件和目录的操作,如浏览、创建、删除、重命名、移动和复制等。这款应用程序旨在提供一个...
在Java编程领域,多线程是一项关键技能,尤其在开发实时系统、并发应用程序或像“Java多线程飞机游戏”这样的交互式应用时。多线程允许程序同时执行多个独立的任务,提高系统的效率和响应性。在这个飞机格斗游戏中,...
在本项目"基于Java多线程和GUI的贪吃蛇"中,开发者利用了Java的强大功能,构建了一个具有用户友好的图形用户界面(GUI)的游戏,并融入了多线程技术来实现游戏的流畅运行。以下是关于这个项目所涉及的知识点的详细...
在这个特定的程序中,它被实现为一个Java小程序,利用了Java的多线程特性,使得游戏的运行更加流畅。 首先,我们要理解Java中的多线程。在Java中,多线程是并发执行多个任务的能力,这可以提高程序的效率和响应性。...