程序很坑是真的。你挖了很多坑在这里边。但你师傅说的两个坑其实只有一个!这个涉及到非托资源的问题,需要我们进行手动释放!
Stream就是,你既然知道Stream在使用完毕后进行close,为什么FileStream就不能Close一下?要知道不管你是FileStream还是其他的任何Stream都是继承于Stream的,而Stream就是非托资源,所以在使用后必须进行Close或Dispose!
换句话来说,你没有将FileStream对象进行Close导致某个文件一直被占用!但FileInfo却是托管资源,他不需要Close,也没有Dispose!所以它不是坑!
StreamClose()与StreamDispose()之间存在关联性,就是StreamClose()本身就会调用Dispose()!所以你写Close()是一个安全关闭的办法,会调用Dispose()的,而直接调用Dispose()也会让系统回收资源。
而真正的大坑就这一个!还有object = null;在C/CPP中会启作用,但对于net来说,没有任何作用的——GC回收并不因为你使用了null而加快回收!关于使用资源使用完毕后是,再赋值为null能不能加快回收的讨论一直都有——很多人都以为会加快回收速度,事实上属于臆猜——这个语句并不能触了GC回收,而无论是否写null对GC回收没有影响,原因是GC回收机制的限制,对于0代/1代/2代类加收的时间分别为1:10:100,除非显式调用GCCollection(),否则这个回收机制并不会受到任何影响——这是十年前的争论了。所以对于你的request = null;与程序直接退出方法是没有任何区别的,写了是很多余的!除非了你的request = null;之后还有很长时间需要运行才会退出方法!GC回收可能有影响(也是猜的)。
还有一点你可能不知道:
FileStream中的ReadBytes方法,我们一般使用长度是是4096的倍数(现在硬盘都是4k对齐),不管你是2048还是多少都是一次读一族,所谓的4k对齐就是这个作用,如果你是2048,你每两次读取同一个簇!这个如果对付小文件无可厚非,而对付大文件时就明显了!
打开你的电脑——写一个记事本(只写一个字符),看一下文件属性(文件大小为1byte,而占用空间是4k),因为磁盘缓冲等原因,所以读取时应该是4k的倍数!还有无论是2048还是4096都说明你太小心眼了——直接409600(100K)!
使用Apache 的 FTP Client (JAVA开源包commons-net-20包)获取FTP服务器上的文件列表,写一个递归循环的list()方法
当 FTP 服务器上的文件数目过多时,运行程序
FTPFile[] fs = ftplistFiles(pathName);
并且通过
for (FTPFile f : fs) {
// TODO something
}
获取目录列表,会出现如下的异常:
PORT 192,168,0,17,73,49
421 Timeout
orgapachecommonsnetftpFTPConnectionClosedException: FTP response 421 received Server closed connection
at orgapachecommonsnetftpFTP__getReply(FTPjava:346)
at orgapachecommonsnetftpFTPsendCommand(FTPjava:490)
at orgapachecommonsnetftpFTPsendCommand(FTPjava:534)
at orgapachecommonsnetftpFTPport(FTPjava:862)
at orgapachecommonsnetftpFTPClient_openDataConnection_(FTPClientjava:463)
at orgapachecommonsnetftpFTPClientinitiateListParsing(FTPClientjava:2296)
at orgapachecommonsnetftpFTPClientinitiateListParsing(FTPClientjava:2269)
at orgapachecommonsnetftpFTPClientlistFiles(FTPClientjava:2047)
因此,为了防止出现这个异常,只好采用获取RawListing的方式,然后通过正则来解析 String 得到目录列表和目录包含的文件详细信息。
=====================================
在使用了下面的部分就会经常出现问题
public static void list(FTPClient ftp, String pathName, String fileName) throws IOException {
Systemoutprintln("-----> 进入目录: " + pathName);
if (i % 20 == 0) {
//ftpchangeWorkingDirectory(pathName);
try {
writeFile(s, fileName);
s = "";
} catch (Exception e) {
eprintStackTrace();
}
try {
Random r = new Random();
int n = rnextInt(10);
Threadsleep(n 1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
i++;
// XXXXXXXXX DO something
}
执行到ftpconnect(ftpIP)进报的错,ftpIP是有值是IP+ ": "+端口
//FTP连接
public boolean connectFTP(){
try {
ftp = new FTPClient();
if(ftpPortequals( " ")){
ftpconnect(ftpIP);
}
boolean blogin = ftplogin(ftpUser,ftpPassword);
if (!blogin) {
Systemoutprintln( "FTP连接失败: "+ftpIP);
ftpdisconnect();
ftp = null;
return false;
}
return true;
} catch (Exception e) {
eprintStackTrace();
Systemoutprintln( "FTP连接失败: "+ftpIP);
}
return false;
}
javanetInetAddressgetAllByName0(InetAddressjava:591)
javanetInetAddressgetAllByName0(InetAddressjava:560)
javanetInetAddressgetByName(InetAddressjava:492)
javanetSocket <init> (Socketjava:121)
at orgapachecommonsnetDefaultSocketFactorycreateSocket(DefaultSocketFactoryjava:53)
at orgapachecommonsnetSocketClientconnect(SocketClientjava:162)
at orgapachecommonsnetSocketClientconnect(SocketClientjava:250)
at JavaAgentconnectFTP(JavaAgentjava:432)
------解决方案--------------------
没人知道吗,急啊!!!!!!!
------解决方案--------------------
import sunnetftp;
import javaio;
import javaioIOException;
import javautilStringTokenizer;
import sunnetftp;
import javautilArrayList;
import sunnetTelnetOutputStream;
public class ftpClient {
public ftpClient() {
}
FtpClient client;
private String host= "13564160151 ";//FTP服务器IP
private String username= "anonymous ";//FTP用户名字
private String password= " ";//FTP密码
private String path = "/test "; //文件要放哪个目录
private int port = 21; //FTP端口
/
连接服务器方法
/
public void connect() {
try {
client = new FtpClient(host);
clientlogin(username, password);
//设置成2进制传输
clientbinary();
clientcd(path);
Systemoutprintln( "登陆成功 ");
}
catch (FtpLoginException e) {
Systemoutprintln( "无权限相连接 " + egetMessage());
}
catch(IOException e){
Systemoutprintln( "连接失败 "+egetMessage());
}
catch(SecurityException e){
Systemoutprintln( "用户名字或者密码不对 ");
}
}
1,确保手工用FTP客户端连接没问题。
2,手工没问题,程序也应该没问题才是。
3,确保程序中安全CLOSE连接,FTP服务器也是有连接限制的。
4,适当考虑重起一下FTP服务器。
由于服务器安全设置,只放开部分端口可以访问服务器,因此这些随意的端口都被拦截,造成无法建立FTP连接。这是服务器网管为了保证用户的安全,所以用户在FTP的时候要选用PORT模式。FTP设置帮助:FTP设置时,请勿选择在PASV模式下上传
以上就是关于C#实现ftp文件上传,他写了一个ftp类 给我的步骤是1 ftp 2读取文件 3创建文件夹(分文件上传) 4 异常捕捉全部的内容,包括:C#实现ftp文件上传,他写了一个ftp类 给我的步骤是1 ftp 2读取文件 3创建文件夹(分文件上传) 4 异常捕捉、ftp response 421 received.server closed connection 怎么解决、连接FTP时报错,救,该怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)