您现在的位置是:首页 > 文章详情

Java 学习(23)---(IO流之字节流)

日期:2018-08-02点击:374

字节流

IO 用于在设备间进行数据传输的操作

1.分类:

 字节流

    |-- 字节输入流

InputStream

int read(): 一次读取一个字节

int read(byte[] bys): 一次读取一个字节数组

|--FileInputStream

|--BufferedInputStream

    |-- 字节输出流

OutputStream

void write(int by): 一次写一个字节

void write(byte[] bys,int index,int len): 一次写一个字节数组的一部分

|--FileOutputStream

|--BufferedOutputStream

 

字符流

    |-- 字符输入流

Reader

int read(): 一次读取一个字符

int read(char[] chs): 一次读取一个字符数组

|--InputStreamReader

|--FileReader

|--BufferedReader

String readLine(): 一次读取一个字符串

    |-- 字符输出流

Writer

void write(int ch): 一次写一个字符

void write(char[] chs,int index,int len): 一次写一个字符数组的一部分

|--OutputStreamWriter

|--FileWriter

|--BufferedWriter

void newLine(): 写一个换行符

void write(String line): 一次写一个字符串

注意:

a:如果我们没有明确说明按照什么分,默认按照数据类型分。                    

b: 除非文件用 windows  自带的记事本打开我们能够读懂, 才采用字符流, 否则建议使用字节流。

2.FileOutputStream 写出数据

A:操作步骤

    a:创建字节输出流对象

    b: 调用 write() 方法

    c:释放资源

B:API

构造方法

FileOutputStream(File file)

FileOutputStream(File file ,booleanappend) FileOutputStream(String name)

FileOutputStream(String name ,booleanappend) ;

如果第二个参数为 true ,则将字节写入文件末尾处,而不是写入文件开始处。

成员方法

public void write(int b): 写一个字节

public void write(byte[] b): 写一个字节数组

public void write(byte[] b,int off,int len) :写一个字节数组的一部分

public void close(); 关闭此文件输出流并释放与此流有关的所有系统资源。

C:代码体现:

// 创建字节输出流对象 // FileOutputStream(File file) // File file = new File("fos.txt"); // FileOutputStream fos = new FileOutputStream(file); // FileOutputStream(String name) FileOutputStream fos = newFileOutputStream("fos.txt"); /* *创建字节输出流对象了做了几件事情: *A: 调用系统功能去创建文件 *B: 创建 fos 对象 *C: 把 fos 对象指向这个文件 */ // 写数据 fos.write( fos.write("hello,IO".getBytes()); fos.write( fos.write(""java"".getBytes()); // 释放资源 // 关闭此文件输出流并释放与此流有关的所有系统资源。 fos.close(); /* *为什么一定要 close() 呢 ? *A: 让流对象变成垃圾,这样就可以被垃圾回收器回收了 *B: 通知系统去释放跟该文件相关的资源 */ //java.io.IOException: Stream Closed //fos.write("java".getBytes());

加入异常处理的代码:

FileOutputStream fos = null ; try { // fos = new FileOutputStream("z:\\fos4.txt"); fos = newFileOutputStream("fos4.txt""fos4.txt"); fos .write("java" .getBytes()); } catch (FileNotFoundException e ) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 如果 fos 不是 null ,才需要 close() if ( fos != null ) { // 为了保证 close() 一定会执行,就放到这里了 try { fos .close(); } catch (IOException e) { e.printStackTrace(); } } } 

C:要注意的问题  

  a:创建字节输出流对象做了几件事情 ?

1.调用系统功能去创建文件     2. 创 建   fos  对 象C: 把fos 对象指向这个文件

  b: 为什么要 close()?

1. 让流对象变成垃圾,这样就可以被垃圾回收器回收了

2.通知系统去释放跟该文件相关的资源

c:如何实现数据的换行 ?

写入换行符号即可

fos.write("\r\n".getBytes());

d: 如何实现数据的追加写入 ?

new FileOutputStream("fos3.txt", true);

3.FileInputStream 读取数据

A:操作步骤

1.创建字节输入流对象  2.调用 read() 方法 3.释放资源

B: API

构造方法

FileOutputStream(File file) FileOutputStream(String name)

成员方法

int read(): 一次读取一个字节

int read(byte[] b): 一次读取一个字节数组

代码:复制

FileInputStream fis = newFileInputStream( "fos.txt" ); // 方式 1 int by = 0; while ((by=fis.read())!=-1) { System. out .print(( char ) by ); } // 方式 2 byte [] bys = newbyte [1024]; int len = 0; while ((len=fis.read(bys))!=-1) { System. out .print( new String( bys ,0, len )); } fis.close(); 

案例:

// 高效字节流一次读写一个字节数组: publicstaticvoid method4(String srcString, String destString) throws IOException { BufferedInputStream bis = newBufferedInputStream( new FileInputStream (srcString)); newBufferedOutputStream(new FileOutputStream(destString)); byte [] bys = newbyte [1024]; int len = 0; while ((len = bis.read(bys)) != -1) { bos.write(bys, 0, len); } bos.close(); bis.close(); } 
// 高效字节流一次读写一个字节: publicstaticvoid method3(String srcString, String destString) throws IOException { BufferedInputStream bis = newBufferedInputStream( new FileInputStream( srcString)); BufferedOutputStream bos = newBufferedOutputStream( new FileOutputStream(destString)); int by = 0; while ((by = bis.read()) != -1) { bos.write(by); } bos.close(); bis.close(); }
// 基本字节流一次读写一个字节数组 publicstaticvoid method2(String srcString, String destString) throws IOException { FileInputStream fis = new FileInputStream(srcString); FileOutputStream fos = new FileOutputStream(destString); byte [] bys = newbyte [1024]; int len = 0; while ((len = fis.read(bys)) != -1) { fos.write(bys, 0, len); } fos.close(); fis.close(); }
// 基本字节流一次读写一个字节 publicstaticvoid method1(String srcString, String destString) throws IOException { FileInputStream fis = new FileInputStream(srcString); FileOutputStream fos = new FileOutputStream(destString); int by = 0; while ((by = fis.read()) != -1) { fos.write(by); } fos.close(); fis.close(); }

4.字节缓冲区流

通过定义数组的方式确实比以前一次读取一个字节的方式快很多, 所以, 看来有一个缓冲区还是非常好的。

既然是这样的话,那么, java 开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。

这种类被称为:缓冲区类 (高效类 )

A:BufferedOutputStream B:BufferedInputStream

原文链接:https://yq.aliyun.com/articles/623922
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章