`

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 的小例子。多线程控制按钮移动。

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

    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多线程实现画圆画方的小程序 方和圆相对移动

    Java多线程测试程序,

    利用Java多线程和JFrame编写程序,实现企鹅在界面里移动

    JAVA多线程实验报告

    利用多线程技术编写applet程序。其中包含一个滚动的字符串,字符串从左向右移动,当所有的字符都从屏幕的右边消失后,字符串重新从左边出现并继续向右移动

    文件管理系统java源代码

    2.3基本功能:(1)文件和目录的基本操作,比如文件和目录的创建、删除、复制、移动、重命名和文件内容的显示,文件和目录的基本检索,快速文件搜索采用多线程技术加快文件的检索速度;(2)进程和线程的使用,进程和...

    java 多线程模拟钟表 首创

    使用多线程的方式实现钟时分秒针的移动,首创!

    详细剖析JAVA多线程案例教学

    我们公司是搞移动增值业务的,这是我弄出来的新人培训的内部资料,虽然不是公司编写的,但是公司搜集的。 这个资料对于培训新人来说非常有用,照着资料看一天,敲一天代码基本就会了。

    java-多线程下载器(支持断点续传、线程加减)包含源码和可运行jar包 第二版

    如果下载后无法直接运行,则查看电脑是否有F盘,如果没有,可修改jar包中的配置文件,将默认路径设置到其他盘,如C盘 说明: 1、这是myDownloader2.0自制下载器,在1.0版本的基础上做了修正和功能上的扩展; 2、该...

    线程及多线程技术及应用 fly

    线程及多线程技术及应用线程及多线程技术及应用

    java 多线程小例题

    该程序采用良好的格式,美观的界面,通俗易懂,本例题是采用多线使一小球在界面不断移动

    移动编程之线程

    Java的线程回顾 匿名内部类 Android的多线程技术之Handler Android的多线程技术之AsyncTask HTTP概述 HTTPClient

    键盘线程控制汽车限制在窗口内移动(源码+图片)

    键盘线程控制汽车限制在窗口内移动(源码+图片) 涉及到的方面有:线程、图片加载、键盘监听、Graphics画笔方法应用、图片的坐标控制等。 简单的小程序对联系面向对象有很多好处,适合java初学者学习并练习。

    JAVA多线程机制

    介绍多线程的.不多说了

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包4

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包3

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

Global site tag (gtag.js) - Google Analytics