java之IO流详解(一)
IO流的分类:
A:流向
输入流 读取数据
输出流 写出数据
B:数据类型
字节流
字节输入流 InputStream
字节输出流 OutputStream
字符流
字符输入流 Reader
字符输出流 Writer
这个流都是抽象类,是所有具体流的父类,我们使用IO流都是使用它们的实现类。
那么字节流和字符流有什么区别呢?一般来说,字符流是为了更好的处理中文字符而出现的,比字节流晚出现,在对中文字符进行操作时,建议使用字符流,但是使用字节流也可以,因为字节流是万能的。
那么怎么使用字节流呢?这里我们先讲字节流,字符流后面再讲。。以FileOutputStream和FileInputStream为例来讲
比如:
1、我要向一个文件中写入数据,就可以这样做:
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("demo.txt");// 传入的是一个文件对象或者文件名,默认是当前项目目录下,要是想放在其它地方,则以这样的格式就行,d:\\demo\\demo.txt,这样就相当于在d盘的demo目录下创建了demo.txt的文件.注意,输出流即OutputStream会自动创建这个文件,而输入流InputStream则不会.很简单,你要从一个文件中读数据是不是要有一个文件才能读啊?写数据时候如果没有这个文件就会自动帮你创建这个文件
String str = "hello 中国";
byte[] bytes = str.getBytes();//把字符串转化为字节数组
fos.write(bytes);//这里传入的是一个byte[]数组,必须把写入的数据转化为字节数组才能写。
fos.close();//关闭资源
}
在该项目下,我们可以看到生成了一个demo.txt文件,打开文件后显示:hello 中国
2、我要把一个文件中的数据读出来,就可以这样:
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("demo.txt");
int by = -1;
while((by = fis.read())!=-1){//fis.read()表示一个字节一个字节的读数据,该返回值是int类型的值,是读取到数据的ascii表中对应的值,比如a对应ASCII表中的值是97,那么它返回的就是97,返回-1就说明读完了,如果文件中有换行,那它也会读,读的字符为\n。
System.out.print(by+" ");//输出的为Ascll对应的值104 101 108 108 111 32 214 208 185 250,要输出字符,可以把它转化为字符,即(char)by;
}
fis.close();
}
3、在第一点基础上补充一下,第一点的
FileOutputStream fos = new FileOutputStream("demo.txt");方式写数据,是从文件的开始写的,相当于把之前的数据覆盖了,我要是想在一个文件中的结尾开始写数据呢?那怎么办?很简单,在FileOutputStream fos = new FileOutputStream("demo.txt",true)加一个参数true,或者在fos.write(bytes,true)第二个参数中加true,都是表示是以追加数据的形式写数据。
4、我要把一个文件中的数据复制到另外一个文件中呢,其实就是结合上面的做法:一个读一个写
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");//a文件的输入流对象
FileOutputStream fos = new FileOutputStream("b.txt");//b文件的输出流对象
int by = -1;
while ((by = fis.read()) != -1) {//读出一个字节,然后再写入一个字节的数据
fos.write(by);//一个字节一个字节的写
}
fos.close();
fis.close();
}
这样就ok啦,打开b文件会发现和a文件的内容一模一样,但是,这样一个字节一个字节的读和写是不是效率太低了呢?有没有更高效率的方法呢?肯定有的,那就是以一个字节数组的大小来读和写,一次读一个字节数组和写一个字节数组的数据。
5、以字节数组方式读取和写入数据:
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
byte[] bytes = new byte[1024]; //定义一个1024个字节大小的字节数组
int len = -1;
while ((len = fis.read(bytes)) != -1) {//fis.read(bytes)表示一次读1024个字节存储到字节数组中,该返回值是读取到字节的长度,这和读取单个字节的返回值并不一样,需要注意!!!
//fos.write(bytes);不要这样写,应该以下面这种方式写
fos.write(bytes,0,len);//该表示写入刚刚读取时存储到bytes字节数组中的数据,从0开始,到数组下标为len之间的数据写入,这个必须要加。因为如果不加,可能文件末尾读取的字节数据不到1024个数组大小,直接写入的话会写入上次后面没有被覆盖的值,导致数据不一致。
}
fos.close();
fis.close();
}
6、虽然上面的方式以字节数组来读写比较高效,但是还有一种以字节缓冲区来读写的,这种方式是最高效的。
字节缓冲区流:
A:BufferedOutputStream
B:BufferedInputStream
使用起来也非常简单,即:把字节流包装在字节缓冲流里面即可,用法一样,相当于把之前的流装饰了一下:
public static void main(String[] args) throws IOException {
//BufferedOutputStream实际上自己内部有一个缓冲的字节数组
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("杏花弦外雨.mp3"));//传入的是一个InputStream对象
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("杏花弦外雨2.mp3"));
byte[] bytes = new byte[1024];
int len = -1;
while((len=bis.read(bytes))!=-1){
bos.write(bytes, 0, len);
bos.flush();//刷新此缓冲的输出流,将缓冲区的数据写入文件
}
bos.close();
bis.close();
}
是不是很简单呢?


