您当前的位置:首页 > 互联网教程

如何使Java中的InputStream的深层复制

发布时间:2025-05-19 23:52:36    发布人:远客网络

如何使Java中的InputStream的深层复制

一、如何使Java中的InputStream的深层复制

1、InputStream的是抽象的,不公开(没有尽自己的孩子)的内部数据对象。所以唯一的办法,以“深拷贝”InputStream的是创造ByteArrayOutputStream后执行Read()上的InputStream,写(),该数据ByteArrayOutputStream。然后做:方通=新ByteArrayInputStream的(byteArrayOutputStream.toArray());

2、如果您使用的是标记()您的InputStream那么你的确不能扭转这一点。这使你流“消费”。

3、要“重用”你的InputStream避免使用标记(),然后在阅读呼叫复位结束()。您会然后读取来自流的开头。

4、顺便说一句,IOUtils使用这个简单的code片段复制的InputStream:

5、公共静态INT副本(输入的InputStream,OutputStream的输出)抛出IOException异常{

6、byte []的缓冲区=新的字节[DEFAULT_BUFFER_SIZE]

7、而(-1!=(N= input.read(缓冲液))){

8、output.write(缓冲液,0,n)的;

二、有关java上传和File以及FileInputStream的区别

1、1:PostUploadInfo的js是页面<ai:fileupload标签自动加载的AIFileUpload.js里的方法

2、这里的ActionDocumentInfo.java注意与FtpUtilPro.java(它的一个upload方法有bug)的对比能

3、从这个bug要看出File与FileInputStream的区别,File不属于流,它只是用来屏闭不同文件系统,用来统一

4、描述文件的实体BEAN,new File时给它传入文件名称或是路径,它就会去根据参数查找对应的文件属性然后封装

5、成实体。用来处理判断该路径是一个文件还是路径,文件或路径的权限,修改时间等等,路径的子路径list等等目录操作。

6、File不属于文件流,只能代表一个文件或是目录的路径名而已.

7、而FileInputStream关注的是文件的内容,是用来进行文件读写等操作的二进制流类。大多数情况下,构造FileInputStream

8、时传递一个File对象做参数,也可以直接传递String的文件路径。

9、这个容易混淆的问题在FTP时候很容易出现,因为客户端点击浏览本地文件后在上传时在服务器端如果直接把客户端的

10、文件名称拿到,然后用new File(“文件名称路径”),再用new InputStream(File)来上传到FTP的话,其实就是相当于服务器

11、端在服务器本地找File(“文件名称路径”),然后往FTP上传,这是错误的。我们希望的是上传客户端的文件,而不是

12、服务器端的文件,所以这里应该是直接用apache的FileItem.getInputStream的结果直接upload,如下:

13、InputStream fileIn= item.getInputStream();////如果直接写成这样new FileInputStream(filePath);就会出现在服务器本机找file上传的问题

14、//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。

15、public void doUpload(HttpServletRequest request, HttpServletResponse response) throws Exception{

16、CustomProperty cp= CustomProperty.getInstance();

17、//调用apache控件上传文件,返回数组,第一个存放文件对象,第二个存放参数对象

18、Object obj[]= ApacheUploadTool.getUploadFileInfo(request);

19、if(fileList== null|| fileList.size()==0){

20、cp.set("MESSAGE","找不到上传的文件");

21、String editMode= HttpUtil.getParameter(request,"edit_mode");

22、String objectId= HttpUtil.getParameter(request,"OBJECT_ID");

23、String busiType= HttpUtil.getParameter(request,"BUSI_TYPE");

24、// System.out.println("================"+editMode);

25、for(int i=0;i<fileList.size();i++){

26、FileItem item=(FileItem)fileList.get(i);

27、String fileName= fixFileName(item.getName());

28、IDocumentInfoSV idao= CommonService.getIDocumentInfoSV();

29、docSize= String.valueOf(item.getSize());

30、String codetype= String.valueOf(StaticValue.CFG_FTP_PATH_CODE);

31、String ftpPathName= BaseDataCodeAction.getCodeName(codetype, busiType);

32、if(null==ftpPathName||"".equals(ftpPathName)){

33、throw new Exception("没有该业务对应的FTP路径配置!");

34、// System.out.println("ftpPathName="+ftpPathName);

35、FtpUtil ftpUtil= new FtpUtil(ftpPathName);

36、// FtpUtilPro ftpUtil= new FtpUtilPro(ftpPathName);

37、// System.out.println("item=="+item);

38、// System.out.println("item.getInputStream()=="+item.getInputStream());

39、InputStream fileIn= item.getInputStream();//new FileInputStream(filePath);//如果直接写成这样就会出现在服务器本机找file上传的问题

40、//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。

41、IBODocumentInfoValue[] retValues= CommonService.getIDocumentInfoSV().queryDocumentInfoList(Long.parseLong(busiType), Long.parseLong(objectId));

42、for(int j=0;j<retValues.length;j++){

43、String docName= retValues[j].getDocumentName();

44、ExceptionUtil.throwBossException(83000015,new String[]{fileName});

45、if(editMode.equals("addNew")){

46、// ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);

47、ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);

48、else if(editMode.equals("modify")){

49、// System.out.println("================"+HttpUtil.getParameter(request,"DOCUMENT_ID"));

50、String oldId= HttpUtil.getParameter(request,"DOCUMENT_ID");

51、IBODocumentInfoValue acond= new BODocumentInfoBean();

52、acond.setDocumentId(Long.parseLong(oldId));

53、IBODocumentInfoValue[] beanValues= idao.getDocumentInfo(acond,"",null);

54、if(null== beanValues|| beanValues.length==0){

55、throw new Exception("没有文档信息");

56、IBODocumentInfoValue beanValue= beanValues[0];

57、String oldFileName= beanValue.getDocumentName();

58、ftpUtil.upload(oldFileName, fileIn,FtpUtil.BIN);

59、aVirtualFileName= newFileName;

60、aVirtualFileName= aVirtualFileName+","+ newFileName;

61、cp.set("MESSAGE","附件"+aVirtualFileName+"上传成功!");

62、cp.set("VIRTUAL_FILE_NAME_LIST", aVirtualFileName);

63、cp.set("DOCUMENT_SIZE", docSize);

64、cp.set("MESSAGE",StaticValue.SYS_ERROR_INFO);

65、cp.set("MESSAGE",ExceptionUtil.getBossExceptionHint(ex));

66、ApacheUploadTool.showFileUploadMsg(response,cp);

67、附件是自己的ftp实现示例,和一些网上最简单的jsp上传的代码,也最能说明原理

三、如何将InputStream流数据转换为byte数组

1、Java中InputStream流处理是一个常见的操作,当需要将输入数据转换为byte[]数组时,有多种方法可供选择。本文将为您详细介绍这些转换方法,并提供相应的示例代码,帮助您更直观地理解和应用。

2、首先,最直接的方法是使用InputStream.read(byte[] b, int off, int len),这个方法会读取指定数量的字节到指定的byte数组中。例如:

3、int bytesRead= in.read(bytes);

4、// bytesRead now holds the number of bytes read

5、另一种方式是使用InputStream.getChannel().read(ByteBuffer dst),通过NIO(New I/O)API,可以更高效地读取大量数据:

6、ByteBuffer buffer= ByteBuffer.allocateDirect(1024);

7、while(in.getChannel().read(buffer)!=-1){

8、 byte[] bytes= new byte[buffer.remaining()];

9、最后,可以使用InputStream.toByteArray()方法,该方法会一次性读取所有数据并返回一个byte数组:

10、byte[] bytes= new byte[in.available()];

11、以上就是Java InputStream流转换为byte[]字节数组的几种常见方法及其示例,希望对您的编程实践有所帮助。