最近在做一个基于JMF的视频聊天软件,视频算是通了,今天准备整下文件传输
以前听说过字节流与字符流的概念,今天意外玩了一下,发现不玩不知道,一玩吓一跳..........
以前用InputStream、OutputStream做过一些关于文件读取复制的小练习,当操作的文件超过3M的时候就明显感到吃力了,当时对这个没什么兴趣,没想过去改进,做完了事。直到今天玩了字符流,才重新燃起好奇心
特别说明:
字符流因为处理的是字符,所以如果文件中包含所用字符集中没有的字符时(典型的是y上面两点的字符),那么复制完后将会得到一个损坏的文件,因此字符流只适用于对文本文件的处理,而对于多媒体文件就不适用。
由于一时找不到大点的文本文件,所以以下测试文件均为多媒体文件,目的只是测试流的性能,特此说明!
FileInputStream/FileOutputStream 和 对应Reader/Writer 性能比较:
字节流与字符流,顾名思义,前者是以字节为基础的,即一个byte,后者是以字符为基础,即两个byte(一个char),就速度来说,理论上后者要比前者快2倍,我们来测试下:
所用测试文件为“E:\KuGou\my all.mp3”,大小为8.47MB
package cn.netjava.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class FileCopy {
//原始文件
private File file = new File("E:\\KuGou\\my all.mp3");
//复制品
private File copy = new File("E:\\copy.mp3");
public void startCopy(){
try{
FileInputStream fin = new FileInputStream(file);
FileOutputStream fout = new FileOutputStream(copy);
int i = 0;
//记录下开始时间
long start = System.currentTimeMillis();
while(true){
//采用一读一写模式
i = breader.read();
if(i==-1){
break;
}
bwriter.write(i);
}
//记录下结束时间
long end = System.currentTimeMillis();
//总耗时
long total = end - start;
System.out.println("总耗时: "+total+"ms");
//关闭流
reader.close();
writer.flush();
writer.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
FileCopy f = new FileCopy();
f.startCopy();
}
}
运行后结果为“108351ms”,汗...复制一个8M多的音乐文件竟然用了100多秒,改进下
换成InputStreamReader和OutputSrtreamReader
FileInputStream fin = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fin);
FileOutputStream fout = new FileOutputStream(copy);
OutputStreamWriter writer = new OutputStreamWriter(fout);
while(true){
//采用一读一写模式
i = reader.read();
if(i==-1){
break;
}
writer.write(i);
}
再次运行,结果为“3436ms”,耗时由100多秒缩减到不到5秒,这可不是单纯的“2倍”啊
由此再进一步,和BufferedReader/BufferedWriter比较一下
InputStreamReader/OutputStreamWriter 和 BufferedReader/BufferedWriter 性能比较
见识到InputStreamReader的强大后又发现了BufferedReader,Buffer是缓冲的意思,IT中凡是加了“缓冲”的都是优化过的,来测试看看
测试文件为“E:\fairy tail\妖精的尾巴[01].rmvb”,大小为135MB
//原始文件
private File file = new File("E:\\fairy tail\\妖精的尾巴[01].rmvb");
//复制品
private File copy = new File("E:\\copy.rmvb");
测试结果为“48437ms”
接下来换成BufferedReader/BufferedWriter
FileInputStream fin = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fin);
BufferedReader breader = new BufferedReader(reader);
FileOutputStream fout = new FileOutputStream(copy);
OutputStreamWriter writer = new OutputStreamWriter(fout);
BufferedWriter bwriter = new BufferedWriter(writer);
while(true){
//采用一读一写模式
i = breader.read();
if(i==-1){
break;
}
bwriter.write(i);
}
运行结果为“19438ms”,带个Buffer果然不一样,速度又快了很多
I/O中还有一些流,我没有一个个玩,有兴趣的去弄弄撒,木哈哈~
分享到:
相关推荐
掌握字符流与字节流的原理及其应用,能够帮助Java开发者更高效、更准确地处理各种数据流,从而提升程序的性能和稳定性。在实际开发中,根据具体需求合理选择数据流类型,是提升代码质量和程序功能的关键。
### Java字符流和字节流详解 #### 一、引言 在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流...
除此之外,InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,它们允许我们在字节流和字符流之间转换,以适应不同编码格式的需求。 在Java IO中,还有一套转换流(Wrapper Stream),即...
这些缓冲流可以在字节流和字符流上进行包装,例如BufferedReader可以包裹一个InputStreamReader,从而在读取字符时提供更高效的性能。 对于工具的使用,开发者经常使用如Apache Commons IO库中的工具类,如...
本篇文章将详细探讨IO流中的字节流、字符流以及文本流。 首先,我们来了解一下**字节流**。字节流是最基础的IO流类型,分为输入字节流(InputStream)和输出字节流(OutputStream)。它们处理的数据单位是字节,...
在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...
3. 引入BufferedInputStream和BufferedOutputStream,实现带缓冲的文件复制,比较无缓冲与有缓冲的性能差异。 4. 使用InputStreamReader和OutputStreamWriter处理不同编码的文件,如从GBK编码的文件读取内容并保存为...
`InputStreamReader`和`OutputStreamWriter`是字节流与字符流之间的桥梁。 - 常用的字符流类包括`FileReader`和`FileWriter`,用于读写文件中的文本;`StringReader`和`StringWriter`,用于字符串的读写。 - 字符...
在Java编程语言中,`字节流`和`字符流`是进行输入/输出操作的基础,主要用于处理数据的传输。这两个概念是Java IO系统的核心,它们允许程序与外部设备(如硬盘、网络、内存等)交换信息。在这个压缩包中,你将找到...
本讲义主要探讨的是Java中的字节流和字符流,这是IO操作的基础,也是开发过程中频繁使用的工具。字节流和字符流是Java IO框架的两大支柱,它们分别处理原始的字节数据和经过编码的字符数据。 字节流是Java中处理二...
根据不同的数据类型和操作方式,I/O流分为多个类别,主要包括数据流、对象流、字节流和字符流。 1. **数据流**: 数据流主要指的是InputStream和OutputStream这两类基本流。InputStream是所有读取数据的流的基类,...
字节流与字符流的主要区别在于: - 数据单位:字节流处理单字节,字符流处理Unicode码元。 - 应用场景:字节流适合处理二进制数据,如图片、音频文件等;字符流专用于处理文本数据,它会考虑字符编码。 - 编码与解码...
Java 字节流和字符流的区别详解 Java 中的字节流和字符流是两种不同的输入 / 输出流,它们之间的区别是非常重要的。在本文中,我们将详细介绍 Java 中的字节流和字符流的区别,并通过示例代码来演示它们的使用。 ...
在Java IO中,主要有两种流的概念:字符流(Character Stream)和字节流(Byte Stream)。它们是处理数据的基本方式,适用于不同场景。 字符流主要处理基于字符的数据,如文本文件,它包括Reader和Writer两个抽象...
与字节流一样,字符流也有缓冲的概念,可以使用 BufferedReader 和 BufferedWriter 对性能进行优化,减少与底层 I/O 操作的交互次数。 总结: Java 的 IO 流系统是基于流的,提供了对数据的读写操作。字节流适用于...
在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节的数据,而字符流则处理Unicode编码的16位字符。 1. **字节流**: - `InputStream` 和 `OutputStream` 是所有...
Java中的流分为两种类型:字符流(Character Stream)和字节流(Byte Stream),它们都是Java I/O系统的基础。字符流处理的是Unicode字符,而字节流则处理单个字节的数据。 字节流是最基础的流,主要包括...
6. **字符流与字节流的区别**: 字符流处理单个字符,适合文本数据,而字节流处理原始字节,适合二进制数据。字符流依赖于特定的字符编码,而字节流不涉及字符编码。 7. **使用示例**: 在`java字符流操作.java`文件...
通过`Socket`类的`getInputStream()`和`getOutputStream()`方法,可以获取到与远程服务器连接的字节流。 总的来说,`ByteIO.java`文件可能包含了字节流的基本用法,如文件读写、数据传输、缓冲优化等。通过学习和...
与字节流相比,字符流处理字符数据时会考虑到字符编码的问题,避免因编码转换不正确导致的数据丢失或乱码。 2.2 编码表【理解】 编码表,如ASCII、GBK、UTF-8等,是将字符映射到字节序列的规则。在处理字符流时,...