Day25

今天学了三个小时把,FPX比赛赢了,美滋滋,明天下午要去五个小时的图书馆,加油OVO

Day25

今日小知识

Method copyFile should have no parameters。调用的方法不可以放在上面加@Test

IO流

分类:

1.数据单位不同:字节流(8 bit),字符流(18 bit),非文本的数据用字节流。

2.流向不同: 输入流,输出流

3.流的角色不同: 节点流,处理流。

 

IO流体系

抽象基类: 节点流(文件流) 缓冲流(处理流的一种)

字节输入流结尾-----InputStream FileInputStream BufferedInputStream

字节输出流结尾-----OutputStream FileOutputStram BufferedOutputStream

字符输入流结尾-----Reader FileReader BufferedReader

字符输出流结尾-----Writer FileWriter BufferedWriter

 

 

FileReader

package com.sorrymaker.IO;

import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
* @author 喜
* 1.read()理解。返回读入的一个字符,如果达到文件末尾,返回-1
* 2.异常的处理:为了保证流资源一定可以执行关闭操作,需要使用try/catch/finally来处理
* 3.要读入的文件一定要存在,否则就会报FileNotFoundException。
*
*/
public class FileReadWriterTest {

   @Test
   public void test() {
       FileReader fr = null;
       try {
           //1.实例化File类的对象,指明要操作的文件
           //相较于当前的Module下
           File file =new File("src/com/sorrymaker/IO/hello.txt");
           //2.提供具体的流,使用字符流
           fr = new FileReader(file);

           //3.数据的读入
           //read()返回读入的一个字符,如果达到文件末尾,返回-1
           //方式一:
//       int data = fr.read();
//       while (data !=-1){
//           System.out.println((char) data);
//           data =fr.read();
//       }
           //方式二:
           int data;
           while((data =fr.read())!=-1){
               System.out.println((char) data);
          }
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           //4.流的关闭。
           try {
               if(fr!=null) {
                   fr.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
  }

   //对read()操作升级,使用read()重载方法,
   @Test
   public void testFileReader1() {
       FileReader fr = null;
       try {
           //1.File类的实例化
           File file =new File("src/com/sorrymaker/IO/hello.txt");
           //2.FileReader流的实例化
           fr = new FileReader(file);
           //3.读入操作。
           //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数,如果达到文件末尾,返回-1
           char[] cbuf =new char[5];
           int len;
           while ((len = fr.read(cbuf)) != -1) {
               //这里for循环不能是i<cbuf.length。
               //因为会出现bug,当取到文件末尾时,长度不足数组长度,就会把长度差值所剩下的字符输出出来,重复输出部分数字。
//               错误的写法。
//               for (int i = 0; i < cbuf.length; i++) {
//                   System.out.print(cbuf[i]);
//               }
               //方式一:正确的写法。使用len,每次读进去多少个数字,就遍历多少个数字。
//               for (int i = 0; i < len; i++) {
//                   System.out.print(cbuf[i]);
//               }
               //方式二:
               //错误的写法,跟上面那个错的一样。
//               String str =new String(cbuf);
//               System.out.println(str);
               //正确的写法,从0开始,每次取len个。
               String str =new String(cbuf,0,len);
               System.out.print(str);
          }
           //4.流资源的关闭。
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           if(fr !=null) {
               try {
                   fr.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }
      }
  }
}

 

 

FileInputOutputStreamTest

package com.sorrymaker.IO;

import org.junit.Test;

import java.io.*;

/** 1.对于文本文件(.txt,java,c,cpp),使用字符流处理
* 2.对于非文本文件(.jpg,mp3,mp4,avi,doc,ppt),使用字节流处理
*测试FileInputStream 和FileOutputStream
*/
public class FileInputOutputStreamTest {

   //使用字节流来处理,可能会出现bug
   @Test
   public void FileInputStreamTest() {
       FileInputStream fis = null;
       try {
           //1,造文件
           File file =new File("src/com/sorrymaker/IO/hello.txt");

           //2.造流
           fis = new FileInputStream(file);

           //3.读数据
           byte[] buffer =new byte[5];
           int len;
           while((len = fis.read(buffer))!=-1){
               String str =new String(buffer,0,len);
               System.out.println(str);
          }
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           //4.关闭资源
           if (fis!=null){
               try {
                   fis.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }
      }
  }
   //实现图片的复制操作
   @Test
   public void FileInputStreamTest1() {
       FileInputStream fis = null;
       FileOutputStream fos = null;
       try {
           File file1 =new File("src/com/sorrymaker/IO/01.png");
           File file2 =new File("src/com/sorrymaker/IO/02.png");

           fis = new FileInputStream(file1);
           fos = new FileOutputStream(file2);

           byte[] buffer =new byte[5];
           int len;
           while((len=fis.read(buffer))!=-1){
               fos.write(buffer,0,len);
          }
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           if (fis!=null){
               try {
                   fis.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }
           if (fos!=null){
               try {
                   fos.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }
      }
  }
   //指定路径下文件的复制。

   public void copyFile(String srcPath,String destPath){
       FileInputStream fis = null;
       FileOutputStream fos = null;
       try {
           File file1 =new File(srcPath);
           File file2 =new File(destPath);

           fis = new FileInputStream(file1);
           fos = new FileOutputStream(file2);

           byte[] buffer =new byte[1024];
           int len;
           while((len=fis.read(buffer))!=-1){
               fos.write(buffer,0,len);
          }
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           if (fis!=null){
               try {
                   fis.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }
           if (fos!=null){
               try {
                   fos.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }
      }
  }
   @Test
   public void testCopyFile(){
       long start = System.currentTimeMillis();
       String srcPath="D:\\Desktop\\MarkDown\\day01.md";
       String destPath="D:\\Desktop\\MarkDown\\day0000.md";
       copyFile(srcPath,destPath);
       long end = System.currentTimeMillis();

       System.out.println("复制操作需要"+(end-start)+"s");

  }
}

 

上一篇:Java TCP套接字编程(一)简单文字传输


下一篇:Java---IO流(二)