黑马程序员——Java基础---IO流
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了黑马程序员——Java基础---IO流,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4277字,纯文字阅读大概需要7分钟。
内容图文
![黑马程序员——Java基础---IO流](/upload/InfoBanner/zyjiaocheng/1104/523c56f934134dc0915de4f32444c46d.jpg)
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
IO流
一 .IO 流
1.概念
1) IO流用来处理设备之间的数据传输
2)Java对数据的操作是通过流的方式
3)Java用于操作流的类都在IO包中
4)流按流向分为两种:输入流,输出流。
5) 流按操作类型分为两种:
字节流 : 字节流可以操作任何数据 , 因为在计算机中任何数据都是以字节的形式存储的
字符流 : 字符流只能操作纯字符数据,比较方便。
2.IO流常用父类
字节流的抽象父类:
InputStream
OutputStream
字符流的抽象父类:
Reader
Writer
3.IO程序书写
使用前,导入IO包中的类
使用时,进行 IO 异常处理
使用后,释放资源
二 . 字节流
1.常用方法
InputStream:
read() 读取一个字节
read(byte[]) 读取若干(数组长度)字节
available() 获取可读的字节数
close() 关闭流, 释放资源
OutputStream:
write(int) 写出一个字节
write(byte[]) 写出数组中的所有字节
write(byte[],start,len);
close() 关闭流, 释放资源
2.读取文件
创建FileInputStream对象, 指定一个文件. 文件必须存在, 不存在则会抛出FileNotFoundException
使用 read() 方法可以从文件中读取一个字节 . 如果读取到文件末尾会读到 -1
读取结束后需要释放资源 , 调用 close() 方法关闭输入流
输入流代码:
1 FileInputStream fis = new FileInputStream("xxx.txt"); //创建流对象,关联xxx.txt文件 2 3 4int b; 5 6 7while((b = fis.read()) != -1) { //将每次读到的结果赋值给b 8 910System.out.println(b); 111213} 1415 fis.close();
为什么 read 方法返回是 int 而不是 byte 类型呢 ?
因为如果读取的是视频文件或音频文件或图片文件等,在读取过程中很有可能会遇到11111111,也就是byte类型的-1,那么遇到-1程序就会停止读取,会漏掉文件,
为了防止这种情况出现 , 把 byte 类型提升为 int 类型 , 在这个字节前补上 24 个 0, 把遇到的 -1 变成 255, 这样可以保证将整个文件读完
3.写出文件
创建FileOutputStream对象, 指定一个文件. 文件不存在会创建新文件, 存在则清空原内容. 如果需要追加, 在构造函数中传入true.
使用write()方法可以向文件写出一个字节.
写出结束后同样需要调用close()
输出流代码:
1 FileOutputStream fos = new FileOutputStream("aaa.txt"); //创建流对象,关联aaa.txt 2 3 4 fos.write(100); //写出数据的时候会将前面24个0去掉,写出的是一个字节 5 6 7 fos.write(98); 8 910 fos.write(99); 111213 fos.close(); //关闭流,释放资源
4.拷贝文件
可以从文件中逐个字节读取, 逐个字节写出, 但这样做效率非常低
我们可以定义一个数组作为缓冲区, 一次读取多个字节装入数组, 然后再一次性把数组中的字节写出1byte = 8bit
1,逐个字节拷贝
1 FileInputStream fis = new FileInputStream("致青春.mp3"); //创建输入流对象,关联致青春.mp3 2 3 4 FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3 5 6 7 8 910int b; 111213while((b = fis.read()) != -1) { //将每次读到的赋值给b141516 fos.write(b); //将b中的字节写出去171819} 20212223 fis.close(); //关流,释放资源242526 fos.close();
2,自定义数组拷贝
1 FileInputStream fis = new FileInputStream("致青春.mp3"); //创建输入流对象,关联致青春.mp3 2 3 4 FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3 5 6 7byte[] arr = newbyte[1024 * 8]; //自定义数组 8 910int len; 111213while((len = fis.read(arr)) != -1) { //将数据读到字节数组中141516 fos.write(arr, 0, len); //从字节数组中将数据写到文件上 171819//fos.write(arr);202122} 232425 fis.close(); //关流,释放资源262728fos.close(); 29303132int len = read(arr);如果文件上有数据返回的就是读到有效的字节个数,如果文件上没有数据返回的就是-1
3,定义一个大数组拷贝,数组和文件的字节个数一样大
1 // fis.available();一次获取读的文件的大小 2 3 4 FileInputStream fis = new FileInputStream("致青春.mp3"); 5 6 7 FileOutputStream fos = new FileOutputStream("copy.mp3"); 8 910byte[] arr = newbyte[fis.available()]; //虽然可以拷贝,但是在开发时不建议,有可能会导致内存溢出111213fis.read(arr); 141516fos.write(arr); 171819 fis.close();
4,带缓冲区的拷贝
1 FileInputStream fis = new FileInputStream("致青春.mp3"); //创建输入流对象,关联致青春.mp3 2 3 4 BufferedInputStream bis = new BufferedInputStream(fis); //对fis进行包装,内置一个8192大小的字节数组 5 6 7 FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3 8 910 BufferedOutputStream bos = new BufferedOutputStream(fos); //对fos进行包装,内置一个8192大小的字节数组111213141516int b; 171819while((b = bis.read()) != -1) { //read一次会先将文件上的数据读到缓冲区中,再从缓冲区一个一个的赋值给b202122 bos.write(b); //write一次,是将b中的字节数据写到缓冲区,缓冲区写满再一次写到文件上232425} 262728293031 bis.close(); //只需要关掉包装后的即可323334 bos.close();
5.BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)
从BufferedInputStream中读取一个字节时
BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
程序再次读取时 , 就不用找文件了 , 直接从缓冲区中获取
直到缓冲区中所有的都被使用过 , 才重新从文件中读取 8192 个
6.BufferedOutputStream
BufferedOutputStream也内置了一个缓冲区(数组)
程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
直到缓冲区写满 , BufferedOutputStream 才会把缓冲区中的数据一次性写到文件里
7.读中文
字节流只读中文有弊端,可能会出现半个中文
解决办法
1,用字符流只读
2,将文件上的所有的字节数据都读到缓冲区中,然后在转换成字符串ByteArrayOutputStream
1 FileInputStream fis = new FileInputStream("bbb.txt"); 2 3 4byte[] arr = newbyte[4]; 5 6 7int len; 8 910while((len = fis.read(arr)) != -1) { 111213 System.out.println(new String(arr,0,len)); 141516} 171819202122 fis.close();
8.写中文
字节流是可以写字符串的
但是必须将字符串转换成字节数组写出去
1 FileOutputStream fos = new FileOutputStream("bbb.txt"); 234 fos.write("你要减肥,造吗".getBytes()); 567 fos.close();
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
原文:http://www.cnblogs.com/hmchengxuyuan/p/5005244.html
内容总结
以上是互联网集市为您收集整理的黑马程序员——Java基础---IO流全部内容,希望文章能够帮你解决黑马程序员——Java基础---IO流所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。