代码有点混乱

来源:5-2 字符流之文件读写流

物语似钺

2015-09-17 22:10

不能在讲到一个内容的时候,新建一个包把本节的代码放进里面,这样代码就不会那么混乱了,每个章节都有相应的包相应的代码这样好让学习者更快掌握

写回答 关注

4回答

  • 横空hero
    2016-12-11 17:33:10
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    public class IOUtil {
     
     /**
      * 单字节读取
      * 不适合大文件,读取大文件效率很低
      * @param filename
      * @throws IOException
      */
     public static void printHex(String filename) throws IOException{
      FileInputStream in = new FileInputStream(filename);
      int b;
      int i = 1;
      while( (b=in.read())!= -1){
       if(b < 0xf){
        //单位数前面补0
        System.out.print("0");
       }
       System.out.print(Integer.toHexString(b)+"  ");
       i++;
       if(i%10==0){
        System.out.println();
       }
      }
      in.close();
     }
     
     /**
      * 批量读取字节
      * 读取大文件,效率很高,也是最常用的读取文件的方法
      * @param filename
      * @throws IOException
      */
     public static  void printHexByByteArray(String filename) throws IOException {
      FileInputStream in = new FileInputStream(filename);
      byte buf[] = new byte[20*1024];
      //从in中批量读取字节,放到buf字节数组中,从第0个位置放,最多放buf.length个,返回的是读到的字节个数
      int b = in.read(buf, 0, buf.length);//一次性读完,说明字节数组足够大
      int j = 1;
      for(int i=0; i<b; i++){
       if(buf[i] <= 0xf){
        System.out.print(0);
       }
       System.out.print(Integer.toHexString(buf[i] & 0xff)+"  ");//byte只有8位,而int有32位,所以 & 0xff可以清除高位上的数
       if(j++%10==0){
        System.out.println();
       }
      }
      in.close();
     }
     
     public static void copyFileByByte(File src, File dst) throws IOException{
      if(!src.exists()){
       throw new IllegalArgumentException("文件"+src+"不存在!");
      }
      if(!src.isFile()){
       throw new IllegalArgumentException(src+"不是文件");
      }
      FileInputStream in = new FileInputStream(src);
      FileOutputStream out = new FileOutputStream(dst);
      int b = 0;
      while((b = in.read()) != -1 ){
       out.write(b);
      }
      in.close();
      out.close();
     }
     
     /**
      * FileOutputStream复制文件
      * 用字节数组批量读取文件
      * @param src
      * @param dst
      * @throws IOException
      */
     public static void copyFileByByteArray (File src,File dst) throws IOException{
      if(!src.exists()){
       throw new IllegalArgumentException("文件"+src+"不存在!");
      }
      if(!src.isFile()){
       throw new IllegalArgumentException(src+"不是文件");
      }
      FileInputStream in = new FileInputStream(src);
      /*
       * 当dst不存在时,会自动创建,如果存在,删除后在创建
       * 如果增加true,则不会删除原文件,会在原文件尾部写出新内容
       */
      FileOutputStream out = new FileOutputStream(dst,true);
      byte buf[] = new byte[10*1024];
      int b = in.read(buf);
      out.write(buf, 0, b);
      out.flush();
            in.close();
            out.close();
      
     }
     
     /**
      * DataOutputStream
      * @throws IOException
      */
     public static void dataOutputStream() throws IOException{
      String filename = "A/B.txt";
      DataOutputStream out = new DataOutputStream(new FileOutputStream(filename));
      out.writeInt(6);
      out.writeDouble(4.9);
      out.writeLong(8l);
      out.writeUTF("张基");//以utf-8写入
      out.writeChars("张基");//以utf-16be写入
      out.close();
      
     }
     
     /**
      * DataInputStream
      * @throws IOException
      */
     public static void dataInputStream() throws IOException{
      String filename = "A/B.txt";
      DataInputStream in = new DataInputStream(new FileInputStream(filename));
      int i = in.readInt(); 
      System.out.println(i);
      double j = in.readDouble(); 
      System.out.println(j);
      long k = in.readLong();
      System.out.println(k);
      String str1 = in.readUTF();
      System.out.println(str1);
      char c = '\0';
      while( (c = in.readChar() ) != '\0' ){
       System.out.print(c);
      }
      in.close();
     }
     
     /**
      * BufferedInputStream , BufferedOutputStream
      * 用带缓冲的字节流复制文件
      * @param src
      * @param dst
      * @throws IOException
      */
     public static void copyFileByBuffer(File src, File dst) throws IOException{
      if(!src.exists()){
       throw new IllegalArgumentException("文件"+src+"不存在!");
      }
      if(!src.isFile()){
       throw new IllegalArgumentException(src+"不是文件");
      }
      BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst));
      int b = 0;
      while((b = in.read()) != -1){
       out.write(b);
       out.flush();//刷新缓冲区
      }
      in.close();
      out.close();
     }
     
     /**
      * InputStreamReader , OutputStreamWriter
      * 处理字符流
      * @param filename
      * @throws IOException
      */
     public static void isrAndOsw(File filename1,File filename2) throws IOException{
      InputStreamReader in = new InputStreamReader(new FileInputStream(filename1),"gbk");//项目默认编码
      OutputStreamWriter out =new OutputStreamWriter(new FileOutputStream(filename2),"gbk");
      /*int b;
      while((b=in.read()) != -1){
       System.out.print((char)b);
      }
      */
      char buf[] = new char[8*1024];
      int b;
      while((b=in.read(buf, 0, buf.length)) != -1){
       String s = new String(buf,0,b);
       System.out.print(s);
    //   System.out.println(buf);
    //   out.write(buf,0,b);
    //         out.flush();
       out.write(s, 0, s.length());
       out.flush();
      }
      
      in.close();
      out.close();
     }
     
     /**
      * 文件读写流
      * @param f1
      * @param f2
      * @throws IOException
      */
     public static void frAndFw(File f1, File f2)throws IOException{
      FileReader fr = new FileReader(f1);
      FileWriter fw = new FileWriter(f2,true);//如果加上true,则会在f2的末尾追加内容,不会删除原内容
      char buf[] = new char[3*1024];
      int c = 0;
      while(( c = fr.read(buf, 0, buf.length) )!=-1){
       fw.write(buf, 0, c);
       fw.flush();
      }
      fw.write("\n");
      fw.close();
      fr.close();
     }
     
     /**
      * 字符流过滤器
      * @param f1
      * @param f2
      * @throws IOException
      */
     public static void brAnBwFilter(File f1, File f2,File f3) throws IOException{
      BufferedReader br = new BufferedReader(
        new InputStreamReader(
          new FileInputStream(f1)));
      BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(
          new FileOutputStream(f2,true)));
    //  PrintWriter pw = new PrintWriter(f3);
      PrintWriter pw = new PrintWriter(
        new OutputStreamWriter(
          new FileOutputStream(f3,true))); 
      String line;
      while( (line=br.readLine()) != null){//readLine()不能识别原文本中的换行
       bw.write(line);
       bw.newLine();//手动添加换行
       bw.flush();
       pw.println(line);
       pw.flush();
      }
      br.close();
      bw.close();
      pw.close();
     }
     }
    import java.io.File;
    import java.io.IOException;
    public class IOUtil_Test {
     public static void main(String[] args) throws IOException {
            //IOUtil.printHex("A\\B.txt");
      
      /*
      long statime = System.currentTimeMillis();
      IOUtil.printHexByByteArray("A\\B.txt");
      System.out.println();
      long endtime = System.currentTimeMillis();
      System.out.println("读取时间:" + (endtime - statime) + "ms" );*/
      
            //IOUtil.copyFileByByteArray(new File("A\\B.txt"), new File("A\\B1.txt"));
      
      /*
      IOUtil.dataOutputStream();
      IOUtil.printHexByByteArray("A\\B.txt");
      System.out.println();
      */
      
      //IOUtil.dataInputStream();
      /*
      //1
      long start1 = System.currentTimeMillis();
      IOUtil.copyFileByByte(new File("A\\B1.txt"), new File("A\\bu1.txt"));
      long end1 = System.currentTimeMillis();
      System.out.println(end1-start1);
      //2
      long start2 = System.currentTimeMillis();
      IOUtil.copyFileByBuffer(new File("A\\B1.txt"), new File("A\\bu2.txt"));
      long end2 = System.currentTimeMillis();
      System.out.println(end2-start2);
      //3
      long start3 = System.currentTimeMillis();
      IOUtil.copyFileByByteArray(new File("A\\B1.txt"), new File("A\\bu3.txt"));
      long end3 = System.currentTimeMillis();
      System.out.println(end3-start3);*/
      
      
      //IOUtil.isrAndOsw(new File("A\\B1.txt"), new File("A\\isAndOsw.txt"));
      
      //IOUtil.frAndFw(new File("A\\B1.txt"), new File("A\\frAndFw.txt"));
      
      IOUtil.brAnBwFilter(new File("A\\B1.txt"), new File("A\\brAnBwFilter.txt"),
        new File("A\\brAndBwFilter1.txt"));
     }
    }

    上边是所有方法的类,下别是测试类

  • 慕仰6402433
    2016-12-03 15:41:28

    你想表达的是老师把讲到的所有代码都写到一个包里的意思吧,你自己写的时候,可以合理的区分呀,比如创建一个包"io1"、"io2"(也就是IO专题1,IO专题2)之类的。

  • Zoya
    2016-04-19 09:24:00

    这个老师讲得很有条理啊,那些文件的命名也很合理

  • Javer_
    2015-12-04 01:33:48

    你要慢慢去掌握啊,学这个本来就不能急

文件传输基础——Java IO流

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

133869 学习 · 1060 问题

查看课程

相似问题