1.什么是FTP?(转载内容)
什么是ftp?
(文件传输协议)
FTP 是File Transfer Protocol(
文件传输协议
)的英文简称,而中文简称为“文传协议”。用于Internet上的
控制文件
的双向传输。同时,它也是一个
应用程序
(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
import java.io.IOException;
import sun.net.*;
import sun.net.ftp.*;
public class FTP {
public static void main(String[] args) {
String ftpserver="server url";
String user="user";
String pwd="pwd";
String path="path";
try {
FtpClient ftpClient=new FtpClient();
ftpClient.openServer(ftpserver);
echo(ftpClient.getResponseString());
ftpClient.login(user, pwd);
echo(ftpClient.getResponseString());
if (path.length() != 0) {
ftpClient.cd(path);
echo(ftpClient.getResponseString());
}
TelnetInputStream tis = ftpClient.list();
echo(ftpClient.getResponseString());
int c;
while ((c = tis.read())!= -1) {
System.out.print((char)c);
}
echo(ftpClient.getResponseString());
tis.close();
echo(ftpClient.getResponseString());
ftpClient.closeServer();
echo(ftpClient.getResponseString());
}
catch(IOException ex){
ex.printStackTrace();
}
}
static void echo(String response){
System.out.println("Response-----> " + response);
}
}
二:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class FTPClient{
public static void main(String[] args) throws Exception {
Socket socket = new Socket("url",21);
//get the is and os, how to work about them.
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//read info from the input stream, it is the response from server.
byte[] buffer = new byte[10000];
int length = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
//send the user
String str = "USER user/n";
os.write(str.getBytes());
//get the response.
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//send the password.
str = "PASS password/n";
os.write(str.getBytes());
//get the response.
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//send command.
str = "CWD path/n";
os.write(str.getBytes());
//get the response.
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//set mode
str = "EPSV ALL/n";
os.write(str.getBytes());
//get the response.
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//得到被动监听信息
str = "EPSV/n";
os.write(str.getBytes());
//得到返回值
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//取得FTP被动监听的端口号
System.out.println("debug----------------");
String portlist=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
System.out.println(portlist);
//实例化ShowList线程类,链接FTP被动监听端口号
ShowList sl=new ShowList();
sl.port=Integer.parseInt(portlist);
sl.start();
//执行LIST命令
str = "LIST/n";
os.write(str.getBytes());
//得到返回值 length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//关闭链接
is.close();
os.close();
socket.close();
}
}
// 得到被动链接信息类,这个类是多线程的
class ShowList extends Thread {
public int port = 0;
public void run() {
try {
Socket socket = new Socket("192.168.0.1", this.port);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte[] buffer = new byte[10000];
int length = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
// 关闭链接
is.close();
os.close();
socket.close();
} catch (Exception ex) {
}
}
}
2.文件复制
四种文件复制的方法
文件复制:
private static void copyFileUsingApacheCommonsIO(File source,File dest)throws IOException {
FileUtils.copyFile(source, dest);
}
文件夹压缩
- <span style="font-size:18px;background-color: rgb(204, 204, 204);">package cn.gov.csrc.base.util;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.zip.ZipEntry;
- import java.util.zip.ZipOutputStream;
- /**
- * 将文件夹下面的文件
- * 打包成zip压缩文件
- *
- * @author admin
- *
- */
- public final class FileToZip {
- private FileToZip(){}
- /**
- * 将存放在sourceFilePath目录下的源文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下
- * @param sourceFilePath :待压缩的文件路径
- * @param zipFilePath :压缩后存放路径
- * @param fileName :压缩后文件的名称
- * @return
- */
- public static boolean fileToZip(String sourceFilePath,String zipFilePath,String fileName){
- boolean flag = false;
- File sourceFile = new File(sourceFilePath);
- FileInputStream fis = null;
- BufferedInputStream bis = null;
- FileOutputStream fos = null;
- ZipOutputStream zos = null;
- if(sourceFile.exists() == false){
- System.out.println("待压缩的文件目录:"+sourceFilePath+"不存在.");
- }else{
- try {
- File zipFile = new File(zipFilePath + "/" + fileName +".zip");
- if(zipFile.exists()){
- System.out.println(zipFilePath + "目录下存在名字为:" + fileName +".zip" +"打包文件.");
- }else{
- File[] sourceFiles = sourceFile.listFiles();
- if(null == sourceFiles || sourceFiles.length<1){
- System.out.println("待压缩的文件目录:" + sourceFilePath + "里面不存在文件,无需压缩.");
- }else{
- fos = new FileOutputStream(zipFile);
- zos = new ZipOutputStream(new BufferedOutputStream(fos));
- byte[] bufs = new byte[1024*10];
- for(int i=0;i<sourceFiles.length;i++){
- //创建ZIP实体,并添加进压缩包
- ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());
- zos.putNextEntry(zipEntry);
- //读取待压缩的文件并写进压缩包里
- fis = new FileInputStream(sourceFiles[i]);
- bis = new BufferedInputStream(fis, 1024*10);
- int read = 0;
- while((read=bis.read(bufs, 0, 1024*10)) != -1){
- zos.write(bufs,0,read);
- }
- }
- flag = true;
- }
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- } catch (IOException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- } finally{
- //关闭流
- try {
- if(null != bis) bis.close();
- if(null != zos) zos.close();
- } catch (IOException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
- }
- return flag;
- }
- public static void main(String[] args){
- String sourceFilePath = "D:\\TestFile";
- String zipFilePath = "D:\\tmp";
- String fileName = "12700153file";
- boolean flag = FileToZip.fileToZip(sourceFilePath, zipFilePath, fileName);
- if(flag){
- System.out.println("文件打包成功!");
- }else{
- System.out.println("文件打包失败!");
- }
- }
- }
- </span>
文件夹删除
1、
- //递归删除文件夹
- private void deleteFile(File file) {
- if (file.exists()) {//判断文件是否存在
- if (file.isFile()) {//判断是否是文件
- file.delete();//删除文件
- } else if (file.isDirectory()) {//否则如果它是一个目录
- File[] files = file.listFiles();//声明目录下所有的文件 files[];
- for (int i = 0;i < files.length;i ++) {//遍历目录下所有的文件
- this.deleteFile(files[i]);//把每个文件用这个方法进行迭代
- }
- file.delete();//删除文件夹
- }
- } else {
- System.out.println("所删除的文件不存在");
- }
- }
2、
- public static void deleteAllFilesOfDir(File path) {
- if (!path.exists())
- return;
- if (path.isFile()) {
- path.delete();
- return;
- }
- File[] files = path.listFiles();
- for (int i = 0; i < files.length; i++) {
- deleteAllFilesOfDir(files[i]);
- }
- path.delete();
- }
3.delete() 和 deleteOnExit() 的区别(转载内容)
下面两段代码中分别用了delete()方法和deleteOnExit()方法:
public void wordToHtml(String docPath){
String htmlPath=docPath.substring(0, docPath.indexOf("."));
Dispatch.invoke(doc,"SaveAs",Dispatch.Method,
new Object[]{htmlPath,new Variant(8)},new int[1]);
File htmlFile=new File(htmlPath+".htm");
htmlFile.deleteOnExit();
}
public HashMap<Integer,String> getImagesPath(String docPath){
int count=0;
String filePath=docPath.substring(0,docPath.indexOf("."))+".files";
File file=new File(filePath);
HashMap<Integer,String> hm =new HashMap<Integer,String>();
if(file.isDirectory()){
File[] files=file.listFiles();
for(File f:files){
if(f.exists()){
String fileName=f.getName();
String fileSuffix=fileName.substring(fileName.lastIndexOf(".")+1);
if(fileSuffix.equalsIgnoreCase("jpg")||fileSuffix.equalsIgnoreCase("png")){
++count;
if(count%2==0){
hm.put(count/2, f.getAbsoluteFile()+"");
}else{
f.delete();
}
}else{
f.delete();
}
}
}
}
return hm;
}
下面是我写的一个测试类:
public void test(){
ReadDocuments rd=new ReadDocuments();
rd.setVisible(false);
rd.openDoc("D:\\试验.docx");
rd.wordToHtml("D:\\试验.html");
HashMap hm=rd.getImagesPath("D:\\试验.docx");
Iterator<Integer> it=hm.keySet().iterator();
while(it.hasNext()){
System.out.println(hm.get(it.next()));
}
rd.deleteTempFiles("D:\\试验.docx");
rd.closeWord();
}
下面是我的一些理解:
根据API文档,可以得到最直观的两点信息:
delete
()
删除此抽象路径名表示的文件或目录。
deleteOnExit
()
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
可以这样理解,JVM是Java程序运行的环境,当运行test()方法时,JVM随之启动,它也有自己的生命周期。当调用delete()方法直接删除文件时,不用判断文件是否存在,一经调用立即执行;而调用deleteOnExit()方法时,我的理解是只是相当于对deleteOnExit()作一个声明,当程序运行结束,JVM终止时才真正调用deleteOnExit()方法实现删除操作。
在wordToHtml()类中,将word文档转化为html格式时,除生成的html之外,系统还会生成一个.files的文件用来存放word中的图片等相关信息,而.files文件中的图片才是我所要的。当我将其中的deleteOnExit()方法改为delete()方法时会出现删除不干净或者是无法删除html的现象。我的理解是word转化为html是多线程的,多个线程的执行时间长短不一,当某个线程结束出发delete()事件的时候,可能其他的线程仍在执行,顾出现删除不了或无法删除的现象。