java.io,io流,2020.12.28

2021-03-08 08:32

阅读:689

标签:执行   缓冲   缓冲器   实现   linu   aio   字符   思路   临时   

每日心得

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

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\n".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();
	}
}

java.io,io流,2020.12.28

标签:执行   缓冲   缓冲器   实现   linu   aio   字符   思路   临时   

原文地址:https://www.cnblogs.com/zzdbk/p/14203341.html


评论


亲,登录后才可以留言!