- 浏览: 4486 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
502220545:
呵呵 真得高人啊 谁对md5了解的比较深的话 可以看看 小弟无 ...
MD5加密算法,求序列号,看看你的技术如何?!(菜鸟勿扰)
实现一个定时自动上传文件到FTP的功能,但是线程报错。
TimeTask.java
------------------------------------------------------------
import java.util.TimerTask;
public class TimeTask extends TimerTask {
ftpClient ftpclient = new ftpClient();
@Override
public void run() {
ftpClient.ScanFile();
System.out.println("Start Ftp Task");
}
}
-------------------------------------------------------------
ExecuteTask.java
-------------------------------------------------------------
import java.util.Timer;
public class ExecuteTask {
static Parse parse;
int iTime;
/*
* Execute Task
*/
public void Task() {
parse = new Parse();
try {
parse.viewXML("beanConfig.xml");
iTime = Integer.parseInt(parse.getSScanTime());
System.out.println(toString(iTime));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Timer timer = new Timer();
timer.schedule(new TimeTask(), iTime * 1000,iTime * 1000);
}
private char[] toString(int iTime2) {
// TODO Auto-generated method stub
return null;
}
}
----------------------------------------------------------------------
FileViewer.java
----------------------------------------------------------------------
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* 讀取目錄及子目錄下指定檔案名的路徑 並放到一個陣列裡面返回遍歷
* @author
*
*/
public class FileViewer {
private static List<String> fileList = new ArrayList<String>();
public static List<String> getFileList() {
return fileList;
}
/**
*
* @param path 檔路徑
* @param suffix 尾碼名
* @param isdepth 是否遍歷子目錄
* @return
*/
public static List<String> getListFiles(String path, String suffix, boolean isdepth)
{
File file = new File(path);
return FileViewer.listFile(file ,suffix, isdepth);
}
public static List<String> listFile(File f, String suffix, boolean isdepth)
{
//是目錄,同時需要遍歷子目錄
if (f.isDirectory() && isdepth == true)
{
File[] t = f.listFiles();
for (int i = 0; i < t.length; i++)
{
listFile(t[i], suffix, isdepth);
}
}
else
{
String filePath = f.getAbsolutePath();
if(!suffix.equals("java") && !suffix.equals("JAVA")){
return null;
}
if(suffix != null)
{
//最後一個.(即尾碼名前面的.)的索引
int begIndex = filePath.lastIndexOf(".");
String tempsuffix = "";
if(begIndex != -1)//防止是檔但卻沒有尾碼名結束的檔
{
tempsuffix = filePath.substring(begIndex + 1, filePath.length());
}
if(tempsuffix.equals(suffix))
{
fileList.add(filePath);
}
}
else
{
//尾碼名為null則為所有檔
fileList.add(filePath);
}
}
return fileList;
}
/**
* 刪除指定的檔
* @param fileName 全路徑檔案名
* @param newPath 新路徑
*/
public static void deleteFile(String fileName,String newPath){
File file = new File(fileName);
//1.copy filename to success Directory
//2.delete filename
if (file.exists()){
copyFile(fileName,newPath);
file.delete();
}
}
/**
* 複製單個文件
* @param oldPath String eg. c:/fqf.txt
* @param newPath String eg. f:/fqf.txt
* @return boolean
*/
public static void copyFile(String oldPath, String newPath) {
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //File Exists
InputStream inStream = new FileInputStream(oldPath); //Load Old File
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[204800];
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //File Size
//System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
inStream.close();
}
}
catch (Exception e) {
System.out.println("Copy File Error");
e.printStackTrace();
}
}
/**
* 方法追加檔:使用FileWriter
* @param fileName
* @param content
*/
public static void appendMethod(String fileName, String content)
{
try
{
//打開一個寫檔器,構造函數中的第二個參數true表示以追加形式寫檔
FileWriter writer = new FileWriter(fileName, true);
writer.write(content + "\r\n");
writer.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
--------------------------------------------------------------------
ftpConnect.java
--------------------------------------------------------------------
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
public class ftpClient {
static String PATH_SYMBOL = "/";
static String userName = "admin"; //用戶名
static String passWord = "note"; //密碼
static FtpClient ftpClient;
static Parse parse;
static List<String> fileList = new ArrayList<String>();
/**
* FTP
*/
public static void ftpConnect() {
try {
ftpClient = new FtpClient(parse.getIpAddress(),Integer.parseInt(parse.getPort()));
ftpClient.login(parse.getUsername(), parse.getPassword());
System.out.println(ftpClient.welcomeMsg);
ftpClient.binary();
String sFile;
String[] sFileName;
for (int i = 0; i < fileList.size(); i++) {
//
sFile = fileList.get(i);
sFileName = sFile.split(PATH_SYMBOL);
TelnetOutputStream ftpOut = ftpClient
.put(sFileName[sFileName.length - 1]);
//
FileInputStream fs = new FileInputStream(sFile);
TelnetInputStream ftpIn = new TelnetInputStream(fs, true);
byte[] buf = new byte[204800];
int bufsize = 0;
while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
ftpOut.write(buf, 0, bufsize);
}
ftpIn.close();
ftpOut.close();
}
System.out.println(ftpClient.getResponseString());
} catch (IOException e) {
e.printStackTrace();
}
ftpClient.sendServer("QUIT\r\n");
}
/**
*
*/
public static void LoadXML() {
parse = new Parse();
try {
parse.viewXML("beanConfig.xml");
System.out.println("scantime=" + parse.getSScanTime()
+ ",filePath=" + parse.getSfilepath());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*/
public static List<String> LoadFile() {
// fileViewer = new FileViewer();
// fileList = FileViewer.getListFiles(parse.getSfilepath(), "txt", true);
fileList = FileViewer.getListFiles(parse.getSfilepath(), "xls", true);
// out file
if (fileList == null) {
return null;
}
for (int i = 0; i < fileList.size(); i++) {
System.out.println(fileList.get(i));
}
return fileList;
}
/**
*
*/
public static void ScanFile() {
LoadXML();
if (LoadFile() == null) {
return;
}
ftpConnect();
String sFile;
String[] sFileName;
for (int i = 0; i < fileList.size(); i++) {
sFile = fileList.get(i);
sFileName = sFile.split(PATH_SYMBOL);
FileViewer.deleteFile(fileList.get(i), parse.getSBackupfile()
+ sFileName[sFileName.length - 1]);
}
// fileList set clear;
fileList.clear();
// print Task End Info
System.out.println("Task End.");
}
/**
* @param args
*/
public static void main(String[] args) {
ExecuteTask excuteTask = new ExecuteTask();
excuteTask.Task();
// System.out.println(System.getProperty("os.name"));
}
/**
*
* @param pathList
* String
* @throws Exception
*/
public void buildList(String pathList) throws Exception {
ftpClient.ascii();
StringTokenizer s = new StringTokenizer(pathList, "/"); // sign
// int count = s.countTokens();
String pathName = "";
while (s.hasMoreElements()) {
pathName = pathName + "/" + (String) s.nextElement();
try {
ftpClient.sendServer("XMKD " + pathName + "\r\n");
} catch (Exception e) {
e = null;
}
// int reply = ftpClient.readServerResponse();
}
ftpClient.binary();
}
}
--------------------------------------------------------------------
Parse.java
--------------------------------------------------------------------
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Parse {
private Document doc = null;
private String sScanTime;
private String sfilepath;
private String sBackupfile;
private String ipAddress;
private String port;
private String username;
private String password;
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSBackupfile() {
return sBackupfile;
}
public void setSBackupfile(String backupfile) {
sBackupfile = backupfile;
}
public String getSScanTime() {
return sScanTime;
}
public void setSScanTime(String scanTime) {
sScanTime = scanTime;
}
public String getSfilepath() {
return sfilepath;
}
public void setSfilepath(String sfilepath) {
this.sfilepath = sfilepath;
}
public void init(String xmlFile) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(new File(xmlFile));
}
public void viewXML(String xmlFile) throws Exception {
this.init(xmlFile);
Element element = doc.getDocumentElement();
NodeList nodeList = doc.getElementsByTagName(element.getTagName());
Node fatherNode = nodeList.item(0);
NodeList childNodes = fatherNode.getChildNodes();
// System.out.println(childNodes.getLength());
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if (childNode instanceof Element) {
if (childNode.getNodeName().equals("scantime")) {
this.setSScanTime(childNode.getFirstChild().getNodeValue());
} else if (childNode.getNodeName().equals("filepath")) {
this.setSfilepath(childNode.getFirstChild().getNodeValue());
} else if (childNode.getNodeName().equals("backupfile")) {
this.setSBackupfile(childNode.getFirstChild()
.getNodeValue());
} else if (childNode.getNodeName().equals("ipaddress")) {
this.setIpAddress(childNode.getFirstChild()
.getNodeValue());
} else if (childNode.getNodeName().equals("port")) {
this.setPort(childNode.getFirstChild()
.getNodeValue());
} else if (childNode.getNodeName().equals("username")) {
this.setUsername(childNode.getFirstChild()
.getNodeValue());
} else if (childNode.getNodeName().equals("password")) {
this.setPassword(childNode.getFirstChild()
.getNodeValue());
}
}
}
}
}
------------------------------------------------------------------------------
beanConfig.xml
------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<config>
<scantime>1</scantime>
<filepath>D:</filepath>
<backupfile>/var/ftp/salse/</backupfile>
<ipaddress>192.168.242.130</ipaddress>
<port>21</port>
<username>root</username>
<password>mm520</password>
</config>
------------------------------------------------------------------------------
报错:
java.lang.NullPointerException
at java.io.Writer.write(Writer.java:110)
at java.io.PrintStream.write(PrintStream.java:453)
at java.io.PrintStream.print(PrintStream.java:603)
at java.io.PrintStream.println(PrintStream.java:742)
at ExecuteTask.Task(ExecuteTask.java:14)
at ftpClient.main(ftpClient.java:118)
scantime=1,filePath=D:
Exception in thread "Timer-0" java.lang.NullPointerException
at FileViewer.listFile(FileViewer.java:35)
at FileViewer.listFile(FileViewer.java:37)
at FileViewer.getListFiles(FileViewer.java:26)
at ftpClient.LoadFile(ftpClient.java:79)
at ftpClient.ScanFile(ftpClient.java:95)
at TimeTask.run(TimeTask.java:8)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
相关推荐
Linux多线程服务端编程,高清无水印!~
在编程领域,线程是操作系统分配CPU时间的基本单位,它允许程序并发执行多个任务,从而提高了系统的效率和响应性。特别是在Windows环境下,MFC(Microsoft Foundation Classes)库提供了一种简单的方式来创建线程,...
当一个程序包含多个执行路径,即线程,有时我们需要确保某个线程执行完毕后再进行下一步操作,这就涉及到“等待线程结束”的功能。本篇文章将详细探讨如何在C++中实现这一功能。 首先,C++11引入了对线程支持的标准...
在IT领域,线程等待是多线程编程中的一个重要概念,尤其在Windows系统下,API(Application Programming Interface)提供了丰富的函数来支持线程管理和同步。本文将深入探讨“易语言 API线程等待”这一主题,解释其...
在标题“WinForm C#多线程等待窗体”中,我们探讨的关键点是如何在进行耗时操作时创建一个等待窗体,让用户知道程序正在执行任务,并且不允许用户进行其他操作,直到任务完成。描述提到了“非托管资源”和...
Java多线程!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
为了解决这个问题,我们可以利用多线程来实现等待窗体。 等待窗体(WaitForm)通常用于在后台线程执行长时间任务时向用户提供反馈,告知他们程序仍在运行并未崩溃。这种窗体通常包含进度条、文本信息或其他指示器,...
"等待窗体"是多线程应用中一个重要的概念,通常用于在后台任务执行时提供用户友好的界面反馈。本项目就是针对C# Winform应用设计的一个等待窗体,它能在后台任务运行时显示进度或状态,让用户知道程序正在工作,并未...
32位的code 注入器以及一些远程线程调用!!!!方便安全人员测试用!
标题"多线程Web服务器!QT做的!!" 提示我们这是一个使用QT库开发的、支持多线程技术的Web服务器。QT是一个跨平台的C++应用程序框架,广泛用于图形用户界面和其他应用程序开发。多线程是并发处理多个请求的关键技术...
当创建了一个线程后,有时我们需要等待这个线程执行完毕后再进行其他操作,这通常被称为线程同步。本资源提供了一种方法,教您如何在VC++中实现等待一个已有线程自动结束的功能。以下是关于这一主题的详细解释。 1....
在C#编程中,线程池(ThreadPool)是一种高效的线程管理机制,它允许开发者创建并管理多个线程,而无需直接操作线程对象。线程池中的线程可以复用,减少了创建和销毁线程的开销。当我们需要执行大量短生命周期的任务...
具体实现可能包括定义线程函数、使用`std::mutex`和`std::condition_variable`来协调线程之间的通信,以及可能的错误处理代码。由于没有提供实际代码,这里只能给出一般性的解释和建议。 总之,线程异步工作和线程...
使用其他线程修改界面元素可能会导致未知错误,因此需要使用适当的同步机制,如PostMessage或SendDlgItemMessage,从非用户界面线程向用户界面线程发送消息。 四、线程间通信 在MFC中,线程间通信可以通过几种方式...
在C++编程中,线程是并发执行的代码段,允许程序同时处理多个任务,从而提高了效率和响应性。在"C++线程测试3!"这个主题中,我们可能是在探讨如何利用C++标准库中的线程支持进行多线程编程。下面我们将详细讲解相关...
4. **线程同步事件**:`ManualResetEvent`和`AutoResetEvent`可以作为线程间的信号,让一个线程等待另一个线程完成某个操作。`WaitOne()`方法用于等待事件信号,而`Set()`或`Reset()`则用来设置信号状态。 5. **...
VC++多线程编程实例,看后能够轻松学会多线程!!!!!!!!
JAVA 主线程等待子线程执行完毕再执行 JAVA 中的线程控制是非常重要的一部分,而在实际开发中,我们经常会遇到需要主线程等待子线程执行完毕再执行的情况。这种情况下,我们可以使用两种方式来实现:主动式和被动式...
例如,CurrentThread属性可以获取当前运行的线程,Name属性用于设置线程名称,Priority属性设定线程优先级,IsBackground属性表示线程是否为后台线程,而IsAlive属性则检查线程是否仍在执行。Thread类还包含了各种...
- **事件(Events)**:通过WaitHandle类的子类(如ManualResetEvent或AutoResetEvent)来同步线程,一个线程等待特定事件发生,另一个线程触发事件。 - **条件变量(Conditional Variables)**:允许线程在满足...