流按操作类型分为两种,字节流,字符流,按流向分为输入流,输出流,输入流的抽象父类InputStream,输出流抽象父类OutputStream,字符流的抽象父类是Reader和Writer

一般用字节流copy文件可以用小数组的方式分批拷进去,实例代码如下:

FileInputStream fis = new FileInputStream("111.png");
FileOutputStream fos = new FileOutputStream("222.png");
byte[] a = new byte[ * ];
int length;
// 返回值length是读出的字节个数, fis.read(a)是读取最多a.length大小的字节数据,存入a里面
while ((length = fis.read(a)) != -) {
// 把数据从a中写出,数组偏移量为0,即从a[0]开始,写出length字节大小的数据
fos.write(a, , length);
}
fis.close();
fos.close();

还有一种方式,用输入输出缓冲区包装类,缓冲区类一次从文件中取出8192个字节,存储在缓冲区数组里,然后一个一个存入输出缓冲区类的缓冲区数组里,满了之后一次性存到硬盘文件中大大减少IO时间:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("部署.png"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("222.png"));
int a;
while ((a = bis.read()) != -) {
bos.write(a);
}
bis.close();
bos.close();

flush()方法可以刷新缓冲区,把缓冲区的数据写入文件中.而close()方法在关闭输出之前,也会把缓冲区的数据写入文件中,因为缓冲区的数据是存满8192字节才写入文件中,如果最后还剩下不到8192字节的数据在缓冲区中,不刷新缓冲区的话,里面的数据是不会写入文件中去的,会造成数据丢失,所以输出流一定要关闭.

如果不想自己调用close()方法的话,可以把可关闭的流的声明和赋值放到try()代码里面(小括号里面叫ARM块):

try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("部署.png"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("222.png"))) {
int a;
while ((a = bis.read()) != -) {
bos.write(a);
}
}

---------------------------------------------------------------------------------------------
字符流,读的时候把字节转换为字符,写的时候把字符转换为字节写入,可以通过项目默认的编码一次读取一个字符(如果是中文,就一次读取两个字节)

字符流 基础父类Reader-InputStreamReader-FileReader,一般用FileReader,Writer类也一样.

字符流Reader和Writer类默认都带2k的缓冲区,BufferedReader和BufferedWriter是带缓冲区(16k)的字符流类,直接父类Reader和Writer,BufferedReader的readLine()方法可以读一行(没有数据返回null),BufferedWriter的newLine()方法可以写出一个换行符(根据系统写出不同的换行符).

LineNumberReader是BufferedReader的子类,多了可以记住当前行号和设置当前行号的功能.

InputStreamReader可以指定用什么码表读取字符流,创建对象需要包装一个InputStream对象,OutputStreamWriter也一样,一般搭配BufferedReader或者BufferedWriter来高效的读取与写入,如:
new BufferedReader(new InputStreamReader(new FileInputStream("xxx.txt"),"utf-8"))

new String("bytes", "UTF-8")是按UTF-8码表把字节解码成字符,如果解码时有字节找不到对应码表中的字符,那么会以?代替. (解码:字节数据 --> 字符串)

getBytes("UTF-8")的意思是将(字符)数据按照UTF-8码表来编码成字节数组(此时字节数组的编码格式为UTF-8,如果没有指定那么会采用系统默认编码格式). (编码:字符串 --> 字节数据)

关于解码和编码: https://blog.csdn.net/mdreamlove/article/details/78468864

平时推荐使用 InputStreamReader 和 OutputStreamWriter 因为这两个可以显示指定解码编码字符集.
----------------------------------------------------------------------------------------------
其他流:

SequenceInputStream : 序列化输入流,可以吧多个InputStream放到里面,依次接收流数据.它从一个有序的输入流集合开始,从第一个读取到文件的结尾,然后从第二个文件读取,依此类推,直到最后一个输入流达到文件的结尾。 构造可以传入一个Enumeration对象

ByteArrayOutputStream : 内存中会创建一个缓冲区.输出的数据会写入这个缓冲区.缓冲区自动增长,可以用toByteArray和toString获取里面的数据.这个流不会造成IO异常,而且close方法没有任何效果

RandomAccessFile: 读取和写入随机访问文件,有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 (适合用来多线程大文件拷贝或下载)

