文件读出和写入两种基本方法

本文介绍了如何使用Java进行文件复制的基本方法,包括使用InputStream逐字节读取和使用BufferedInputStream进行缓冲读取两种方式,并对比了它们的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   文件读出和写入两种基本方法

  首先,我们的目的是:通过java源代码的运行将文件从一个地方复制到另外一个地方。只需要两步就可以了——将文件读出来,将读出来的内容保存到新建的一个文件夹内。

  现在介绍两种最基本的方法——字节流InputStream和缓冲流BufferedInputStream。第一种是将磁盘中文件的内容一个一个字节的读出写入;后一种则是将文件一段一段的读出写入。在创建 BufferedInputStream 时,会相应的创建一个内部缓冲区数组在java虚拟机内存中,因此每次处理的就是这一整块内存。

  我们先用InputStream来实现这一功能,然后再用BufferedInputStream 实现,最后比较这两者的优劣。

 

Java代码   收藏代码
  1. <span style="">/** 
  2.      * 读取指定文件内容 
  3.      *  
  4.      * @param fileName被复制文件名 
  5.      * @return 将读取到的内容作为String类型返回 
  6.      * @throws IOException 
  7.      *             文件操作异常 
  8.      */  
  9.     private String readFileString(String fileName)  
  10.             throws IOException {  
  11.         // java.io.InputStream抽象类是表示字节输入流的所有类的超类,java.io.FileInputStream是它的一个实现类  
  12.         // 定义这样的输入流对象,来进行文件操作  
  13.         java.io.InputStream ins = new java.io.FileInputStream(fileName);  
  14.         // 也可以这样(多个构造方法)  
  15.         // java.io.InputStream ins1 = new java.io.FileInputStream(new  
  16.         // File(fileName));  
  17.         // 根据ins中的字节长度 创建一个byte数组保存读出的数据  
  18.         byte[] contentByte = new byte[ins.available()];  
  19.         // 对contentByte数组赋值  
  20.         // 读入就是把文件中的东西读出后读入到另一个东西里去  
  21.         ins.read(contentByte);  
  22.         //方法二  
  23. //      while (true) {  
  24. //          int i = ins.read();  
  25. //          if(i == -1)  
  26. //              break;  
  27. //    
  28. //      }  
  29.         // 把contentByte转变为String类型  
  30.         String s = new String(contentByte);  
  31.         //关闭文件流  
  32.         ins.close();  
  33.         System.out.println("InputStream使用结束,文件已被读出");  
  34.         return s;  
  35.     }</span>  

  下一步就是创建一个新的文件,然后将刚刚获得的返回值写入进去便可了。

Java代码   收藏代码
  1. <span style="">/** 
  2.      * contentString 文件的内容 
  3.      * @param path新路径名  
  4.      * @throws IOException 
  5.      *             文件操作异常 
  6.      */  
  7.     private void whiteFile_OutputStream(String contentString, String path)  
  8.             throws IOException {  
  9.         // 定义输出流对象,来进行文件操作  
  10.         java.io.OutputStream os = new java.io.FileOutputStream(path);  
  11.         // 对contentByte数组赋值  
  12.         byte[] contentByte = contentString.getBytes();  
  13.         //写入path中  
  14.         os.write(contentByte);  
  15.         os.close();  
  16.         System.out.println("OutputStream结束,文件已被复制");  
  17.     }</span>  

 这样的话filename里面的文件就被复制到了path里面。

     下面我们再看一下如果是BufferedInputStream 会怎么样。

