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. 流按照操作数据分:字节流(通用)和 ...
随机推荐
- [SCOI 2016]背单词
Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...
- 计蒜客NOIP模拟赛(2) D2T2紫色百合
[问题描述] “牵着你的手的是她,路边开满了紫色的百合花……” 你从梦中醒来,却依然忘不了梦中的她百合花,每朵百合花都有一个权值,在二进制下写成一行‘1’,第i朵紫色百合的权值在二进制下写成i个‘1’ ...
- 【网络流】【BZOJ1001】狼抓兔子
继续网络流的学习.... 题意简析:就是给你张图,叫你求最小割. 解题思路:最小割=最大流,按题意见图跑一次就好了. 附代码: #include<cstdio> #include<i ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 勤拂拭软件系列教程 之 Android开发之旅
勤拂拭软件工作室持续推出Android开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢Android的朋友们学习进步: 1. 勤拂拭软件Android开发之旅(1) 之 Android 开发环 ...
- 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
在SQL数据库中使用SQL语句(格式:alter table [tablename] alter column [colname] [newDataType])修改某表的字段类型时,报一下错误:由于一 ...
- C++ 中私有继承、保护继承与公有继承
区别 下面通过一个示例来介绍三种继承的区别. 定义一个基类(假设为一个快退休的富豪): class RichMan { public: RichMan(); ~RichMan(); int m_com ...
- C语言程序设计第一次实验
一. 1.输入圆的半径,计算圆的面积周长问题 2流程图 3测试数据及运算结果 4实验分析 不会输入r,后来问了同学得到解决. 二. 1.输入一个四位年份,判断其是否是闰年.闰年的判别条件是概念年份能被 ...
- Gethub readme 撰写
大标题=== 小标题----- #一级标题 ##二级标题 ###三级标题 ####四级标题 #####五级标题 ######六级标题 插入圆点* 昵称:果冻虾仁 * 别名:隔壁老王 * 英文名:Jel ...