java学习之IO流(学习之旅,一)
个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态。
Java流类图结构

这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很多类并不是常用的。
缕清思路很重要的,那么我转一篇百度的文档,写的思路很清晰。
https://jingyan.baidu.com/article/ca00d56c6b4397e99febcf70.html
第一步,首先,明确IO流中有两个主要的体系,即字节输入流(InputStream)、输出流(OutputStream)和字符输入流(Reader)、输出流(Writer)。其次,明确数据的来源和数据将要到达的目的地。
为啥要有字节流和字符流呢?多麻烦?
自然是有原因的:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
字节流:一次读入或读出是8位二进制。 字符流:一次读入或读出是16位二进制。
第二步,明确将要操作的数据是否是纯文本数据。如果数据源是纯文本数据选Reader;数据源不是纯文本数据选择InputStream。如果数据目的地是纯文本数据就选择Writer;如果不是则选择OutputStream。

第三步,明确具体的设备。即数据源是从哪个设备来的:是硬盘就加File;是键盘用System.in(是一个InputStream对象);是内存用数组;是网络用Socket流。同样目的是哪个设备:是硬盘就加File;是键盘用System.out(是一个OutoutStream对象);是内存用数组;是网络用Socket流。

第四步,明确是否还需要其他额外功能呢,例如①是否需要较高的效率,即是否需要使用缓冲区,是就加上Buffered;②是否需要转换,是,就使用转换流,InputStreamReader 和OutputStreamWriter。

下面给出例子,具体的用法


上面百度文档已经介绍的很清楚了,不过我还想更加详细的了解一下输入流和输出流。在这里只介绍比较常用的方法,因为学习需要慢慢来·····
输入字节流 InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类。(做什么用的呢?是个抽象类,不是接口,后期再研究)
下面我要考虑了,其实文件的输出输入是比较容易混的。那么我们怎么区分呢?
这样,不管是输入还是输出,都是真对内存来说的,什么意思呢?
解释一下:如果我们要上传一个文件,有三个步骤。第一,读取本地文件,就是先把硬盘上面的文件读取到内存中,那么真对内存来说就是用输入流(inputStream);第二,再把内存中的文件输出(outStream),真对内存来说就是从内存输出到服务器的硬盘上。
ByteArrayInputStream 、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。
其他两种没用过, 只就是 FileInputStream ,文件的上传和下载用的都是这种流。
输出字节流 OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类。(和上面对应的==不懂,后期研究==)
这次写文件下载用的就是这个父类。下面给出代码
//创建输出流
OutputStream out = response.getOutputStream();
//创建数组
byte buffer[] = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len=in.read(buffer))>0){
//输出缓冲区的内容到浏览器,实现文件下载
out.write(buffer, 0, len);
}
用FileOutputStream 应该也是可以的吧,不过这就要指定具体的那个路径进行文件写出,也就是往硬盘写入。
在此,我有个疑问,byte buffer[] 是否是缓冲区?
答案;不是缓冲流,不确定缓冲区做什么用的,后期再研究。
缓冲流:有四个,当然是字节缓冲输入流BufferedInputStrean、字节缓冲输出流OutputStreamWriter、 和字符的 BufferedReader、 BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
缓冲流大小通常是根据文件大小来进行匹配的,如果不进行设置有个默认值
今天就到这吧
java学习之IO流(学习之旅,一)的更多相关文章
- Java中的io流学习(了解四大基类和基本步骤)
Java中io流四大基类及io流操作四大基本步骤 io流:(input/output)即输入输出流.面向对象的思想之一是面向接口编程,面向父类编程,也就是多态.所以学好基类(父类)很重要. 分类 按处 ...
- Java基础之IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 关于java读取文件IO流学习总结(一)
IO流的分类: 1.根据流的数据对象来分: 高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,Outpu ...
- 关于java读取文件IO流学习总结(二)
今天网上随意逛了逛,某处看到关于文件的操作,描述的不错,加深了对于文件操作的理解,在此分享给大家.希望能够有所收获. java读取txt文件内容: 可以作如下理解: 1. 首先获得一个文件句柄.Fil ...
- Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream
Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...
- Java IO流学习总结八:Commons IO 2.5-IOUtils
Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...
- Java IO流学习总结(1)
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本 ...
- Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
在上一篇文章中Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream介绍了缓冲流中的字节流,而这一篇着重介绍缓冲流中字符流Buffered ...
- Java IO流学习总结一:输入输出流
Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] J ...
随机推荐
- SOAP1.1 VS SOAP1.2
SOAP提升: 目前WebService的协议主要有SOAP1.1和1.2.两者的命名空间不同. 见下页对比 SOAP1.1版本与SOAP1.2版本在头信息上存在差异.SOAP1.1存在SOAPAct ...
- python 基础之字典一
字典特点:无序.键唯一 字典的创建 bag = {'cx':'chenxi','gghg':35} print(bag['cx']) 测试 chenxi Process finished with e ...
- 吴裕雄--天生自然PYTHON爬虫:使用Scrapy抓取股票行情
Scrapy框架它能够帮助提升爬虫的效率,从而更好地实现爬虫.Scrapy是一个为了抓取网页数据.提取结构性数据而编写的应用框架,该框架是封装的,包含request异步调度和处理.下载器(多线程的Do ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:将所有列表项放置同一行
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...
- gcd && exgcd算法
目录 欧几里德算法与扩展欧几里德算法 1.欧几里德算法 2.扩展欧几里德算法 欧几里德算法与扩展欧几里德算法 1.欧几里德算法 #include<bits/stdc++.h> using ...
- linux用户权限、系统信息相关命令(待学)
用户权限相关命令 目标 用户 和 权限 的基本概念 用户管理 终端命令 组管理 终端命令 修改权限 终端命令 01.用户和权限的基本概念 1.1 基本概念 用户 是Linux系统工作中重要的一环, 用 ...
- [经验] Java 使用 netty 框架, 向 Unity 客户端的 C# 实现通信 [1]
这是一个较为立体的思路吧 首先是技术选型: 前端 : HTML5 + jQuery ,简单暴力, 不解释 服务端 : Spring Boot + Netty + Redis/Cache 客户端 ...
- 使用HttpURLConnection通过post请求服务器时,URLEncode编码的必要性
通过Post提交表单数据时,数据类型为x-www-urlencoded,提交到服务器的数据服务器默认是通过URLEncoder.encode()编码过得,所以服务器处理时会用URLDecoder.de ...
- webpack中devtool的配置方案[开发模式]---[线上模式]
// 开发模式下 module.exports = { mode: 'development', devtool: 'cheap-module-eval-source-map' } // 线上模式下 ...
- SAVE 、BGSAVE和BGREWRITEAOF执行区别
rdbSave 会将数据库数据保存到 RDB 文件,并在保存完成之前阻塞调用者. save 命令直接调用 rdbSave ,阻塞 Redis 主进程:bgsave 用子进程调用 rdbSave ,主进 ...