2020.10.20学习笔记

it2024-03-21  74

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)