`

线程错误,高手帮忙,万分感激!!!在线等待。。。。。

阅读更多

实现一个定时自动上传文件到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多线程服务端编程,高清无水印!~

    Linux多线程服务端编程,高清无水印!~

    vc线程的简单例子!!!

    在编程领域,线程是操作系统分配CPU时间的基本单位,它允许程序并发执行多个任务,从而提高了系统的效率和响应性。特别是在Windows环境下,MFC(Microsoft Foundation Classes)库提供了一种简单的方式来创建线程,...

    C++ 等待线程结束

    当一个程序包含多个执行路径,即线程,有时我们需要确保某个线程执行完毕后再进行下一步操作,这就涉及到“等待线程结束”的功能。本篇文章将详细探讨如何在C++中实现这一功能。 首先,C++11引入了对线程支持的标准...

    易语言 API线程等待

    在IT领域,线程等待是多线程编程中的一个重要概念,尤其在Windows系统下,API(Application Programming Interface)提供了丰富的函数来支持线程管理和同步。本文将深入探讨“易语言 API线程等待”这一主题,解释其...

    WinForm C#多线程等待窗体

    在标题“WinForm C#多线程等待窗体”中,我们探讨的关键点是如何在进行耗时操作时创建一个等待窗体,让用户知道程序正在执行任务,并且不允许用户进行其他操作,直到任务完成。描述提到了“非托管资源”和...

    Java多线程 Java多线程

    Java多线程!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    C#多线程实现等待窗体

    为了解决这个问题,我们可以利用多线程来实现等待窗体。 等待窗体(WaitForm)通常用于在后台线程执行长时间任务时向用户提供反馈,告知他们程序仍在运行并未崩溃。这种窗体通常包含进度条、文本信息或其他指示器,...

    C#多线程等待窗体

    "等待窗体"是多线程应用中一个重要的概念,通常用于在后台任务执行时提供用户友好的界面反馈。本项目就是针对C# Winform应用设计的一个等待窗体,它能在后台任务运行时显示进度或状态,让用户知道程序正在工作,并未...

    32位的code 注入器以及一些远程线程调用!!!!方便安全人员测试用!

    32位的code 注入器以及一些远程线程调用!!!!方便安全人员测试用!

    多线程Web服务器!QT做的!!

    标题"多线程Web服务器!QT做的!!" 提示我们这是一个使用QT库开发的、支持多线程技术的Web服务器。QT是一个跨平台的C++应用程序框架,广泛用于图形用户界面和其他应用程序开发。多线程是并发处理多个请求的关键技术...

    如何等待一个已有线程自动结束的VC++代码

    当创建了一个线程后,有时我们需要等待这个线程执行完毕后再进行其他操作,这通常被称为线程同步。本资源提供了一种方法,教您如何在VC++中实现等待一个已有线程自动结束的功能。以下是关于这一主题的详细解释。 1....

    C#线程池 所有线程运行完毕

    在C#编程中,线程池(ThreadPool)是一种高效的线程管理机制,它允许开发者创建并管理多个线程,而无需直接操作线程对象。线程池中的线程可以复用,减少了创建和销毁线程的开销。当我们需要执行大量短生命周期的任务...

    线程异步工作,当一个线程结束时异步通知另一线程

    具体实现可能包括定义线程函数、使用`std::mutex`和`std::condition_variable`来协调线程之间的通信,以及可能的错误处理代码。由于没有提供实际代码,这里只能给出一般性的解释和建议。 总之,线程异步工作和线程...

    MFC多线程 工作者线程 用户界面线程

    使用其他线程修改界面元素可能会导致未知错误,因此需要使用适当的同步机制,如PostMessage或SendDlgItemMessage,从非用户界面线程向用户界面线程发送消息。 四、线程间通信 在MFC中,线程间通信可以通过几种方式...

    C++线程测试3!

    在C++编程中,线程是并发执行的代码段,允许程序同时处理多个任务,从而提高了效率和响应性。在"C++线程测试3!"这个主题中,我们可能是在探讨如何利用C++标准库中的线程支持进行多线程编程。下面我们将详细讲解相关...

    线程教程!!详细的线程操作

    4. **线程同步事件**:`ManualResetEvent`和`AutoResetEvent`可以作为线程间的信号,让一个线程等待另一个线程完成某个操作。`WaitOne()`方法用于等待事件信号,而`Set()`或`Reset()`则用来设置信号状态。 5. **...

    VC.zip_VC多线程_vc 多线程

    VC++多线程编程实例,看后能够轻松学会多线程!!!!!!!!

    JAVA主线程等待子线程执行完毕再执行[参照].pdf

    JAVA 主线程等待子线程执行完毕再执行 JAVA 中的线程控制是非常重要的一部分,而在实际开发中,我们经常会遇到需要主线程等待子线程执行完毕再执行的情况。这种情况下,我们可以使用两种方式来实现:主动式和被动式...

    C#多线程技术PPT

    例如,CurrentThread属性可以获取当前运行的线程,Name属性用于设置线程名称,Priority属性设定线程优先级,IsBackground属性表示线程是否为后台线程,而IsAlive属性则检查线程是否仍在执行。Thread类还包含了各种...

    C# 如何挂起线程、休眠线程和终止线程(源码例)

    - **事件(Events)**:通过WaitHandle类的子类(如ManualResetEvent或AutoResetEvent)来同步线程,一个线程等待特定事件发生,另一个线程触发事件。 - **条件变量(Conditional Variables)**:允许线程在满足...

Global site tag (gtag.js) - Google Analytics