前言:

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. js之检测浏览器

    getBrowser () { let ua = navigator.userAgent.toLocaleLowerCase() let browserType = null if (ua.match ...

  2. SaltStack 水平权限绕过漏洞(CVE-2020-11651)

    影响版本 SaltStack < 2019.2.4 SaltStack < 3000.2 poc git clone https://github.com/jasperla/CVE-202 ...

  3. AppWeb认证绕过漏洞(CVE-2018-8715)

    影响范围 Appweb 7.0.2及早期版本. 复现 构造头Authorization: Digest username=admin 返回包里包含session 发送POST请求,添加session到 ...

  4. 并发编程——认识java里的线程

    本文系作者 chaoCode原创,转载请私信并在文章开头附带作者和原文地址链接. 违者,作者保留追究权利. 前言 并发编程在我们日常开发中是时时刻刻都有在用的,只不过大部分的代码底层已经帮我们去做了一 ...

  5. 安卓安装https证书

    前置条件 1 手机要设置密码 然后安装charles 证书 2 赋予 adb shell root权限(安装magisk就行) adb shell # 连接手机进入shell模式 su root # ...

  6. RHCE_DAY03

    shell函数 在shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即可称为函数(给一堆命令取一个别名) 函数可以使脚本中的代码更加简洁,增强易读性,提高脚本的执行效率 #函数定义格式1 ...

  7. Android NDK/JIN 从入门到精通

    1.1 JNI(Java Native Interface) 提供一种Java字节码调用C/C++的解决方案,JNI描述的是一种技术 1.2 NDK(Native Development Kit) A ...

  8. CentOS文件目录类语法

    目录 一.目录查看切换类 1. pwd 显示当前工作目录的绝对路径 2. ls 列出目录的内容 二.文件与目录创建删除类 1. mkdir 创建一个新目录 2. touch 创建空文件 3. rmdi ...

  9. const变量通过指针修改问题

    const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1. 不能修改的情况 #include int const a = 10; void ma ...

  10. 【笔记】偏差方差权衡 Bias Variance Trade off

    偏差方差权衡 Bias Variance Trade off 什么叫偏差,什么叫方差 根据下图来说 偏差可以看作为左下角的图片,意思就是目标为红点,但是没有一个命中,所有的点都偏离了 方差可以看作为右 ...