服务器以流的形式返回一个本地文件给请求方

本文介绍了一个使用Java实现的文件流操作示例,包括如何从本地文件读取数据并将其发送给HTTP请求方,以及如何接收来自HTTP的流数据并保存为本地文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器以流的形式返回一个本地文件给请求方


对于请求方来说,下载来的文件是透明的,就是这个文件的格式和名字都是需要重命名的,这是以流的形式下载文件的一个特点。


import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;

public class FileTest {
	
	public static void main(String [] args){
		FileTest ft=new FileTest();
		ft.test1();
	}
	//----------------------------test1
	public void test1(){
		ActionContext ctx = ActionContext.getContext();
		HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);   
		HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);

		
		//声明流对象
		FileInputStream fis=null;
		String s="";
		try {
			//创建流对象
			fis=new FileInputStream("d:\\a\\123.txt");
			
			//读取数据,并将读取到的数据存储到数组中
			byte[] data=new byte[1024];//数据存储的数组
			int i=0;//当前下标
			
			//读取流中的第一个字节数据
			int n=fis.read();
			
			//依次读取后续的数据
			while(n!=-1){//未到达流的末尾
				//将有效数据存储到数组中
				data[i]=(byte)n;
				
				//下标增加
				i++;
				
				//读取下一个字节的数据
				n=fis.read();
				
			}
			
			//解析数据
			s=new String(data,0,i);
			
			//输出字符串
			System.out.println(s);
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		response.setCharacterEncoding("UTF-8");// 解决接受端的中文乱码问题
		PrintWriter printWriter;
		try {
			printWriter = response.getWriter();
			printWriter.write(s);// 返回的json串
			printWriter.flush();
			printWriter.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	//----------------------------test1
	
	//____________________________test2
	public void test2() throws Exception{
		
		String getURL="http://192.168.1.104:8080/struts2go/fileTest/test1.action;
		
		URL getUrl = new URL(getURL);
		 
		// 根据拼凑的URL,打开连接,URL.openConnection函数会根据URL的类型,
		// 返回不同的URLConnection子类的对象,这里URL是一个http,因此实际返回的是HttpURLConnection
		HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
		// 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
		// 服务器
		connection.setConnectTimeout(25000);
		connection.setReadTimeout(25000);
		connection.connect();
		
		 int status = connection.getResponseCode();
         if (status == 200) {
       	DataInputStream in = new DataInputStream( connection.getInputStream());
     		DataOutputStream out = new DataOutputStream(new FileOutputStream("d:\\a\\新文件.zip"));
     		 byte[] buffer = new byte[4096];
    	    int count = 0;
    	    while ((count = in.read(buffer)) > 0) {
    	        out.write(buffer, 0, count);
    	     }
    	    out.close();
    	    in.close(); 
         } else {
             String strResponse = "error";
         }
         connection.disconnect();
		
	}
	//____________________________test2

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值