Java代码   收藏代码
  1. <span style="">/** 
  2.      * 复制指定文件内容 
  3.      * @param path新文件的路径 
  4.      * @param fileName 
  5.      *  
  6.      * @throws IOException 
  7.      *             文件操作异常 
  8.      */  
  9.     private void copyBuffered(String fileName, String path)  
  10.             throws IOException {//还是需要先 定义InputStream输入流对象    
  11.         java.io.InputStream ins = new java.io.FileInputStream(fileName);  
  12.         // 创建一个BufferedInputStream对象时 需要用InputStream作为输入  
  13.         java.io.BufferedInputStream bis = new java.io.BufferedInputStream(ins);  
  14.         // 文件复制中的输出流  
  15.         java.io.OutputStream os = new java.io.FileOutputStream(path);  
  16.         java.io.BufferedOutputStream bos = new java.io.BufferedOutputStream(os);  
  17.         // 根据ins中的字节长度 创建一个byte数组保存读出的数据  
  18.         byte[] contentByte = new byte[bis.available()];  
  19.         // 对contentByte数组赋值  
  20.         // 读入就是把文件中的东西读出后读入到另一个东西里去  
  21.                bis.read(contentByte);  
  22.         bos.write(contentByte);  
  23. //方法二       while (true) {  
  24. //          int i = bis.read();  
  25. //          if (i == -1) {  
  26. //              break;  
  27. //          }  
  28. //          bos.write(i);  
  29. //      }  
  30.         System.out.println("BufferedInputStream拷贝结束");  
  31.         bos.flush();// 将缓冲区中的内容强制全部写入到文件中(不管是否已经全部写入)有点类似于下面的语句  
  32.         // bos.close();  
  33.         // bis.close();  
  34.         // os.close();  
  35.         // ins.close();  
  36.           
  37.     }</span>  

 

   读者将会发现其实并没有多少区别。

   只能说,形式的确是如此。但程序运行时内部的处理是不同的,这体现为后者的读取复制速度远远快于前者。



转自: http://java--hhf.iteye.com/blog/1747507

好的,下面我将分别使用 `fwrite` `file_put_contents` 两种方法文件写入两篇自选的诗词歌赋,并将文件内容读出。 ### 使用 `fwrite` 方法 首先,我们选择李白的《静夜思》作为示例: ```php <?php // 使用 fwrite 方法写入文件 $filename = 'poem1.txt'; $poem = "床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。\n"; // 打开文件 $file = fopen($filename, 'w'); if ($file) { // 写入文件 fwrite($file, $poem); // 关闭文件 fclose($file); } // 读取文件内容 $content = file_get_contents($filename); echo "使用 fwrite 方法写入的诗歌内容:\n"; echo $content; ?> ``` ### 使用 `file_put_contents` 方法 接下来,我们选择杜甫的《春望》作为示例: ```php <?php // 使用 file_put_contents 方法写入文件 $filename = 'poem2.txt'; $poem = "国破山河在,城春草木深。\n感时花溅泪,恨别鸟惊心。\n烽火连三月,家书抵万金。\n白头搔更短,浑欲不胜簪。\n"; // 写入文件 file_put_contents($filename, $poem); // 读取文件内容 $content = file_get_contents($filename); echo "使用 file_put_contents 方法写入的诗歌内容:\n"; echo $content; ?> ``` ### 完整代码 将上述代码合并在一起: ```php <?php // 使用 fwrite 方法写入文件 $filename1 = 'poem1.txt'; $poem1 = "床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。\n"; // 打开文件 $file1 = fopen($filename1, 'w'); if ($file1) { // 写入文件 fwrite($file1, $poem1); // 关闭文件 fclose($file1); } // 读取文件内容 $content1 = file_get_contents($filename1); echo "使用 fwrite 方法写入的诗歌内容:\n"; echo $content1; // 使用 file_put_contents 方法写入文件 $filename2 = 'poem2.txt'; $poem2 = "国破山河在,城春草木深。\n感时花溅泪,恨别鸟惊心。\n烽火连三月,家书抵万金。\n白头搔更短,浑欲不胜簪。\n"; // 写入文件 file_put_contents($filename2, $poem2); // 读取文件内容 $content2 = file_get_contents($filename2); echo "使用 file_put_contents 方法写入的诗歌内容:\n"; echo $content2; ?> ``` 通过以上代码,我们分别使用 `fwrite` `file_put_contents` 方法将两篇诗词写入文件,并将其内容读取出来显示在屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值