`

java A线程向C目录写文件 B线程从C目录移动文件

阅读更多
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();
            }
        }
    }
}
0
0
分享到:
评论

相关推荐

    java 多线程 控制按钮移动 例子

    在【标题】"java 多线程 控制按钮移动 例子"中,提到的是使用多线程来实现GUI(图形用户界面)中的按钮动态移动,这通常涉及到事件处理和线程同步。 【描述】提到了多线程的概念,它允许并发执行多个指令流,每个...

    JAVA多线程实验,字符移动、小球碰撞

    本实验通过“字符移动”和“小球碰撞”两个实例,深入浅出地展示了Java多线程的概念、创建与管理。 首先,我们要理解什么是线程。线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们共享进程的...

    java多线程下载源代码

    Java多线程下载是利用Java编程语言实现的一种高效下载大文件的技术。在传统的单线程下载方式中,如果网络环境不稳定或文件较大,下载过程可能会很慢,甚至中断。而多线程下载则是将文件分割成多个部分,每个部分由一...

    SpringBoot版本的多线程下载文件,分段下载文件

    在Java中,我们可以使用`java.util.concurrent`包中的`ExecutorService`、`Future`和`Callable`接口来创建和管理线程。创建一个固定线程池,然后为每个文件段创建一个`Callable`任务,提交到线程池执行,最后合并...

    java移动文件夹下所有文件

    在Java编程语言中,移动文件夹下所有文件是一项常见的任务,尤其在处理文件系统操作时。这个场景描述了一个程序能够遍历指定文件夹中的所有文件,并将它们移动到另一个目标文件夹,同时保持原有的文件结构。这样的...

    用java多线程写的贪吃蛇

    在本项目中,"用java多线程写的贪吃蛇"是一个基于Java编程语言实现的经典游戏——贪吃蛇。这个程序利用了Java的多线程技术来管理游戏的各个组件,如蛇、食物以及游戏窗口的更新。让我们深入探讨一下其中涉及的关键...

    java多线程读取多个文件的方法

    综上所述,本文通过实例代码向我们展示了如何利用Java中的多线程和同步辅助类来高效读取多个文件。通过创建自定义线程类、使用同步辅助工具类和文件I/O操作相结合的方式,我们可以灵活地处理大量文件读取任务,并...

    java多线程应用实现示例

    在Java编程语言中,多线程是其核心特性之一,它允许程序同时执行多个任务,提高了应用程序的效率和响应性。本示例着重探讨如何在Java中实现多线程,并通过一个具体的小球运动模拟来阐述相关概念。 一、多线程基础 ...

    Java编写线程动画

    理解线程动画首先需要掌握Java线程的基础知识。 1. **线程基础** - **线程定义**:线程是程序执行的流,一个进程中可以有多个并发执行的线程。 - **创建线程**:Java中可以通过继承Thread类或实现Runnable接口来...

    HTML—Java—C语言等帮助文件。

    `Java帮助文件`可能涵盖了Java的基础语法、类、对象、接口、异常处理、集合框架、多线程、网络编程等方面的知识,对于开发者来说是宝贵的参考资料。 C语言是低级编程语言,因其高效和灵活性而被广泛用于操作系统、...

    Java多线程测试程序,

    在本项目中,“Java多线程测试程序”利用了这一特性,结合图形用户界面(GUI)框架JFrame,实现了企鹅在界面上的动态移动效果。 首先,我们来深入理解Java多线程。在Java中,每个运行的程序都有一个主线程,而多...

    Java目录,文件操作

    可以通过`FileWriter`和`PrintWriter`向文件追加或覆盖内容。`append()`方法用于追加,而`write()`方法用于覆盖现有内容。 8. **文件和目录的属性查询**: `File`类提供了许多方法来获取文件或目录的属性,如`...

    java 多线程制作动画

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。在本案例中,我们探讨的主题是如何利用多线程来制作动画,这通常涉及到两个线程:一个控制图形的半径变化,另一个控制图形中心...

    java 多线程编程 月食效果

    在Java编程中,多线程是一项关键技能,尤其在创建实时动画或图形应用程序时。"java 多线程编程 月食效果"这个项目显然利用了这一特性来模拟月食的动态过程。以下是对这个主题的详细解释: 1. **Java多线程**:Java...

    java 多线程模拟钟表 首创

    在`Clock.java`文件中,可能包含了`Clock`类以及三个表示指针的线程类。`Clock`类可能包含了一个`Canvas`或者`JPanel`来绘制钟面,并使用`repaint()`方法来刷新界面。每个指针类的`run()`方法会不断更新指针的位置,...

    java多线程实现坦克大战游戏带声音图片

    在Java编程领域,多线程是一项关键特性,它使得程序能够同时执行多个任务,从而提高系统效率和用户体验。本文将围绕“Java多线程实现坦克大战游戏带声音图片”这一主题,深入探讨如何利用Java的多线程技术来构建一个...

    java 文件管理器

    Java 文件管理器是一款基于Java语言开发的文件管理系统,它提供了用户友好的图形用户界面(GUI),使得用户可以方便地进行文件和目录的操作,如浏览、创建、删除、重命名、移动和复制等。这款应用程序旨在提供一个...

    Java多线程飞机游戏

    在Java编程领域,多线程是一项关键技能,尤其在开发实时系统、并发应用程序或像“Java多线程飞机游戏”这样的交互式应用时。多线程允许程序同时执行多个独立的任务,提高系统的效率和响应性。在这个飞机格斗游戏中,...

    基于Java多线程和GUI的贪吃蛇

    在本项目"基于Java多线程和GUI的贪吃蛇"中,开发者利用了Java的强大功能,构建了一个具有用户友好的图形用户界面(GUI)的游戏,并融入了多线程技术来实现游戏的流畅运行。以下是关于这个项目所涉及的知识点的详细...

    贪吃蛇源程序,java多线程

    在这个特定的程序中,它被实现为一个Java小程序,利用了Java的多线程特性,使得游戏的运行更加流畅。 首先,我们要理解Java中的多线程。在Java中,多线程是并发执行多个任务的能力,这可以提高程序的效率和响应性。...

Global site tag (gtag.js) - Google Analytics