转载请注明出处————sunzxyong
java之IO流详解(一)的更多相关文章
- Java之IO流详解
IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中 ←→ 把数据写入硬盘(磁带) 内存中的数据不可持久保存的 输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...
- JAVA中IO流详解
IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...
- java之IO流详解(二)
好了,昨天讲了字节流,现在我们就来讲字符流吧... 字符流可以这样理解,字符流 = 字节流 + 编码表,目的是为了更好的操作中文字符(注:字符流只可以可以操作字符类型的文件,不能操作影音图像文件,要操 ...
- 基于JavaSE阶段的IO流详解
1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...
- Java io流详解四
转载地址:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html 写在前面:本文章基本覆盖了java IO的全部内容,jav ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java io流详解二
原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...
- Java io流详解一
原文地址http://www.cnblogs.com/xdp-gacl/p/3634409.html java基础学习总结——流 一.JAVA流式输入/输出原理
- 《Java基础知识》Java IO流详解
Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和 ...
随机推荐
- Joomla!3.7.0 Core SQL注入漏洞动态调试草稿
参考joolma的mvc框架讲解:http://www.360doc.com/content/11/1219/18/1372409_173441270.shtml 从这个页面开始下断点:Joomla_ ...
- PHPCMS v9.6.0 任意文件上传漏洞分析
引用源:http://paper.seebug.org/273/ 配置了php debug的环境,并且根据这篇文章把流程走了一遍,对phpstorm的debug熟练度+1(跟pycharm一样) 用户 ...
- javascript的基础(2)--数据类型介绍
1. number数据类型 所有的数字都是Number数据类型 利用typeof运算符可以返回当前数据的数据类型 特殊值:NaN not a number 不是一个数字 注意 :小数的计算可能产生丢失 ...
- 【LSGDOJ 1850】滑雪课程
题目描述 贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 D i 分钟,要 ...
- [Codeforces]906D Power Tower
虽说是一道裸题,但还是让小C学到了一点姿势的. Description 给定一个长度为n的数组w,模数m和询问次数q,每次询问给定l,r,求: 对m取模的值. Input 第一行两个整数n,m,表示数 ...
- bzoj2811[Apio2012]Guard 贪心
2811: [Apio2012]Guard Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 905 Solved: 387[Submit][Statu ...
- 基于 HTML5 的 WebGL 3D 智能楼宇监控系统
前言 智能监控的领域已经涉及到了各大领域,工控.电信.电力.轨道交通.航天航空等等,为了减少人员的消耗,监控系统必不可少.之前我写过一篇 2D 的智能地铁监控系统广受好评,突然觉得,既然 2D 的这么 ...
- [ 学习笔记 ] Hibernate框架学习之一
一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...
- Redis开启远程登录连接
Redis 安装详见 http://www.cnblogs.com/zendwang/p/6560628.html 当前安装测试版本:Redis 3.2.8 默认安装完毕Redis只能本机访问 [ro ...
- React-报错Warning:setState(...)on anunmounted component
一.原因 这种错误一般出现在react组件已经从DOM中移除.我们在react组件中发送一些异步请求的时候,就可能会出现这样的问题.举个例子,我们在componentWillMount中 ...