Java基础 - IO流

IO流

分类

按数据流向分
  • 输入流:将本地(或服务器)硬盘的数据读取到内存中
  • 输出流:将内存中的数据读取到地(或服务器)硬盘中
按操作方式分
  • 字节流:以字节的形式输入输出
    • InputStream
    • OutputStream
  • 字符流:以字符的形式输入输出
    • Reader
    • Write

四个类都是抽象类,所以使用IO流使用这四个类的子类

部分代码

字符流
String path1 = "src/IO/file/demo1.txt";
        String path2 = "src/IO/file/demo2.txt";

        // FileReader 字符流读取写入数据
        FileReader fileReader = new FileReader(path1);
        FileWriter fileWriter = new FileWriter(path2);
        int len;
        while ((len = fileReader.read()) != -1) {
            fileWriter.write(len);
        }

        fileReader.close();
        fileWriter.close();

        System.out.println("success!!!");

        // BufferReader 字符流读取写入数据
        BufferedReader bufferedReader = new BufferedReader(new FileReader(path1));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path2));
        int len;
        while((len = bufferedReader.read()) != -1) {
            bufferedWriter.write(len);
        }

        bufferedReader.close();
        bufferedWriter.close();

        System.out.println("success!!!");

        // BufferedReader 读取写入数据
        BufferedReader bufferedReader = new BufferedReader(new FileReader(path1));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path2));

        int len;
        char[] chars = new char[10];
        while ((len = bufferedReader.read(chars)) != -1) {
            bufferedWriter.write(chars,0,len);
        }

        bufferedReader.close();
        bufferedWriter.close();

        System.out.println("success!!!");
字节流
String path1 = "src/IO/file/demo1.txt";
        String path2 = "src/IO/file/demo2.txt";

        FileInputStream fileInputStream = new FileInputStream(path1);
        FileOutputStream fileOutputStream = new FileOutputStream(path2);

        /*int len;
        while ((len = fileInputStream.read()) != -1) {
            fileOutputStream.write(len);
        }*/

        /*int l;
        byte[] ch = new byte[10];
        while ((l = fileInputStream.read(ch)) != -1) {
            fileOutputStream.write(ch,0,l);
        }*/

        /*fileInputStream.close();
        fileOutputStream.close();*/

        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);

        /*int len;
        while ((len = bufferedInputStream.read()) != -1) {
            bufferedOutputStream.write(len);
        }*/

        int len;
        byte[] bytes = new byte[1000];
        while ((len = bufferedInputStream.read(bytes)) != -1) {
            bufferedOutputStream.write(bytes, 0, len);
        }
        
        bufferedInputStream.close();
        bufferedOutputStream.close();

文件下载

将程序中的文件下载到本地

代码如下

public HttpServletResponse download(String path, HttpServletResponse response) {
 try {
  // path是指欲下载的文件的路径。
  File file = new File(path);
  // 取得文件名。
  String filename = file.getName();
  // 取得文件的后缀名。
  String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
 
  // 以流的形式下载文件。
  InputStream fis = new BufferedInputStream(new FileInputStream(path));
  byte[] buffer = new byte[fis.available()];
  fis.read(buffer);
  fis.close();
  // 清空response
  response.reset();
  // 设置response的一些数据
  // ContentType:作用是让服务器告诉浏览器它发送的数据属于什么文件类型
  response.setContentType("application/octet-stream");
  // 设置response的Header
  // 当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
  response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
  response.addHeader("Content-Length", "" + file.length());
  OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
  
  toClient.write(buffer);
  toClient.flush();
  toClient.close();
 } catch (IOException ex) {
  ex.printStackTrace();
 }
 return response;
 }


文件下载的一些注意事项

如何实现文件下载

要实现文件下载,我们只需要设置两个特殊的相应头,它们是什么头?如果文件名带中文,该如何解决?

两个特殊的相应头:

----Content-Type: application/octet-stream

----Content-Disposition: attachment;filename=aaa.zip //其中aaa.zip是文件名

解决中文乱码的一种方式

response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
1. HTTP消息头

(1)通用信息头

即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma

主要: Cache-Control , Connection , Data , Pragma , Trailer , Transfer-Encoding , Upgrade

(2)请求头

用于在请求消息中向服务器传递附加信息,主要包括客户机可以接受的数据类型,压缩方法,语言,以及客户计算机上保留的信息和发出该请求的超链接源地址等.

主要: Accept , Accept-Encoding , Accept-Language , Host ,

(3)响应头

用于在响应消息中向客户端传递附加信息,包括服务程序的名称,要求客户端进行认证的方式,请求的资源已移动到新地址等.

主要: Location , Server , WWW-Authenticate(认证头)

(4)实体头

用做实体内容的元信息,描述了实体内容的属性,包括实体信息的类型,长度,压缩方法,最后一次修改的时间和数据的有效期等.

主要: Content-Encoding , Content-Language , Content-Length , Content-Location , Content-Type

(4)扩展头

主要:Refresh, Content-Disposition

2. 几个主要头的作用

(1)Content-Type的作用

该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。

例如:当Content-Type 的值设置为text/html和text/plain时,前者会让浏览器把接收到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析.

(2)Content-Disposition 的作用

当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值