一 、File类
在文章开始之前,我们首先应当了解一下什么是IO,直白来讲,IO即是Input和Output,即输入输出机制。
接下来对文件进行一下大致的说明:
文件可分为文本文件和二进制文件,其中,文本文件由字符序列(ASCII/Unicode)构成,而二进制文件由位序列构成.
因此二者间最大区别即是二进制IO不涉及编码和解码,所以 从效率上来说二进制IO比文本IO效率更高。
说完了区别,我们再将目光转回IO,IO(输入/输出)是程序必须的一部分,程序读取外部的数据(来自磁盘,键盘等数据)使用输入机制;程序写入数据到外部的设备使用输出机制
在Java中使用IO主要是通过java.io这个包下的类和接口,事实上IO是我们需要达到的一个目的,而为了达到这个机制,我们需要另一个机制,称之为流或者数据流。这方面的内容留到第二部分再讲。
我们回到File类,在File类中,我们能够新建、删除、重命名文件/目录,但它只对文件表面进行操作,若要对文件内容进行访问,需要读取和写入,即需要使用到输入输出,即需要用流来达到这个目的。
File类中常用的方法:
- boolean exists()
- boolean isFile()
- boolean isDirectory()
- boolean isHidden()
- boolean delete()
- boolean createNewFile()
- file.mkdir()
- file.getName()
- file.getAbsoultePath()
- file.list()
- 代码实现:
*
#`public class TestDemo1 {
public static void main(String[] args) {
//1、创建两个文件,分别使用相对路径和绝对路径
File file1 = new File("./a.txt");//给定相对路径
File file2 = new File("/Users/lvting/tulun/code/gongye1324/b.txt");//给定绝对路径
//2、检查文件是否存在,不存在则创建该文件
if(!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if(!file2.exists()){
try {
file2.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//3、单级文件夹
File file3 = new File("./bbb");
file3.mkdir();
//4、多级文件夹
File file4 = new File("./aaa/ccc/ddd");
file4.mkdirs();
//5、删除文件和文件夹
file1.delete();
file2.delete();
file3.delete();
file4.delete();//不能删除多级文件夹 ???
//6、获取文件信息,包括文件名、文件大小、文件的绝对路径
File file = new File("./test.txt");
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(file.getName());
System.out.println(file.length());
System.out.println(file.getAbsolutePath());
//7、如何判断一个文件对象是文件还是文件夹
if(file.isFile()){
System.out.println("它是文件");
}else{
System.out.println("它是文件夹");
}
//8、获取一个目录下的所有文件名
File f = new File("/Users/lvting/tulun/code/gongye1324/src/com/sehigh/");
String[] strs = f.list();
for(String s: strs){
System.out.print(s + " ");
}
System.out.println();
}
}
二、数据流
流的概念:
IO流指的是一组有顺序的,有起点终点的字节数据的集合,是对数据传输的抽象,
流的分类:
1)按照流向:输入流和输出流(InputStream、Reader/OutputStream、witer)
2)按照传输的类型:字符流和字节流 字符流处理字符,字节流指的是以字节为单位读取8bit,对于字节流来说,可以处理任意类型的数据.
3)节点流和处理流:节点流是程序直接连接到实际的数据源,处理流指的是对已存在的进行连接和封装,通过封装后的流实现数据的读写功能。
字符流和字符流的区别“
1)读写单位不同:字节流以字节为单位、字符流以字符为单位,根据码表映射字符,一次可能读取多个字节
2)处理对象不同:字节流能够处理任意类型的数据,字符流只能纯文本的文件
3)处理效率不同:字节流效率更高,因为可以直接进行操作,而字符流由于涉及到编码解码过程因此比字节流效率要低。
4)可移植性不同:字节流可移植性更高,和平台无关,而字符流需要考虑到平台编码表对于编码和解码过程的影响。
关于字符集编码的代码实现:
public class TestDemo3 {
public static void main(String[] args) {
//得到系统默认的编码格式
Charset charset = Charset.defaultCharset();
System.out.println(charset);
//当前系统支持的所有的编码方式
SortedMap<String, Charset> sortedMap = Charset.availableCharsets();
Iterator<Map.Entry<String, Charset>> itr = sortedMap.entrySet().iterator();
while(itr.hasNext()){
Map.Entry<String, Charset> next = itr.next();
System.out.println(next.getKey()+ ": "+next.getValue());
}
}
}