前言:

java中IO里的一些知识对于一个java新手来说,是比较难理解的。因为里面存在一些很绕的概念,比如:

1.到底是读入写出,还是读出写入;

2.我要将一个文件的内容拷贝到另一个文件是先用InputStream还是OutputStream;

3.什么时候用FileInputStream,什么时候用ByteArrayInputStream,什么时候又用StreamBufferInputStream;

要印象深刻的解决这些问题,还是那句话,得从理解出发。

正题:

对于IO的基础知识模型,分类,及各个类的特性相信有很多的帖子说的很详细了,本文就不再赘述了。

首先我们阐述一个聊天的概念,举个例子,假如你现在在跟小明聊天,小明在给你倾述他失恋了有多么多么难受,是不是他心里有一堆话然后通过嘴巴表达出来。然后你在认真的聆听并且感受他的难受,是不是通过耳朵接收然后放到心里去感受。

好了,我们把这个场景放到程序里面如下图:

(请先放弃你们的审美,这样你才能认出耳朵和嘴巴)

这里有四个节点,每个节点都有自己的职责,首先如果小明的嘴巴要表达他心里的难受需要去读取心里的内容,我们知道读取我们都用read()方法。InputStream才有read()方法,所以这时我们肯定是用InputStream。当你的耳朵接收到小明表达的内容后,需要写到你的心里去,这是我们要用到write()方法,可想而知是用OutputStream。

到这里我们回到上面的问题,其实是一个读出写入的过程,然后我们把两个心看成两个file,那么要把小明的内容copy到你的心里就分以下步骤:

1.创建小明心的FileInputStream,然后调用它的read()方法,把读到的内容放到Byte[]中。

2.创建你心的FileOutputStream,然后调用write()方法,把上一步Byte[]中的内容写到你心里去。

以下测试场景可以对照测试:

创建两个文件xiaoming's-heart.txt和your-heart.txt并且在xiaoming's-heart.txt中输入内容

然后执行以下码

public static void main(String[] args){
File xiaomingFile = new File("E:/testFile/xiaoming's-heart.txt");
File yourFile = new File("E:/testFile/your-heart.txt");
try {
InputStream is = new FileInputStream(xiaomingFile);
OutputStream os = new FileOutputStream(yourFile);
byte[] buffer = new byte[4096];
int readLen = 0;
while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
System.out.print((char)readLen);
os.write(buffer, 0, readLen);
os.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

结果

我们可以看到,xiaoming's-heart.txt文件中的内容已经copy到your-heart.txt,这是一个很简单的例子,知识方便大家理解上面的理论场景

至于什么时候该用什么流其实只需要根据不同源和目的地选择即可。

总结:

本文只是帮助一些深陷其中的朋友简单理解一下java的io操作,希望简单的场景能让大家有一个清晰的理解。涉及的内容很少。其他io相关知识可以通过其他网络资料获取。

java IO操作,看完你应该就清晰了。的更多相关文章

  1. Java基础?看完以后再也不惧怕面试了

    前言 这篇文章主要是Java基础部分,主要分为3个部分:Java集合.Java多线.JVM:这些东西帮助我面试成功率提升了很多.后面还有中间件Spring.Redis.RocketMQ等等吧,祝愿大家 ...

  2. JAVA—IO操作

    一.JAVA I/O 输入输出流 1:编码问题 2:File类的使用 3:RandomAccessFile的使用 4:字节流的使用 5:字符流的使用 6:对象的序列化和反序列化 2: file类的使用 ...

  3. java IO操作:FileInputStream,FileOutputStream,FileReader,FileWriter实例

    FileInputStream <span style="font-family:Verdana;">import java.io.File; import java. ...

  4. Java IO操作——数据操作流DataOutputStream和DataInputStream的使用

    学习目标  掌握DataOutputStream和DataInputStream的作用 可以使用DataOutputStream和DataInputStream写入和读入数据 数据操作流 在io包中, ...

  5. Java IO操作:合并流

    合并流:把两个文件合并在一起. 主要操作的是内容. 定义: public class SequenceInputStreamextends InputStream 方法摘要: 操作步骤: 1,分别建立 ...

  6. JAVA IO操作:数据操作流:DataOutputStream和DataInputStream

    掌握DataOutputStream和DataInputStream的作用. 可以使用DataOutputStream和DataInputStream写入和读取数据. 在IO包中提供了两个与平台无关的 ...

  7. java IO操作和计算操作:工作内存和主内存 volatile关键字作用;原子操作对象AtomicInteger ....

    应该停止但无法停止的计算线程 如下线程示例,线程实例中while循环中的条件,在主线程中通过调用实例方法更新后,while循环并没有更新判断变量是否还成立.而是陷入了while(true)死循环. i ...

  8. Java IO操作

    转自:http://www.cnblogs.com/jyan/articles/2505791.html Johnny Yan的博客 1 InputStream类型 InputStream的作用是标志 ...

  9. 每天进步一点点-Java IO操作-Java Serializable(对象序列化)的理解和总结

    往硬盘文件里写数据 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.在另一端,反序列化将从该流重 ...

随机推荐

  1. jvm源码解读--06 Method 方法解析

    进入 // Methods bool has_final_method = false; AccessFlags promoted_flags; promoted_flags.set_flags(0) ...

  2. 【JavaWeb】EL表达式&过滤器&监听器

    EL表达式和JSTL EL表达式 EL表达式概述 基本概念 EL表达式,全称是Expression Language.意为表达式语言.它是Servlet规范中的一部分,是JSP2.0规范加入的内容.其 ...

  3. 【SpringCloud微服务实战】搭建企业级应用开发框架(一):架构说明

    SpringCloud分布式应用微服务系统架构图: SpringCloud分布式应用微服务系统组件列表: 微服务框架组件:Spring Boot2 + SpringCloud Hoxton.SR8 + ...

  4. k8s入门你至少需要会哪些

    body { margin: 0; overflow: auto; font: normal 14px Verdana; background: rgba(255, 255, 255, 1); pad ...

  5. SQL语句(三)分组函数和分组查询

    目录 一.分组函数 特点 1. 各函数的简单使用 2. 搭配distinct的使用 3. COUNT 统计行数 4. 和分组函数一同查询的字段要求是group by后的字段 二.分组查询 1. 简单应 ...

  6. squid异常停止的排查步骤

    今天重启squid的时候发现,squid启动后,status 一会就stop了 whoami@blackman:~/script/AutoProxy-master/main/server$ sudo ...

  7. [C++]-set 集合

    set集合用于存放一组无重复的元素.由于集合本身是有序的,所以可以高效地查找指定元素,也可以方便地得到指定大小范围地元素在容器中所处区间. 代码 #include<iostream> #i ...

  8. React Native 启动流程简析

    导读:本文以 react-native-cli 创建的示例工程(安卓部分)为例,分析 React Native 的启动流程. 工程创建步骤可以参考官网.本文所分析 React Native 版本为 v ...

  9. docker 部署mysql连接问题

    发现windows上有一个docker descktop(虽然不怎么好用), 安装之后准备直接用docker搭本地测试环境的基础设施(比如MySQL,Redis,MongoDB,ES啥的), 虽然比去 ...

  10. noip25

    T1 经过一波大力推式子,发现答案是 \(\frac{n^{2}-1}{9}\) . 式子回头再补,可能会 Code #include<cstdio> #define re registe ...