java基础io流——OutputStream和InputStream的故事,一文全懂

读到没数据了就返回-1,这个用来判断是否读完。

//读一个字节数组,一般是1024大小

int len = 0 ;

byte[] bys = new byte[1024];

while ((len = inputStream.read(bys)) != -1) {

System.out.println(new String(bys,0,len));

}

两个read的返回值略有不同,read()返回读取的字节,读到末尾返回-1,read(byte[] b)返回的是读到的字节个数,读到的字节放在了bytes字节数组里,读到末尾没数据了返回-1。

两种读取方式图解:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yv0oyKLy-1603813798619)(http://p5kllyq5h.bkt.clouddn.com/174401.jpg)]

同样的用完了流,也要及时的关闭,以防占用内存。

inputStream.close();

完整示例:

建议以字节数组的方式读取数据。

package io2;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

/**

  • Create by stefan

  • Date on 2018-05-27 23:00

  • Convertion over Configuration!

*/

public class input2 {

public static void main(String args[]){

FileInputStream inputStream = null;

try {

inputStream = new FileInputStream(“a.txt”);

// byte[] bys = new byte[4];

// int len = inputStream.read(bys);

// System.out.println(new String(bys)); //bcd

// System.out.println(len); //3

// System.out.println(inputStream.read(bys)); //-1

int len = 0 ;

byte[] bys = new byte[1024];

while ((len = inputStream.read(bys)) != -1) {

System.out.println(new String(bys,0,len));

}

/**

  • public String(byte bytes[]) {

this(bytes, 0, bytes.length);

}

*/

} catch (IOException e) {

e.printStackTrace();

}finally {

try {

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

字节流复制文件

利用输入流读取一个文件里的字节,再利用输出流将读取到的字节写出到另一个文件中(不存在会自动创建)

package io2;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Arrays;

/**

  • Create by stefan

  • Date on 2018-05-27 23:19

  • Convertion over Configuration!

*/

public class copy {

public static void main(String args[]) throws IOException {

FileInputStream inputStream = new FileInputStream(“E:\huge1.jpg”);

FileOutputStream outputStream = new FileOutputStream(“E:\古月.jpg”);

byte[] bytes = new byte[1024];

int len = 0;

while ((len=inputStream.read(bytes)) != -1) {

outputStream.write(bytes,0,len);

}

inputStream.close();

outputStream.close();

}

}

注:复制文本、图片、mp3、视频等的方式一样。

字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果。

java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流。

字节缓冲输出流

BufferedOutputStream

字节缓冲输入流

BufferedInputStream

BufferedOutputStream

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“a.txt”,true));

bos.write(“hello world”.getBytes());

bos.close();

BufferedInputStream

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“a.txt”));

byte[] bytes = new byte[1024];

int len = 0;

while ((len=bis.read(bytes)) != -1) {

System.out.println(new String(bytes,0,len));

}

bis.close();

注:

  • 成员方法与字节流基本一样,字节缓冲流的作用就是提高输入输出的效率。

  • 构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小就足够了。

  • 为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。

复制文件的升级:

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“E:\modern-java.pdf”));

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“F:\汤包\慕课大巴\modern-java.pdf”));

int len = 0;

byte[] bytes =new byte[1024];

while ((len=bis.read(bytes)) != -1) {

bos.write(bytes,0,len);

}

bis.close();

bos.close();

测试:四种复制文件的效率高低

package io2;

import java.io.*;

/**

  • 测试复制的时间

  • Create by stefan

  • Date on 2018-05-28 10:28

  • Convertion over Configuration!

*/

public class copy2 {

//一个字节一个字节的复制,耗时22697毫秒

public static void fun() throws IOException {

FileInputStream fis = new FileInputStream(“F:\汤包\慕课大巴\modern-java.pdf”);

FileOutputStream fos = new FileOutputStream(“E:\modern-java.pdf”);

int by = 0;

while ((by=fis.read()) != -1) {

fos.write(by);

}

fis.close();

fos.close();

}

//1024字节数组复制 耗时63毫秒

public static void fun1() throws IOException {

FileInputStream fis = new FileInputStream(“F:\汤包\慕课大巴\modern-java.pdf”);

FileOutputStream fos = new FileOutputStream(“E:\modern-java.pdf”);

int len = 0;

byte[] bytes =new byte[1024];

while ((len=fis.read(bytes)) != -1) {

fos.write(bytes,0,len);

}

fis.close();

fos.close();

}

// 一个字节一个字节复制,但是用了缓冲流 耗时64毫秒

public static void fun2() throws IOException {

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“E:\modern-java.pdf”));

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“F:\汤包\慕课大巴\modern-java.pdf”));

int by = 0;

while ((by=bis.read()) != -1) {

bos.write(by);

}

bis.close();

bos.close();

}

// 1024字节数组复制并用了缓冲流 耗时7毫秒

public static void fun3() throws IOException {

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“E:\modern-java.pdf”));

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“F:\汤包\慕课大巴\modern-java.pdf”));

int len = 0;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

最后

ActiveMQ消息中间件面试专题

  • 什么是ActiveMQ?
  • ActiveMQ服务器宕机怎么办?
  • 丢消息怎么办?
  • 持久化消息非常慢怎么办?
  • 消息的不均匀消费怎么办?
  • 死信队列怎么办?
  • ActiveMQ中的消息重发时间间隔和重发次数吗?

ActiveMQ消息中间件面试专题解析拓展:

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


redis面试专题及答案

  • 支持一致性哈希的客户端有哪些?
  • Redis与其他key-value存储有什么不同?
  • Redis的内存占用情况怎么样?
  • 都有哪些办法可以降低Redis的内存使用情况呢?
  • 查看Redis使用情况及状态信息用什么命令?
  • Redis的内存用完了会发生什么?
  • Redis是单线程的,如何提高多核CPU的利用率?

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


Spring面试专题及答案

  • 谈谈你对 Spring 的理解
  • Spring 有哪些优点?
  • Spring 中的设计模式
  • 怎样开启注解装配以及常用注解
  • 简单介绍下 Spring bean 的生命周期

Spring面试答案解析拓展

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


高并发多线程面试专题

  • 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
  • Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
  • Java 中 wait 和 sleep 方法有什么区别?
  • 如何在 Java 中实现一个阻塞队列?
  • 如何在 Java 中编写代码解决生产者消费者问题?
  • 写一段死锁代码。你在 Java 中如何解决死锁?

高并发多线程面试解析与拓展

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


jvm面试专题与解析

  • JVM 由哪些部分组成?
  • JVM 内存划分?
  • Java 的内存模型?
  • 引用的分类?
  • GC什么时候开始?

JVM面试专题解析与拓展!

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM

57654614)]


高并发多线程面试专题

  • 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
  • Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
  • Java 中 wait 和 sleep 方法有什么区别?
  • 如何在 Java 中实现一个阻塞队列?
  • 如何在 Java 中编写代码解决生产者消费者问题?
  • 写一段死锁代码。你在 Java 中如何解决死锁?

高并发多线程面试解析与拓展

[外链图片转存中…(img-GAQH6Vz4-1711557654615)]


jvm面试专题与解析

  • JVM 由哪些部分组成?
  • JVM 内存划分?
  • Java 的内存模型?
  • 引用的分类?
  • GC什么时候开始?

JVM面试专题解析与拓展!

[外链图片转存中…(img-ALaNFAcI-1711557654615)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值