Java I/O 技术(五)—— 操作 字节流 的对象
来源:互联网 发布:3*3矩阵的行列式怎么求 编辑:程序博客网 时间:2024/05/18 03:57
字符流处理的数据都是文字,需要将指定的数据,查指定的编码表。而字节流处理的数据不一定都是文字数据,所以是不需要指定查表的。直接在操作文件数据的时候,就将具体的字节数据写入到目的。
字节流常用的对象:
抽象基类:InputStream 和 OutputStream
InputStream
|-------FileInputStream
|-------BufferedInputStream
OutputStream
|--------FileOutputStream
|--------BufferedOutputStream
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class FileInputStreamDemo {public static void main(String[] args) throws IOException {/* * 需求:读取一个文件。用字节流。 */FileInputStream fis = new FileInputStream("tempfile\\fos.txt");//读取并存储到数组,将数组打印。以该种方式。byte[] buf = new byte[1024];int len = 0;while((len=fis.read(buf))!=-1){System.out.println(new String(buf,0,len));}System.out.println(fis.available()); //获取流关联的文件的剩余字节数。fis.close();}}
在上述例子中,
1. 我们自定义了缓冲区 来达到高效的目的,当然也可以用 BufferedInputStream 自带的缓冲区。
2. 用到的read()方法 返回值为:读入缓冲区的字节总数,如果因为已经到达流末尾而没有更多的数据,则返回 -1。
3. available() 方法 :获取流关联的文件的剩余字节数。
下面要完成的示例是:
将一串文本数据,写到本地硬盘上去。用FileOutputStream。
import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class FileOutputStreamDemo {/** * @param args * @throws IOException */public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("tempfile\\fos3434.txt");fos.write("abcdef".getBytes());//字节流的直接操作文件写入时,直接将数据写入到目的地。 FileOutputStream不支持对字符串的直接操作,因此需要转为 字节数组。//fos.flush();使用的是父类OutputStream的flush。该方法什么都没有做,只有OutputStram某一些子类定义了该方法的具体内容。 fos.close();//必须有,因为要关闭资源。}}
在这个示例中,我们应当注意:
1. 不需要 flush()。这是为什么呢,而操作字符就的FileWriter 为啥需要刷呢?
那是因为FileWriter底层使用了字节流在操作字符数据时,会先将这些数据进行临时存储,并查指定的编码表。按照指定的编码表中的内容写入到目的地。
比如:
对于字符——"你好",用FileWriter操作时,需要先将读到的字符临时存储然后,查找编码表,然后转成对应的数字字节,再写到目的地中去。
而字节流处理的数据不一定都是文字数据,所以是不需要指定查表的。直接在操作文件数据时,就将具体的字节数据写入到目的地。
2. 但必须有 close() 方法,用来关闭调用的系统资源。
接下里,我们将完成的示例是,CopyMp3!这个示例,我们将综合前面学的所以知识来完成,
我们将会见到在复制的过程中,不用缓冲区,用默认缓冲区,用刚好合适的缓冲区,用自定义的缓冲区等等情况下的,复制状态,以及效率。
对于效率的监控,我们用复制完成后的当前系统时间和 复制前的当前系统时间 差值来表示。
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class CopyMp3Test {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();copy_1();long end = System.currentTimeMillis();System.out.println("毫秒值:"+(end-start));}//不用缓冲区。public static void copy_4() throws IOException {FileInputStream fis = new FileInputStream("C:\\0.mp3");FileOutputStream fos = new FileOutputStream("c:\\4.mp3");int by = 0;while((by=fis.read())!=-1){fos.write(by);}fos.close();fis.close();}//不建议。使用刚刚好的缓冲区。因为文件过大会溢出。public static void copy_3() throws IOException {FileInputStream fis = new FileInputStream("C:\\0.mp3");FileOutputStream fos = new FileOutputStream("c:\\3.mp3");byte[] buf = new byte[fis.available()];fis.read(buf);fos.write(buf);fos.close();fis.close();}//使用字节流已有的缓冲区。 public static void copy_2() throws IOException {FileInputStream fis = new FileInputStream("C:\\0.mp3");FileOutputStream fos = new FileOutputStream("c:\\2.mp3");BufferedInputStream bufis = new BufferedInputStream(fis);BufferedOutputStream bufos = new BufferedOutputStream(fos);////3,定义一个字节缓冲区。//byte[] buf = new byte[1024];int by = 0;while((by=bufis.read())!=-1){bufos.write(by);}bufos.close();bufis.close();}//自定义数组缓冲区的方式。 public static void copy_1() throws IOException {//1,读取流对象,和mp3关联。FileInputStream fis = new FileInputStream("C:\\0.mp3");//2,写入流对象,明确存储mp3数据的目的。FileOutputStream fos = new FileOutputStream("c:\\1.mp3");//3,定义一个字节缓冲区。byte[] buf = new byte[1024*8];int len = 0;while((len=fis.read(buf))!=-1){fos.write(buf,0,len);}fos.close();fis.close();}}
至此,我们已经介绍完了字符流和字节流。但是,我们会注意到这样一个问题,程序中所需要的数据,都是事先已经定义好的,那么程序能否处理,由我们输入的数据呢?即读取键盘的数据。答案是肯定的,那么又该如何读取呢,是否有相应的对象?
- Java I/O 技术(五)—— 操作 字节流 的对象
- Java I/O 技术(三)—— 操作 字符流 的对象
- Java I/O 技术(八)—— 操作文件属性的对象:File
- Java I/O 技术(十)—— I/O 功能流对象(一)
- Java I/O 技术(十一)—— I/O 功能流对象(二)
- Java I/O流(2)——java字节流操作
- JAVA I / O操作与字节流
- java i/o流(5) 字节流、字符流的操作
- Java I/O 技术(七)—— 流操作规律总结
- Java I/O流复习(一)—File类、字节流、字节缓冲流
- 【Java.IO】I/O 字节处理流 - 之 - 内存(字节数组)操作流 - ByteArratInputStream,ByteArrayOutputStream
- Java I/O流操作(四)---对象的序列化
- java学习7--Java I/O 操作与字节流
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- Java-Java I/O流解读之基于字节的I / O和字节流
- Java-I/O操作之File类、字节流
- 【Java.IO】I/O 字节处理流 - 之- 基本Java数据类型操作流 —— DataInputStream, DataOutputStream
- Java I/O流复习(二)—字符流、字符缓冲流、以及和字节流的区别
- 如何进行高效的Rails单元测试
- OpenMax IL层的接口
- 开发辅助 - 宏
- 驱动函数write-linux系统调用如何实现
- 使用 screen 管理你的远程会话
- Java I/O 技术(五)—— 操作 字节流 的对象
- 烂人建网站
- C/C++对于函数指针数组的进一步解释
- 内网无法访问服务器(被访问电脑)数据库
- Android Lint Checks检查未使用资源
- 求多边形面积,直线,折现,z型线分平面(数学问题)
- Android Mms 源码结构
- git使用说明
- 清除XCode缓存和生成文件