文件输入输出流

来源:互联网 发布:手机淘宝在哪实人认证 编辑:程序博客网 时间:2024/06/05 06:29


一、对文件操作的流——基本知识



1.read()方法读取流中的数据是按照字节一个个读取,而且每次只读取一个字节。实践如下:

代码如下:


import java.io.FileInputStream;/** * 文件的输入输出流 * @author Administrator * */public class FileOperationTest {public static void main(String[] args) throws Exception {readFile("G:\\文件测试\\1.txt");}/** * 读取指定的文件 * @param fileName */public static void readFile(String fileName) throws Exception{//根据fileName构建文件输入流对象FileInputStream fis = new FileInputStream(fileName);//从此输入流中读取数据一个个读int i= fis.read();System.out .print((char)i);}}
*read()方法如何实现字符串的输出

代码如下:

import java.io.FileInputStream;/** * 文件的输入输出流 * @author Administrator * */public class FileOperationTest {public static void main(String[] args) throws Exception {readFile("G:\\文件测试\\1.txt");}/** * 读取指定的文件 * @param fileName */public static void readFile(String fileName) throws Exception{//根据fileName构建文件输入流对象FileInputStream fis = new FileInputStream(fileName);//从此输入流中读取数据一个个读int i= fis.read();//用read()实现文件的完整输出while(i!=-1){System.out.print((char)i);i = fis.read();}}}
*read()读取到文件末尾,返回-1。

2.read(byte[] b)按字节读取流中的数据,将读取到的数据存到byte[]数组中

代码如下:

import java.io.FileInputStream;/** * 文件的输入输出流 * @author Administrator * */public class FileOperationTest {public static void main(String[] args) throws Exception {readFile("G:\\文件测试\\1.txt");}/** * 读取指定的文件 * @param fileName */public static void readFile(String fileName) throws Exception{//根据fileName构建文件输入流对象FileInputStream fis = new FileInputStream(fileName);/*//从此输入流中读取数据一个个读int i= fis.read();//用read()实现文件的完整输出while(i!=-1){System.out.print((char)i);i = fis.read();}*///获取此流中的有效字节数int length=fis.available();//按块读byte[] buf= new byte[length];//刚好存满fis.read(buf);//此行代码执行完毕后文件中所有的字节都存到buf数组中String fileCountent = new String(buf);//用一个字符串接收这个数组System.out .println(fileCountent);//关闭流fis.close();}}
*中文字符由两个字节组成,在对流数据进行读取时会将字符拆成字节一个个读取,造成乱码。

代码如下:

import java.io.FileInputStream;/** * 文件的输入输出流 * @author Administrator * */public class FileOperationTest {public static void main(String[] args) throws Exception {readFile("G:\\文件测试\\1.txt");}/** * 读取指定的文件 * @param fileName */public static void readFile(String fileName) throws Exception{//根据fileName构建文件输入流对象FileInputStream fis = new FileInputStream(fileName);//从此输入流中读取数据一个个读int i= fis.read();//用read()实现文件的完整输出while(i!=-1){System.out.print((char)i);i = fis.read();}/*//获取此流中的有效字节数int length=fis.available();//按块读byte[] buf= new byte[length];//刚好存满fis.read(buf);//此行代码执行完毕后文件中所有的字节都存到buf数组中String fileCountent = new String(buf);//用一个字符串接收这个数组System.out .println(fileCountent);//关闭流fis.close();*/}}
通过read(byte[] b)方法将流中的数据整体保存在byte型数组中,用字符串接收这个数组,这串数据怎么解码的字符串在接收时又怎么拼接起来。

代码如下:

import java.io.FileInputStream;/** * 文件的输入输出流 * @author Administrator * */public class FileOperationTest {public static void main(String[] args) throws Exception {readFile("G:\\文件测试\\1.txt");}/** * 读取指定的文件 * @param fileName */public static void readFile(String fileName) throws Exception{//根据fileName构建文件输入流对象FileInputStream fis = new FileInputStream(fileName);/*//从此输入流中读取数据一个个读int i= fis.read();//用read()实现文件的完整输出while(i!=-1){System.out.print((char)i);i = fis.read();}*///获取此流中的有效字节数int length=fis.available();//按块读byte[] buf= new byte[length];//刚好存满fis.read(buf);//此行代码执行完毕后文件中所有的字节都存到buf数组中String fileCountent = new String(buf);//用一个字符串接收这个数组System.out .println(fileCountent);//关闭流fis.close();}}

写的操作与读的操作一一对应



三、实例,实现文件的复制粘贴

我们通过两种方式实现文件的复制粘贴,比较两种方式的效率。

第一种:用read()方法和write()方法实现复制粘贴。

第二种:创建缓冲区及byte型数组(用read(byte[])方法和write(byte[],int off,int len))实现复制粘贴。

*文件复制从G:\文件测试1\4.txt,复制到的G:\文件测试2\4.txt。

从实验可以看出第二种方法的效率高于第一种,代码如下:

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;/** * 文件的输入输出流 * @author Administrator * */public class FileOperationTest {public static void main(String[] args) throws Exception {String srcPath = "G:\\文件测试1\\4.txt";String destPath = "G:\\文件测试2\\4.txt";//计时器>计算复制粘贴文件所用的时间long start_time = System.currentTimeMillis();copyPaste(srcPath,destPath);long end_time = System.currentTimeMillis();System.out.println("拷贝用时:"+(end_time - start_time));} /** *  * @param srcPath * @param destPath * @throws Exception  */public static void copyPaste(String srcPath,String destPath) throws Exception {//构建文件输入输出流对象FileInputStream fis = new FileInputStream(srcPath);FileOutputStream fos = new FileOutputStream(destPath);//读取以及写入文件内容/*//用read()方法和write()方法实现复制粘贴int i =fis.read();while(i != -1){fos.write(i);//写i = fis.read();}*///创建缓冲区(用read(byte[])方法和write(byte[],int off,int len))实现复制粘贴byte[] buf = new byte[1024];//1024个字节大小的缓冲区//read(byte[])方法返回读取的字节的数量int i = fis.read(buf);while(i!=-1){//按块写入,每次写入1024个字节,最后一次写入len个字节fos.write(buf, 0, i);i = fis.read(buf);}fis.close();fos.close();}}


 三种读写文件的操作总结:

*  1.一个一个字节读写,用read(),write()方法对数据拆分成字节而进行读写,优点是灵活,逻辑也比较简单,但并不适合大数据的读写。

 *  2.一块一块缓冲区读写,用read(byte[] b),write(byte[] b)方法实现按块的读取,b为读取或者写入的字节数量,优点是适当大小的缓冲区(byte型数组)可以显著提高读写的速度(较一个一个字节读写而言),但因为缓冲区(数组长度)固定,最后一个缓冲区或许字节数会不够,read(byte[] b)就会写入很多空数据,造成文件变大。

 *  3.一次性读写,用read(byte[] b),write(byte[] b,int off,int len)方法,与第二种方法相似,不同在于,write(byte[] b,int off,int len)会判断缓冲区里字节的数量,与第二种方法遇到最后一缓冲区里的字节数不够却写入空数据充数相比,这种方法会根据缓冲区里的字节数写入相应数量的数据。


二、在文件输入输出流的基础上,对字节进行包装而衍生的其他字节流,常见的如下:

*1.BufferedInputStream    缓冲字节流         BufferedOutputStream

*2.DataInputStream         原始数据流          DataOutputStream

*3.ObjectInputStream         对象流               ObjectOutputStream

*4.ByteArrayInputStream    内存流               ByteArrayOutputStream

应用如下:

代码如下:

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/** * 根据文件输入输出流来了解其他流 * @author Administrator * */public class Test {public static void main(String[] args) throws Exception {//Student stu = new Student();//stu.study();//计时器>计算复制粘贴文件所用的时间long start_time = System.currentTimeMillis();writeToFileBufferedStream("G:\\文件测试1\\《超神学院》第十集.flv","G:\\文件测试2\\《超神学院》第十集.flv");long end_time = System.currentTimeMillis();System.out.println("拷贝用时:"+(end_time - start_time));}/** *  * @param srcPAth * @param destPath * @throws Exception  */public static void writeToFileBufferedStream(String srcPath,String destPath) throws Exception {//构建输出流对象FileInputStream fis = new FileInputStream(srcPath);FileOutputStream fos = new FileOutputStream(destPath);//构建缓冲字节输入输出流BufferedInputStream bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(fos);//读写操作(复制粘贴的功能)int i= bis.read();while(i!=-1){bos.write(i);i = bis.read();}bos.flush();//清空缓冲区bos.close();bis.close();fos.close();fis.close();}}





1 0
原创粉丝点击