黑马程序员——Java学习I/O流之字节流
来源:互联网 发布:常用基因组数据库 编辑:程序博客网 时间:2024/06/05 19:03
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
今天来扒扒关于IO流一章中字符流、字节流与转换流的关系
话不多说,首先上图,让你一眼对这个三角关系有个简单认知:
IO流:Input,Output,
流:类似于水流,线性的,有方向的;
分类:
字节流:
输出流:
输入流:
字符流:
输出流:
输入流:
什么情况下使用哪种流:
1.字节流:读写二进制文件:图片、视频文件等;也可以读写文本文件;
2.字符流:读写文本文件的;
Java中IO流的体系结构:
字节流:
输出流:OutputStream(抽象)
输入流:InputStream(抽象)
字符流:
输出流:Writer:(抽象)
输入流:Reader:(抽象)
简单的需求:向文件写入一个字符串:hello
分析:
1.向文件写入–>输出流–>OutputStream
2.向”文件”写,OutputStream是抽象类,不能用。使用它的子类:FileOutputStream
3.了解一下FileOutputStream
构造方法:
1.public FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。
2.public FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
public class Demo { public static void main(String[] args) { try { //如果文件不存在,就自动创建一个空文件; //使用的绝对路径 // FileOutputStream out = new FileOutputStream("D:\\FileTest.txt"); //使用相对路径;在项目根目录下 // FileOutputStream out2 = new FileOutputStream("FileTest.txt"); //使用File File file = new File("D:\\FileTest.txt"); FileOutputStream out3 = new FileOutputStream(file); File file2 = new File("FileTest2.txt"); FileOutputStream out4 = new FileOutputStream(file2); } catch (FileNotFoundException e) { e.printStackTrace(); } }}
复制文件操作可同时涉及到字节输入输出流的问题
(1).一次读入一个字节的复制文件操作
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;
思路:
1.复制:读取一个文件的内容,然后向另一个文件写入;
2.读取:FileInputStream — a.txt
一次读一个字节
写入:FileOutputStream — b.txt
一次写入一个字节
public class Demo { public static void main(String[] args) { try { //输入流:文件必须存在; FileInputStream in = new FileInputStream("a.txt"); //准备一个输出流:文件可以不存在 FileOutputStream out = new FileOutputStream("b.txt"); //开始复制: //输入流:一次读取一个字节 //输出流:一次写入一个字节 int n = 0; while((n = in.read())!= -1){ out.write(n); } //是否资源 in.close(); out.close(); System.out.println("复制完毕!"); } catch (IOException e) { e.printStackTrace(); } }}
(2).一次读入一个字节数组的复制文件操作
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;
/*
* 复制视频文件:一次读取、写入一个字节数组
*
* 速度明显快于一次读取一个字节;
*/
public class Demo { public static void main(String[] args) { try { FileInputStream in = new FileInputStream("Big Fish.mp4"); //输出流 FileOutputStream out = new FileOutputStream("Big Fish_copy.mp4"); //开始复制:一次读取写入一个字节数组 byte[] byteArray = new byte[2048]; int len = 0; while((len = in.read(byteArray))!= -1){ //写入 out.write(byteArray, 0, len); } //释放资源 in.close(); out.close(); System.out.println("复制完毕!"); }catch (IOException e) { e.printStackTrace(); } }}
通过一次读取一个字节数组,大家体验到了字节数组对于读取效率的影响。
这里的字节数组就相当于一个”缓存区”
在Java类库中,为我们提供了字节读写的带缓存区的类:
输入流:BufferedInputStream
输出流:BufferedOutputStream:
(1)..缓冲区输入流:BufferedInputStream
import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;
/*
* 构造方法:
* public BufferedInputStream(InputStream in):
*
* 对于BufferedInputStream和BufferedOutputStream的使用
* 同FileInputStream和FileOutputStream的使用是一样的。没有新增其它的方法;
* 但是:效率要高很多;
* 所以,对于字节的输入、输出流,推荐使用:BufferedInputStream和BufferedOutputStream
*/
public class Demo { public static void main(String[] args) { try { BufferedInputStream in = new BufferedInputStream( new FileInputStream("buf.txt")); byte[] byteArray = new byte[1024]; int len = 0; while((len = in.read(byteArray)) != -1){ System.out.println(new String(byteArray,0,len)); } in.close(); } catch (IOException e) { e.printStackTrace(); } }}
(2).缓冲区输出流:BufferedOutputStream:
import java.io.BufferedOutputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;
/*
* 构造方法:
* 1.public BufferedOutputStream(OutputStream out):使用一个OutputStream来构造;
* 实际上还是由FileOutputStream提供输出流,BufferedOutputStream提供了缓冲区;
*/
public class Demo { public static void main(String[] args) { //1.构造一个对象 try { /*FileOutputStream fileOut = new FileOutputStream("buf.txt"); BufferedOutputStream out = new BufferedOutputStream(fileOut);*/ BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream("buf.txt")); out.write("hello".getBytes()); //带缓冲区的输出流,write()之后,一定要flush()或close(),才能将缓冲区的内如写入文件; // out.flush(); out.close(); //先执行自己的flush()方法,再执行OutputStream的close()方法 } catch (IOException e) { e.printStackTrace(); } }}
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
- 黑马程序员——Java学习I/O流之字节流
- 黑马程序员——Java基础---I/O流(中[字节流])
- 黑马程序员,Java I/O流学习
- 黑马程序员——Java学习I/O流之字符流
- 黑马程序员——java中的I/O流
- 黑马程序员——Java基础--- I/O输入输出流
- 黑马程序员——Java I/O与流
- 黑马程序员—java基础复习—I/O流
- 黑马程序员 总结(十八)——I/O流(字节流)
- 黑马程序员————JAVA之I/O流
- 黑马程序员Java类之i/o流
- 黑马程序员—JAVA基础之I/O
- 黑马程序员-I/O流的学习
- 【黑马程序员】java I/O流浅谈
- 黑马程序员:java I/O流
- 黑马程序员-----JAVA I/O流
- 黑马程序员-JAVA-I/O-字符流
- 【黑马程序员】java I/O 学习总结
- 黑马程序员——Java学习之Map、Collections
- 一步步搭建物联网系统——无处不在的CSS
- 一步步搭建物联网系统——无处不在的Javascript
- 一步步搭建物联网系统——无处不在的三剑客
- LeetCode-Merge Two Sorted Lists
- 黑马程序员——Java学习I/O流之字节流
- java中的各种数据类型在内存中存储的方式
- 【记录】CentOS6.4搭建hustoj
- 2014-梦工厂回忆录
- iOS TableViewCell 加载时的动画
- Android Dairy:一打开 Android SDK Manager 就弹出 Site Authentication 界面
- 黑马程序员——Java学习I/O流之字符流
- poj 1061 青蛙的约会(gcd拓展,解不定方程)
- 服务器搭建:CentOS上安装配置nginx