1 文件字节流 FileIputStream 通过字节的方式读取文件,适合所有类型的文件 (图像、视频、文本文件等)。java也提供了 FileReader专门读取文本文件。
import java.io.FileInputStream;
*public class FileStreamDemo {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("e:/R.gif");
int temp = 0;
while((temp = fis.read()) != -1){
System.out.println(temp);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (fis != null){
fis.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}*
输出: 25
0
91
132
112
93
18
...
...
注:字节数返回值大小在0-256之间
FileOutputStream 通过字节的方式写数据到文件中,适合所有类型的文件。Java也提供了 FileWriter 专门写入文本文件。
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileStreamDemo {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("e:/R.jpg");
fos = new FileOutputStream("e:/aa.jpg");
int temp = 0;
while((temp = fis.read()) != -1){
fos.write(temp);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (fis != null){
fis.close();
}
if(fis != null){
fos.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
通过缓冲区提高读写效率
方式一 通过创建一个指定长度的字节数组作为缓冲区,以此来提高Io流的读写效率。该方式适用于读取较大图片时的缓冲区定义。注意:缓冲区的长度一定是2的整数幂。一般情况下1024长度较为合适。
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileStreamBufferedDemo {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("e:/R.jpg");
fos = new FileOutputStream("e:/aa.jpg");
byte[] buff = new byte[1024];
int temp = 0;
while((temp = fis.read(buff)) != -1){
fos.write(buff,0,temp);
}
fos.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (fis != null){
fis.close();
}
if(fis != null){
fos.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
方式二 通过创建一个字节数组作为缓冲区,数组长度是通过输入流对象的available()返回当前文件的预估长度来定义的。在读写文件时,是在一次读写操作中完成文件读写操作的。注意:如果文件过大,那么对内存的占用也是比较大的。所以大文件不建议使用该方法。
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileStreamBuffer2Demo {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("e:/R.jpg");
fos = new FileOutputStream("e:/aa.jpg");
byte[] buff = new byte[fis.available()];
fis.read(buff);
fos.write(buff);
fos.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (fis != null){
fis.close();
}
if(fis != null){
fos.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
2 缓冲字节流
通过字节缓冲流提高读写效率
Java缓冲流本身并不具有Io流的读取与写入功能,只是在别的流(节点流或其他处理流)上加上缓冲功能提高效率,就像是把别的流包装起来一下,因此缓冲流是一种处理流(包装流)。 当对文件或者其他数据源进行频繁的读写操作时,效率比较低,这是如果使用缓冲流就能够更高效的读写信息。因为缓冲流是先将数据缓存起来,然后当缓存区存满后或者手动刷新时再一次性的读取到程序或写入目的地。 因此缓冲流还是很重要的,我们再Io操作时记得加上缓冲流来提升性能。 BufferedInputStream和BufferedOutputStream这两个流是缓冲字节流,通过内部缓存数组来提高操作流的效率。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileStreamBuffered3Demo {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try{
fis = new FileInputStream("e:/R.jpg");
bis = new BufferedInputStream(fis);
fos = new FileOutputStream("e:/aa.jpg");
bos = new BufferedOutputStream(fos);
int temp = 0;
while ((temp = bis.read())!= -1){
bos.write(temp);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(bis != null){
bis.close();
}if (fis != null){
fis.close();
}if (bos != null){
bos.close();
}if(fos != null){
fos.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
|