zoukankan      html  css  js  c++  java
  • java.io,io流,2020.12.28

    每日心得

    假终于放完了,不过感冒还没好,班上大部分好了吧,可是我们老师吊了两天水却还加重了,不可思议。。

    java.io

    I/O(Streams)流

    通过数据流、序列化和文件系统提供系统输入和输出,这是文档的解释.这里有一个概念,Stream-->流,指一种数据运送的方式,流分很多种,有字节流,字符流;这个包主要用于java-->Input&Output与外面的程序进行输入或输出,输入与输出是相对的概念,当java是输入方时,被输入方则是输出方,输出同理;这里又有InputStreamOutputStream,输入输出流.
    但这其中也分同一机器,系统中的不同进程通讯使用FileInputStream&FileOutputStream
    还有不同机器即跨机器的通讯.net

    InputStream(输入流抽象类)
      .read();//(核心方法)只能一次读一个返回一个int,范围(0-255),如果没有字节读了,到达流的末尾,返回-1;这个方法会阻塞,只能给予三种情况,一返回一个范围内的正整数,二是返回-1,三抛出异常,超出这三种情况则会发生阻塞,代码会一直停在这里不会继续运行下去;
    
      .read(byte b[]);//返回int,总共读到的缓冲中有多少字节数,可以几个字节一起读,缓冲即是b[];
    
      .read(byte b[],//int off ,int len);off偏移量,指定可以在b中哪里存存多少,可能b中前面一些数据会有用,所以避免将内存占了
    
      .skips(long l);//跳过部分不要了,已经读了,但是没有使用而已
    
      .available();//返回int,io流中总共可以读到多少数据byte
    
      .close();//关闭流,释放资源
    
      .mark(int);//标记读到位置,可能需要返回来重新读取
    
      .reset();//重置到mark的位置再往后面读
    
      .markSupported();//返回布尔值,能否使用mark方法,有些数据无法使用mark
    
    OutputStream(输出抽象类)

    这里提到一个概念buffer缓冲器,作一个比较(一个瓶子的数据倒入另一个瓶子,因为瓶口太小,为了方便使用漏斗,当一个瓶子数据倒完时,不一定都在另一个瓶子中,可能有些还在漏斗中,在路上,漏斗类似缓冲;)

      .write(int b);//int四个字节32位,一次写一个字节,低八位,高于八位会去掉(向输出流写入一个字节。要写入的字节是参数b的八个低位.b的24个高位将被忽略。)
    
      .write(byte[]b);//将b.length个字节从指定的byte数组写入此输出流.write(b)的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。
    
      .write(byte[]b,int offer,int len);//与输入流概念类似
    
      .flush();//冲刷,将路上的字节数据即缓冲器的东西直接冲入目标瓶子(直接冲到刷新此输出流并强制写出所有缓冲的输出字节)
    
      .close();//与输入流概念一致
    
    File文件类

    通过这个类生成的对象-->某个目录或者某个目录下文件信息的封装,并不是直接指向某个文件,路径名称怎么写取决于其操作系统的不同而不同。
    在这里还会有一个知识-->文件分隔符:Windows-->反斜杠,正斜杠也识别;Linux-->正斜杠,不识别反斜杠;所以我们一般使用正斜杠,在java中使用反斜杠需要使用两个反斜杠表示,因为其使转义字符的原因,但正斜杠只用写一个。pathname,路径名称;directory,目录;file,文件;

      File file=new File("");//里面可以直接传一个路径(pathname),也可以传一个父目录(parent)与一个子目录(child)或者文件,也可以传一个uri(抽象路径名);
      .canRead()//can..的各种方法,在windows中基本为true,linux中不,有权限码(可执行,可读,可写等);
      .creatNewFile();//返回值为布尔值,创建一个new文件;
      .creatTempFile();//返回值为布尔值,生成一个临时文件在系统的临时文件目录下;
      .delete();//返回值为布尔值,不能直接删除有文件或者文件夹的文件夹,若某文件的流还未关闭,也无法删除;
    
      相对路径:
      .等于(./)表示当前文件夹..表示上一层文件夹,/代表根目录
      相对于应用程序所运行的那个目录
      get。。Path();//获取各种路径;
      getName();//文件名称,文件夹名称;
      可以获取父文件(Parent)的名称再获取其绝对路径来使用;
      绝对路径:
      文件在总盘上的路径;
    
      .is..();//判断是不是路径,目录,文件是否隐藏等;
      .lastModified();//返回的毫秒数,最后修改时间可以使用new Date()包装方便查看;
      .length();//文件大小;
      .list();//返回一个数组,子文件列表;
      
      
      //文件过滤器(可以在这里面加判断,根据文件类型进行过滤,返回false则不放入ss中)
      File file=new File("");
      String[] ss=file.list(new FilenameFilter(){
          public boolean accept(File dir,String name){
          syso("name"+name);
          //return false;
          return name.endWith(.java);
          }
    
      });
      syso(ss.length);
    
      .mkdir();//创建当前目录;
      .mkdirs();//若父目录不存在,则会一起创建,一般用这个;
      .renameTo(File dest);//重新命名此抽象路径名表示的文件;
    
    FileInputStream
      File file= new File("");
      FileInputSteam fis=new FileInputStream(file);
      //while(true){
      //	int ch=fis.read();//一个一个字节读
      //	if(-1==ch){
      //	break;
      //}
      //syso((char)ch);
      //}
      byte[]buffer = new byte[1024];
      while(true){
      int length=fis.read(buffer);//读字节数组
      if(-1==length){
      break;
      }
      syso(new String(buffer,0,length));//可能为空,所以对有效字节进行拼接
      }
      fis.close();
    
    FileOutputStream
      File file= new File("");
      FileOutputSteam fos=new FileOutputStream(file,true);//后面加一个true表示追加模式,不加为覆盖模式,默认为覆盖模式,写入的数据会覆盖之前写的;
    
      fos.write(97);
      fos.write(10);
      fos.write(13);
      fos.write(98);
      fos.write("hello world
    ".getByes());
      fos.close();
    

    写数据时,可能会报thows FileNotFoundException,这个异常意思是下面两种情况
    1、当前文件存在,但是无法打开,或者不能写入;
    2、当前文件不存在,但是没办法创建;(而并不是找不到文件的异常;它是允许文件不存在,写的时候可以创建;)

    作业:实现文件夹的复制,文件夹下要有多个文件夹和文件;(使用递归)
    递归:两个条件-->自己调用自己,要有终止条件;
    一个简单的递归实现,阶乘
    f(x)=x*f(x-1);
    x==1 f(1)=1;

      public static int ff(int x){
          if(x==1){
           return 1;
          }
          return x*ff(x-1);
      }
    

    文件夹的复制,我找到了一篇文章十分清晰,"https://www.cnblogs.com/yuhudashen/p/7988831.html"他的代码注释十分明白,很容易看懂,思路是写了两方法一个是复制文件,一个是复制文件夹,在复制文件夹中判断文件夹里需要复制的是文件夹还是文件,再调用相应的方法,我这借用一下。我自己打了一遍:

    package task;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    
    
    public class CopyFile {
    
    	public static void main(String[] args) throws Exception {
    		copy("src", "src2");
    		System.out.println("复制完成");
    
    	}
    	public static void copy(String src,String des) throws Exception{
    		File file1=new File(src);
    		File[]fs=file1.listFiles();
    		File file2=new File(des);
    		if(!file2.exists()){
    			file2.mkdirs();
    		}
    		for(File f:fs){
    			if(f.isFile()){
    				fileCopy(f.getPath(), des+"\"+f.getName());
    			}else if(f.isDirectory()){
    				copy(f.getPath(), des+"\"+f.getName());//文件夹复制,递归调用自己
    			}
    		}
    	}
    	//文件复制
    	public static void fileCopy(String src,String des) throws Exception{
    		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
    		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(des));
    		int i=-1;
    		byte[] bt=new byte[2014];
    		while((i=bis.read(bt))!=-1){
    			bos.write(bt,0,i);
    		}
    		bis.close();
    		bos.close();
    	}
    }
    
  • 相关阅读:
    cgroup开机自启动
    QPS
    Linux shell脚本的字符串截取
    设计模式 java
    kafka基本介绍
    Vagrant安装配置
    SuperMap空间数据处理与制图操作短视频汇总
    SuperMap 三维产品资料一览表
    SuperMap GIS资料-----云与Web端技术资料集锦
    世界地图和主要国家的 JSON 文件
  • 原文地址:https://www.cnblogs.com/zzdbk/p/14203341.html
Copyright © 2011-2022 走看看