`

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

阅读更多

实现一个定时自动上传文件到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)

 

分享到:
评论

相关推荐

    多线程测试!!!!!!!!

    这样,即使一个线程被阻塞(例如等待I/O操作完成),其他线程仍能继续执行,提升了程序的并发性和效率。 在C#中,多线程主要通过`System.Threading`命名空间下的类来实现。其中,`Thread`类是创建和管理线程的基础...

    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++应用程序框架,广泛用于图形用户界面和其他应用程序开发。多线程是并发处理多个请求的关键技术...

    c# Winform 弹出式等待窗口,多线程

    网上有好多使用多线程弹出式等待窗口作为程序中较长时间后台运行提示的,但是做的都不完善,尤其是用 waitThread.Abort() 杀死线程时容易产生异常,进而出错。本程序是比较完善的改进,利用多线程弹出等待窗口,并...

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

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

    uThreadPool.pas修正错误并加入线程等待功能

    delphi多线程 uThreadPool.pas 修正错误 线程等待功能

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

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

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

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

    在C#中编写多线程应用程序,简单!_www_knowsky_com.htm

    在C#中编写多线程应用程序,简单!_www_knowsky_com.htm在C#中编写多线程应用程序,简单!_www_knowsky_com.htm在C#中编写多线程应用程序,简单!_www_knowsky_com.htm

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

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

    C++线程测试3!

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

    VC.zip_VC多线程_vc 多线程

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

Global site tag (gtag.js) - Google Analytics