DataInputStream DataOutputStream: 数据输入输出流,可以直接写出或读入比如int long类型的数据.

ObjectInputStream : 对象输入流,.使用readObject可以读取一个被序列化存储的对象.

ObjectOutputStream : 对象输出流,可以把一个实现了Serializable接口的对象序列化存储到文件中或者是进行传输.使用
writeObject方法.

提示:如果有个对象需要序列化存储,那么最好加上一个版本id: private static final long serialVersionUID = 1L;
如果这个类修改过了,那么反序列化的时候会报异常,可以根据异常的版本号来判断是哪次修改出了问题.

PrintStream : 打印字节流,可以将对象的toString方法的结果输出,System.out返回的就是一个PrintStream
print类的方法会先用toString转换为字符串并打印,而write方法会直接根据码表查找字符打印.

PrintWriter : 打印字符流,具体使用方法与一般输出字符流差不多.

标准输入输出流: System.in System.out 默认标准输入流是键盘,标准输出流为控制台. 可以用System.setIn setOut的方法改变标准流

Properties 类是Hashtable的子类,可以用load方法读取一个配置文件,如新建一个a.properties文件里面写入name=xxx,那么可以用
properties.load(new FileInputStream("a.properties")); 读取文件,然后用properties.getProperty("name", "yyy") 获取值.第二个参数是默认值,如果没有这个属性那么就会使用默认值.同样也可以用properties.setProperty("name2", "22222222");添加新属性,用
properties.store(new FileOutputStream("a.properties"), "描述");保存配置文件

Java : java基础(3) IO流的更多相关文章

  1. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  2. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  3. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  4. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...

  5. Hadoop基础-通过IO流操作HDFS

    Hadoop基础-通过IO流操作HDFS 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上传文件 /* @author :yinzhengjie Blog:http://www ...

  6. 【java基础】]IO流

    IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...

  7. java基础之 IO流

    javaIO流   IO流 : (input  output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方.   IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...

  8. java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理

    一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...

  9. java基础之io流总结一:io流概述

    IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...

  10. 乐字节Java之file、IO流基础知识和操作步骤

    嗨喽,小乐又来了,今天要给大家送上的技术文章是Java重点知识-IO流. 先来看看IO流的思维导图吧. 一. File 在Java中,Everything is Object!所以在文件中,也不例外! ...

随机推荐

  1. Ubuntu 安装第一步,打开ssh

    http://blog.csdn.net/u010447234/article/details/53557795 1.检查是否有ssh在运行 ps -e | grep ssh* 2.安装openssh ...

  2. 安装adobe,路径My Pictures或卷无效。请重新输入。

    问题:安装adobe reader时,路径My Pictures或卷无效.请重新输入.我的光驱是D盘.因为是在虚拟机下安装的xp系统. 解决办法: GHOST WINXP2 My Pictures一般 ...

  3. 一個新的面試題目,leetcode上面可以找到shortest palindrome

    記錄一下新的面試題目,其實題目是舊的,只是我才見到.以前研究過,只不過以前的解法不容易理解,現在有了新的遞歸解法.記錄一下. public String shortestPalindrome(Stri ...

  4. IFrame安全问题解决办法(跨框架脚本(XFS)漏洞)

    最近项目要交付了,对方安全测试的时候检测出高危险漏洞,由于刚参加工作不久,经验不足,未涉及过此方面的东西.经过一番查询和探索,最终解决了这个问题,记录一下. 发现的漏洞为缺少跨框架脚本保护.跨框架脚本 ...

  5. MySQL代码备份

    package com.dus.utils; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io. ...

  6. javascript正则表达式 - 学习笔记

    JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...

  7. AWS的登录认证。。。

    Hello, I’m sorry for any concern regarding the $1.00 Authorization that you see associated with your ...

  8. mysql分析慢查询日志工具mysqlsla安装

    1    配置perlperl -MCPAN -e shell cpan[1]>install Time:HiRescpan[1]>install File::Tempcpan[1]> ...

  9. June 13th 2017 Week 24th Tuesday

    There are no regrets in life, just lessons. 人生中没有后悔,只有教训. Some people can learn from their past mist ...

  10. table中设置tr行间距

    CSS border-collapse 属性设置表格的边框是否被合并为一个单一的边框 值 描述 separate 默认值.边框会被分开.不会忽略 border-spacing 和 empty-cell ...