谁有关于java nio多文件的上传的简单例子共享下哈。。(50分相送) 谁有关于java nio多文件的上传的简单例子共享下哈。。50分相送或者写出你的感言也可以 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在客户端 往服务器发送数据的时候 发送一部分之后Thread.sleep(1);是否合适如下: Thread.sleep(1);//暂停1毫秒 while (buffer1.hasRemaining())//发送数据代码段 { schannel.write(buffer1); } Thread.sleep(1);//如此设置是否合适。为什么 while (buffer2.hasRemaining()) { schannel.write(buffer2); } Thread.sleep(1); package photo;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.Iterator;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class Upload extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=GB2312"); PrintWriter out = response.getWriter(); try { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sevletFileUpload = new ServletFileUpload(factory); // 设置允许用户上传文件大小,单位:字节,这里设为2m sevletFileUpload.setSizeMax(2 * 1024 * 1024); // 设置最多只允许在内存中存储的数据,单位:字节 factory.setSizeThreshold(4096); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 factory.setRepository(new File("d:\\temp")); // 开始读取上传信息 List fileItems = sevletFileUpload.parseRequest(request); // 依次处理每个上传的文件 Iterator iter = fileItems.iterator(); // 正则匹配,过滤路径取文件名 String regExp = ".+\\\\(.+)$"; // 过滤掉的文件类型 String[] errorType = { ".exe", ".com", ".cgi", ".asp" }; Pattern p = Pattern.compile(regExp); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); // 忽略其他不是文件域的所有表单信息 if (!item.isFormField()) { String name = item.getName(); long size = item.getSize(); if ((name == null || name.equals("")) && size == 0) continue; Matcher m = p.matcher(name); boolean result = m.find(); if (result) { for (int temp = 0; temp < errorType.length; temp++) { if (m.group(1).endsWith(errorType[temp])) { throw new IOException(name + ": 非法文件类型禁止上传"); } } try { // 保存上传的文件到指定的目录 // 在下文中上传文件至数据库时,将对这里改写开始 item.write(new File("d:\\uploadfile\\"+ m.group(1))); out.print(name + " " + size + "<br>"); // 在下文中上传文件至数据库时,将对这里改写结束 } catch (Exception e) { out.println(e); } } else { throw new IOException("fail to upload"); } } } } catch (IOException e) { out.println(e); } catch (FileUploadException e) { out.println(e); } } public void init() throws ServletException { // Put your code here }} 对于第二个问题,可以是可以,我感觉没有必要这样Thread.sleep(1);线程暂停1毫秒,其实线程是经常被暂停和打断的,Thread.Sleep操作只是人为的让出时间给其他线程来运行。线程管理单元的操作是以几个到几使个毫秒为调度周期的也就是说你用了Thread.Sleep 无论你指定多少当前线程都要进行最少几个毫秒的等待如果此刻正好有几个高优先级线程在等待 它们会优先执行而放在客户端 往服务器发送数据的时候 这种情况下,每发送一部分数据就会使线程暂停一下,这样系统性能不但没有像你想象的那样,线程暂停下,给其他线程来执行使性能提高,反而这样频繁的切换会使之效率下降 呵呵。。谢谢,[email protected]关于这个影响效率的事情 还是不特明白。。能麻烦你+下我qq给细讲下么? 前辈 拜托你了 //我的初始想法是这样的//在传输数据的时候 默认是连在一起的。在接收数据的时候 有些麻烦//为了避免这种数据字节拆分的麻烦,我是这样操作的 Thread.sleep(1);//暂停1毫秒 while (buffer1.hasRemaining())//1.发送一段byte ,用来说明后面2的文件信息 (发送文件之前先发送文件标题 大小等信息) { schannel.write(buffer1); } Thread.sleep(1);//暂停,以便服务器 获取并得到马上要传的文件信息 while (buffer2.hasRemaining())//2.发送文件。先前已经将本文件的初始信息发送过去了。 { schannel.write(buffer2); } Thread.sleep(1);//暂停。 ...... 我说大哥。你不会给我发错了吧 怎么还是jsp的上传啊我要的是java 的nio上传呢。大哥不会是发错了吧 求助io读取txt文本的问题!请各位高手支招! .class文件怎么打开? JSP中有哪些内置对象? java可否传递数据集? 请问如何获得ResultSet的行数? 一个小问题. 怎样获得当前的时间,并把它转化为yyyy-mm-dd的格式? 在WEB应用的情况下怎么遍历类路径? interfaces的extend??? java图形继续讨论! sql中的check约束 在项目中使用么? 一道IBM的面试题(新的哦)
发送一部分之后Thread.sleep(1);是否合适
如下: Thread.sleep(1);//暂停1毫秒
while (buffer1.hasRemaining())//发送数据代码段
{
schannel.write(buffer1);
}
Thread.sleep(1);//如此设置是否合适。为什么 while (buffer2.hasRemaining())
{
schannel.write(buffer2);
}
Thread.sleep(1);
package photo;import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;public class Upload extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=GB2312");
PrintWriter out = response.getWriter();
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sevletFileUpload = new ServletFileUpload(factory);
// 设置允许用户上传文件大小,单位:字节,这里设为2m
sevletFileUpload.setSizeMax(2 * 1024 * 1024);
// 设置最多只允许在内存中存储的数据,单位:字节
factory.setSizeThreshold(4096);
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
factory.setRepository(new File("d:\\temp"));
// 开始读取上传信息
List fileItems = sevletFileUpload.parseRequest(request);
// 依次处理每个上传的文件
Iterator iter = fileItems.iterator();
// 正则匹配,过滤路径取文件名
String regExp = ".+\\\\(.+)$";
// 过滤掉的文件类型
String[] errorType = { ".exe", ".com", ".cgi", ".asp" };
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
// 忽略其他不是文件域的所有表单信息
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if ((name == null || name.equals("")) && size == 0)
continue;
Matcher m = p.matcher(name);
boolean result = m.find();
if (result) {
for (int temp = 0; temp < errorType.length; temp++) {
if (m.group(1).endsWith(errorType[temp])) {
throw new IOException(name + ": 非法文件类型禁止上传");
}
}
try {
// 保存上传的文件到指定的目录
// 在下文中上传文件至数据库时,将对这里改写开始
item.write(new File("d:\\uploadfile\\"+ m.group(1)));
out.print(name + " " + size + "<br>");
// 在下文中上传文件至数据库时,将对这里改写结束
} catch (Exception e) {
out.println(e);
}
}
else {
throw new IOException("fail to upload");
}
}
}
} catch (IOException e) {
out.println(e); } catch (FileUploadException e) {
out.println(e);
}
} public void init() throws ServletException {
// Put your code here
}}
Thread.sleep(1);
线程暂停1毫秒,
其实线程是经常被暂停和打断的,Thread.Sleep操作只是人为的让出时间给其他线程来运行。线程管理单元的操作是以几个到几使个毫秒为调度周期的
也就是说你用了Thread.Sleep 无论你指定多少
当前线程都要进行最少几个毫秒的等待
如果此刻正好有几个高优先级线程在等待 它们会优先执行而放在客户端 往服务器发送数据的时候 这种情况下,每发送一部分数据就会使线程暂停一下,
这样系统性能不但没有像你想象的那样,线程暂停下,给其他线程来执行使性能提高,
反而这样频繁的切换会使之效率下降
//在传输数据的时候 默认是连在一起的。在接收数据的时候 有些麻烦//为了避免这种数据字节拆分的麻烦,我是这样操作的 Thread.sleep(1);//暂停1毫秒
while (buffer1.hasRemaining())//1.发送一段byte ,用来说明后面2的文件信息 (发送文件之前先发送文件标题 大小等信息)
{
schannel.write(buffer1);
}
Thread.sleep(1);//暂停,以便服务器 获取并得到马上要传的文件信息 while (buffer2.hasRemaining())//2.发送文件。先前已经将本文件的初始信息发送过去了。
{
schannel.write(buffer2);
}
Thread.sleep(1);//暂停。
......
我要的是java 的nio上传呢。大哥不会是发错了吧