博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java IO流
阅读量:6323 次
发布时间:2019-06-22

本文共 4782 字,大约阅读时间需要 15 分钟。

 

参考链接:

java IO流

(一)含义

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

(二)分类

(三)用法

  3.1 字节文件操作流

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

  读取文件的两种方式

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

// 读取f盘下该文件f://hell/test.txt//构造方法1InputStream 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//构造方法2InputStream 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("\r\n".getBytes());// 输出追加内容outputStream2.write("hello".getBytes());// 关闭IO流outputStream2.close(); 

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

  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("\r\n".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);// 281inputStream.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);// 78bis.close();bos.close(); 

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

  实战,请移步文章:

  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);

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

  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);}

 

 相关推荐:

 

 

转载地址:http://jcvaa.baihongyu.com/

你可能感兴趣的文章
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>
Android 类库书签更新(一)
查看>>
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>
ionic/cordova热部署
查看>>
「镁客早报」特斯拉裁员,马斯克解释没有办法;微软推出Azure DevOps赏金计划...
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩...
查看>>
前端脚本!网站图片素材中文转英文
查看>>
linux的常用易忘命令
查看>>
PHP 分割字符串
查看>>
java 基于QRCode、zxing 的二维码生成与解析
查看>>
img垂直水平居中与div
查看>>
防恶意注册的思考
查看>>
订餐系统之同步美团商家订单
查看>>