2020.10.20学习笔记

1 I/O

1.1 File类

1.1.1 构造方法

1.File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例。

File file=new File("D:\\a\\1.txt");

2.File(String parent,String child) 根据指定的父路径和文件名创建File对象

File file=new File("D:\\a","1.txt");

3.File(File parent,String child) 根据指定的父文件对象和文件名创建FIle对象

File parentFile=new File("D:\\a");
File file=new File(parentFile,"1.txt");

1.1.2 创建与删除

1.boolean createNewFile();指定目录不存在该文件时创建文件并返回true,否则返回false

		try {
			File file=new File("a.txt");
			System.out.println(file.createNewFile());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

tip:不使用绝对路径指定时,会在当前项目下创建该文件。

2.boolean mkdir() 当指定的单级文件夹不存在时创建文件夹并返回true,否则返回false

		File file2=new File("F://IOTest");
		System.out.println(file2.mkdir());

3.boolean mkdirs() 当指定的多级文件夹在某一级不存在时,创建多级文件夹并返回true,否则false

		File file3=new File("F://IOTest");
		System.out.println(file3.mkdirs()); //前面创建过了 false
		File file4=new File("F://IOTest//a//b");
		System.out.println(file4.mkdirs());// 前面没创建过 true

4.boolean delete() 删除文件或者单级文件夹,删除文件夹时下面不能用有其它的文件和文件夹

		File file3=new File("F://IOTest");
		System.out.println(file3.delete()); //还有子目录 false
		File file4=new File("F://IOTest//a//b");
		System.out.println(file4.delete());//无子目录子文件夹   true

1.1.3 判断

1.boolean exists() 判断指定路径的文件或文件夹是否为空

		File file3=new File("F://IOTest");
		System.out.println(file3.exists()); //存在 true
		File file4=new File("F://IOTest//a//b");
		System.out.println(file4.exists());//已删除  false

2.boolean isAbsolute() 判断当前路径是否是绝对路径

		File file=new File("a.txt");
		System.out.println(file.isAbsolute());// false

3.boolean isDirectory() 判断当前目录是否存在

		File file=new File("a.txt");
		System.out.println(file.isDirectory());//false
		
		File file2=new File("F://IOTest//a");
		System.out.println(file2.isDirectory());//true
		
		File file3=new File("F://IOTest//a//b");
		System.out.println(file3.isDirectory());//false

4.boolean isFile() 判断当前的目录是否一个文件

		File file=new File("a.txt");
		System.out.println(file.isFile());//true
		
		File file2=new File("F://IOTest//a");
		System.out.println(file2.isFile());//false
		
		File file3=new File("F://IOTest//a//b");
		System.out.println(file3.isFile());//false

tip:只会检测当前目录,子目录中的文件不检测。

1.1.4 获取和修改

1.File getAbsoluteFile() 获取文件的绝对路径,返回File对象。

		File file=new File("a.txt");
		File absoluteFile = file.getAbsoluteFile();

2.String getAbsolutePath() 获取文件的绝对路径,返回路径的字符串

		File file=new File("a.txt");
		System.out.println(file.getAbsolutePath());
		System.out.println(new File("").getAbsolutePath());

3.String getParent() 获取当前路径的父级路径,以字符串的形式返回该父级路径

		File file=new File("a.txt");
		System.out.println(file.getParent()); //null
		File file2=new File("F://IOTest//a");
		System.out.println(file2.getParent());//F:\IOTest

4.String getName() 获取文件或文件夹的名称

		File file=new File("a.txt");
		System.out.println(file.getName()); //a.txt
		File file2=new File("F://IOTest//a");
		System.out.println(file2.getName());//a

5.String getPath() 获取File对象中封装的路径

		File file=new File("a.txt");
		System.out.println(file.getPath()); //a.txt
		File file2=new File("F://IOTest//a");
		System.out.println(file2.getPath());//F:\IOTest\a

6.long lastModified() 以毫秒值返回最后修改时间

		File file=new File("a.txt");
		System.out.println(file.lastModified()); 

7.long length() 返回文件的字节数

		File file=new File("a.txt");
		System.out.println(file.length()); //
		File file2=new File("F://IOTest//a");
		System.out.println(file2.length());//0

tip:目录和空文件都会返回0

8.boolean renameTo(File dest) 将当前File对象所指向的路径修改为指定File所指向的路径

		File file=new File("F://IOTest//a//new.txt");
//		file.createNewFile();
		System.out.println(file.renameTo(new File("F://IOTest//new.txt")));

9.String[] list() 以字符串数组返回当前路径下所有的文件和文件夹的名称

		File file=new File("F://IOTest");
		String[] list = file.list();
		for(String s:list) {
			System.out.println(s);
		}

10.File[] listFiles() 以File对象的形式返回当前路径下所有文件和文件夹的名称

		File file=new File("F://IOTest");
		File[] listFiles = file.listFiles();
		for(File file2:listFiles) {
			System.out.println(file2);
		}

tip:listFiles输出结果包含路径,list输出结果仅包含名称

11.static File[] listRoots() 获取计算机中的所有盘符

		File[] listRoots = File.listRoots();
		for(File file:listRoots) {
			System.out.println(file);
		}

1.2 NIO

1.2.1 阻塞和同步

1.阻塞和非阻塞
阻塞和非阻塞是进程访问数据,数据未准备就绪时的处理方式,阻塞会停在那里一直等待直到数据准备好,非阻塞则直接返回。

2.同步和异步
同步:处理IO事件的时候,应用程序直接参与IO读写,阻塞在某个方法上等待IO事件完成。
异步:处理IO事件的时候,所有的IO读写交给操作系统去处理,应用程序可以去做别的事情,当IO完成后,操作系统会给程序一个通知。

1.2.2 NIO与IO的区别

IO是面向流的,NIO是面向缓冲区的,IO是阻塞的,NIO是非阻塞的。

1.2.3 NIO的三大核心部分

Channel(通道)、Buffer(缓冲区)、Selector。
Channel是双向的,既可以读也可以写。
Buffer是一个对象,它包含一些要写入或读出的数据。在NIO中,应用程序不能直接对Channel进行操作,而必须通过Buffer来进行。
Selector是一个对象,它可以接收多个Channel注册,监听各个Channel,并根据事件情况决定Channel读写。

1.2.4 Channel的主要类型

1.FileChannel:处理文件的
2.DatagramChannel:处理UDP网络的
3.SocketChannel:处理TCP网络的
4.ServerSocketChannel:处理TCP网络的

1.2.5 Buffer

1、Buffer的主要属性
capacity:缓冲区的容量,在缓冲区创建时被设定,永远不能改变。
limit:缓冲区的第一个不能被读或者写的元素的索引。
position:下一个要被读或者写的元素的索引。
mark:下一个要被读或写的元素的索引。

2.常见方法
filp():将写模式转换成读模式。
rewind():将position置为0,一遍用于重复度。
clear():清空缓冲区。
compact():清除已经读过的数据。
get():读取数据
put():写入数据

3.存取流程
存数据时position++,调用filp()时,limit=position,position=0,读取时position++

4.直接缓冲区和间接缓冲区
ByteBuffer.allocate(1024)创建间接缓冲区,间接缓冲区在堆中开辟,易于管理,垃圾回收器可以回收,空间有限,读取速度较慢。

ByteBuffer.allocateDirect(1024)创建直接缓冲区,直接缓冲区在物理内存中开辟空间,读写快,但是不受垃圾回收器控制,创建和销毁耗性能。

1.2.6 使用NIO读取数据

public class FileInputProgram {  
    static public void main( String args[] ) throws Exception {  
        FileInputStream fin = new FileInputStream("c:\\test.txt");  
        
        // 获取通道  
        FileChannel fc = fin.getChannel();  
          
        // 创建缓冲区  
        ByteBuffer buffer = ByteBuffer.allocate(1024);  
          
        // 读取数据到缓冲区  
        fc.read(buffer);  
        
        buffer.flip();  
          
        while (buffer.remaining() > 0) {  
            byte b = buffer.get();  
            System.out.print(((char)b));  
        }  
          
        fin.close();
    }  
}

1.2.7 使用NIO写入数据

public class FileOutputProgram {  
    static private final byte message[] = { 83, 111, 109, 101, 32,  
        98, 121, 116, 101, 115, 46 };  
  
    static public void main( String args[] ) throws Exception {  
        FileOutputStream fout = new FileOutputStream( "e:\\test.txt" );  
          
        FileChannel fc = fout.getChannel();  
          
        ByteBuffer buffer = ByteBuffer.allocate( 1024 );  
          
        for (int i=0; i<message.length; ++i) {  
            buffer.put( message[i] );  
        }  
          
        buffer.flip();   
          
        fc.write( buffer );  
          
        fout.close();  
    }  
}

参考连接

1.java中File类方法详解
2.NIO中Buffer的各种方法详解及其作用
3.NIO原理详解
4.JAVA NIO详解
5.Java NIO?看这一篇就够了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值