zoukankan      html  css  js  c++  java
  • java IO流

    参考链接:http://blog.csdn.net/MAGIC_JSS/article/details/51475923

    java IO流

    (一)含义

    IO:Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中。

    (二)分类

    (三)用法

      3.1 字节文件操作流

      FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。

      读取文件的两种方式

      方式一:一次读取一个字节

    // 读取f盘下该文件f://hell/test.txt
    //构造方法1
    InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));
    int i = 0;
    //一次读取一个字节
    while ((i = inputStream.read()) != -1) {
    
        // System.out.print(i + " ");// 65 66 67 68
        //为什么会输出65 66 67 68?因为字符在底层存储的时候就是存储的数值。即字符对应的ASCII码。
        System.out.print((char) i + " ");// A B C D
    }
    //关闭IO流
    inputStream.close();

      方式二:一次读取一个字节数组

    // 读取f盘下该文件f://hell/test.txt
    //构造方法2
    InputStream inputStream2 = new FileInputStream("f://hello/test.txt");
    // 字节数组
    byte[] b = new byte[2];
    int i2 = 0;
    //  一次读取一个字节数组
    while ((i2 = inputStream2.read(b)) != -1) {
    
        System.out.print(new String(b, 0, i2) + " ");// AB CD
    }
    //关闭IO流
    inputStream2.close();

      注: 一次读取一个字节数组,提高了操作效率,IO流使用完毕一定要关闭。

      FileOutputStream:字节文件输出流是用于将数据写入到File,从程序中写入到其他位置。

      将数据写入到文件 

    OutputStream outputStream = new FileOutputStream(new File("test.txt"));
    // 写入数据
    outputStream.write("ABCD".getBytes());
    // 关闭IO流
    outputStream.close();
    
    // 内容追加写入
    OutputStream outputStream2 = new FileOutputStream("test.txt", true);
    // 输出换行符
    outputStream2.write("
    ".getBytes());
    // 输出追加内容
    outputStream2.write("hello".getBytes());
    // 关闭IO流
    outputStream2.close(); 

      注:输出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;输出换行符时一定要写 不能只写 ,因为不同文本编辑器对换行符的识别存在差异性。

      3.2 字节缓冲流(高效流)

      BufferedInputStream:字节缓冲输入流,提高了读取效率。 

    InputStream in = new FileInputStream("test.txt");
    // 字节缓存流
    BufferedInputStream bis = new BufferedInputStream(in);
    byte[] bs = new byte[20];
    int len = 0;
    while ((len = bis.read(bs)) != -1) {
    
        System.out.print(new String(bs, 0, len));
        // ABCD
        // hello
    }
    // 关闭流
    bis.close();

      BufferedOutputStream:字节缓冲输出流,提高了写出效率。

    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true));
    // 输出换行符
    bos.write("
    ".getBytes());
    // 输出内容
    bos.write("Hello Android".getBytes());
    // 刷新此缓冲的输出流
    bos.flush();
    // 关闭流
    bos.close(); 

      3.3 高效流效率比对

      测试:读取f盘下的一个视频文件到项目中:文件大小29.5 MB

      方式一:

    FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4");
    FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
    int len;
    // 开始时间
    long begin = System.currentTimeMillis();
    // 一次读取一个字节
    while ((len = inputStream.read()) != -1) {
        outputStream.write(len);
    }
    // 用时毫秒
    System.out.println(System.currentTimeMillis() - begin);// 213195
    //关闭流释放资源
    inputStream.close();
    outputStream.close();

      方式二:

    FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4");
    FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
    int len;
    byte[] bs = new byte[1024];
    // 开始时间
    long begin = System.currentTimeMillis();
    // 一次读取一个字节数组
    while ((len = inputStream.read(bs)) != -1) {
        outputStream.write(bs, 0, len);
    }
    // 用时毫秒
    System.out.println(System.currentTimeMillis() - begin);// 281
    
    inputStream.close();
    outputStream.close();

      方式三: 

    InputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4");
    BufferedInputStream bis = new BufferedInputStream(inputStream);
    OutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
    BufferedOutputStream bos = new BufferedOutputStream(outputStream);
    int len;
    byte[] bs = new byte[1024];
    // 开始时间
    long begin = System.currentTimeMillis();
    while ((len = bis.read(bs)) != -1) {
        bos.write(bs, 0, len);
    }
    // 用时毫秒
    System.out.println(System.currentTimeMillis() - begin);// 78
    
    bis.close();
    bos.close(); 

      注:由此可以看出高效缓冲流读写速度是非常快的,建议使用。 

      实战,请移步文章:servlet实现文件上传,预览,下载和删除

      UpdateTime--2017年9月7日14:14:06

      通用说明: 

      a.流的表现形式为int类型的数值,即字符对应的ASCII码,可以强转为单字符;

      b.字节输入流InputStream是将文件转换成流,想要获取输入流中的数据需要调用read()方法;

      FileInputStream fis = new FileInputStream(filePath);

      如果文件不存在,会抛出异常

      c.字节输出流OutputStream是将文件转换成流,想要往文件中输入内容,需将内容转换成byte数组,再调用write()方法;

      FileOutputStream fis = new FileOutStream(filePath);

      filePath可以为相对路径,也可以为绝对路径,推荐使用绝对路径;

      输出的目的地文件不存在,则会自动创建,将文件转换成流,只能写入内容,需要调用write()方法,不能读取内容;

      当创建文件输出流只传入一个文件路径参数时,形如:FileOutputStream fis = new FileOutStream(filePath);,调用fis.write(str.getBytes())时,原文件中的内容将会被覆盖掉;

      不想被覆盖,只是追加内容,可以传入2个参数,形如:FileOutputStream fis = new FileOutStream(filePath, true);

      输出换行符时一定要写 不能只写 ,因为不同文本编辑器对换行符的识别存在差异性。

      2018/11/28

      当调用write()方法时,必须声明三个入参;

    // 6.读取目标文件,通过response将目标文件写到客户端
    // 读取文件
    InputStream is = new FileInputStream(filePath);
    // 输入缓冲流
    BufferedInputStream bis = new BufferedInputStream(is);
    // 输出文件
    OutputStream os = response.getOutputStream();
    // 输出缓冲流
    BufferedOutputStream bos = new BufferedOutputStream(os);
    
    // 写文件
    // 缓冲字节数
    byte data[] = new byte[1024];
    // 实际读取字节数
    int n;
    while ((n = bis.read(data)) != -1) {
        bos.write(data,0,n);
        // 错误方式
        // bos.write(n);
    }
    
    // 关闭流
    bis.close();
    // 清空输出缓冲流
    bos.flush();
    bos.close();
    

      如果只声明一个入参,写入文件里的内容会错误!

    // 写文件
    // 缓冲字节数
    byte data[] = new byte[1024];
    // 实际读取字节数
    int n;
    while ((n = bis.read(data)) != -1) {
        // 错误方式
        bos.write(n);
    }

     相关推荐:

  • 相关阅读:
    ListView与ArrayAdapter(二)
    ListView与SimpleAdapter(三)
    对于ListView的一些用法(一)
    如何使用AsyncTask
    you must restart adb and eclipse的相关解决办法
    leetcode 移动零 JAVA
    leetcode 有效的字母异位词 java
    leetcode 单词拆分 II java
    leetcode 分割回文串 java
    leetcode 验证回文串 java
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/7484908.html
Copyright © 2011-2022 走看看