JAVA I/O(输入/输出)
1.File类
file类是java.io包下作为文件和目录的类。主要是在java中要对文件进行操作时可以使用该类进行操作。可以对文件和目录进行新建、删除、和重命名等。但不能对文件进行读写操作。操作文件内容需要使用I/O流。
1.1 常用方法
# | 方法 | 描述 | 类型 |
---|---|---|---|
1 | exists() | 判断file对象指定文件是否存在 | boolean |
2 | isDirectory() | 判断file对象指定文件是否为目录 | boolean |
3 | isFile() | 判断file对象指定文件是否为标准文件 | boolean |
4 | getName() | 获取文件的名字 | String |
5 | length() | 得到file对象指定文件的长度(在系统中,文件夹、目录的大小为0,不占用空间) | long |
6 | mkdir() | 根据file对象的名字(路径)创建一个文件夹,如果是相对路径则新建的目录在当前目录下 | boolean |
7 | mkdirs() | 可以用该方法一次性创建有多级目录的文件名 | boolean |
8 | createNewFile() | 创建标准文件的方法 | boolean |
9 | getCanonicalPath() | 返回此抽象路径的规范字符串 | String |
10 | list() | 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录 | String[ ] |
11 | list(FilenameFilter filter) | 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录 | Stirng[ ] |
12 | listFiles() | 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 | File[ ] |
13 | listFiles(FileFilter filter) | 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录 | file[ ] |
14 | listFile(FilenameFilter filter) | 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录 | file[ ] |
1.2 Demo
public class FileTest {
public static void main(String[] args) throws IOException {
File file = new File(".");
//打印输出文件名
System.out.println(file.getName());
//获取文件路径
System.out.println(file.getCanonicalPath());
//在当前目录下创建文件夹newfile
File dir = new File(file,"newfiles");
//如果文件夹不存在则创建
if(!dir.exists()) { dir.mkdir();}
//在newfile目录下创建test.txt
File test = new File(dir,"test1.txt");
//如果test.txt不存在则创建
if(!test.exists()) { test.createNewFile();}
//获取dir文件夹下的所有文件
File[ ] files = dir.listFiles();
//显示dir文件夹下所有文件的名字
System.out.println("------------------");
System.out.println(Arrays.toString(files));
//显示test的绝对路径
System.out.println(test.getCanonicalPath());
//文件是否隐藏
System.out.println(dir.isHidden());
File test_j = new File(dir,"test2.java");
if(!test_j.exists()) test_j.createNewFile();
System.out.println("------------------");
System.out.println(test_j.getCanonicalPath());
File[] files2 = dir.listFiles(new myFilter());
//显示符合条件的文件名字
System.out.println("------------------");
for(File f:files2) {
System.out.println(f.getName());
}
}
}
class myFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
//以 .java 为后缀的文件名
return pathname.getName().endsWith(".java") && pathname.isFile();
}
}
结果:
2.RandomAccessFile类
该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 写入隐式数组的当前端的输出操作会导致扩展数组。 文件指针可以通过读取getFilePointer方法和由设置seek方法。
2.1 构造方法
RandomAccessFile类有两个构造器,两个构造器基本相同,知识指定文件的形式不同。File参数指定文件本身,String参数指定文件名,mode参数则指定访问模式。
具体如下:
构造方法 | 描述 |
---|---|
RandomAccessFile(File file,String mode) | 创建一个随机访问文件流从File参数指定的文件中读取, 并可选地写入文件 |
RandomAccessFile(String name,String mode) | 创建随机访问文件流,以从中指定名称的文件读取, 并可选择写入文件 |
# | mode | 描述 |
---|---|---|
1 | “r” | 以只读的形式打开文件 |
2 | “rw” | 以读写的形式打开文件,如果文件尚不存在,则尝试创建该文件 |
3 | “rws” | 以读写的形式打开文件,相对于"rw"模式, 还要求对文件内容的每个更新都同步写入到底层存储设备 |
4 | “rwd” | 以读写的形式打开文件,相对于"rw"模式, 还要求对文件内容的每个更新都同步写入磁盘 |
2.2 常用方法
# | 方法名 | 描述 | 类型 |
---|---|---|---|
1 | getFilePointer() | 返回文件记录指针的当前位置 | long |
2 | seek(long pos) | 将文件记录指针指定到pos位置 | void |
3 | read() | 从输入流中读取单个字节 | int |
4 | read(byte[ ] b) | 从输入流中最多读取b.length个字节, 并将其存储在字节数组b中 | int |
5 | read(byte[ ] ,int off,int len) | 从输入流中读取len个字节存储到 数组b中,从off位置开始读取 | int |
6 | write(int c) | 将指定的字节或字符输出到输出流中 | void |
7 | write(byte[ ]/char[ ] buf) | jaing1字节数组或者字符数组输出到指定的输出流中 | void |
2.3 Demo
public class RandomAccessFileTest {
public static void read(){
try {
RandomAccessFile rf = new RandomAccessFile("newfiles\\test1.txt", "rw");
//输出指针默认位置
System.out.println("指针位置:"+rf.getFilePointer());
rf.write('A');
//写入GBK编码的字符
String s = "你好!";
byte[] gb = s.getBytes("gbk");
rf.write(gb);
rf.write('B');
//输出指针位置
System.out.println("指针位置:"+rf.getFilePointer());
//移动指针到头
rf.seek(0);
System.out.println("指针位置:"+rf.getFilePointer());
//一次性读取内容到 read_rf,尽可能填满
byte[] read_rf =new byte[(int) rf.length()];
rf.read(read_rf);
System.out.println(Arrays.toString(read_rf));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
read();
}
}
输出:
3JAVA I/O流
IO是指对数据流的输入和输出,也称为IO流,IO流主要分为两大类,字节流和字符流。字节流可以处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据。
IO流的本质是数据传输,并且流是单向的。
IO分阻塞型IO和非阻塞型IO(NIO)
阻塞型IO在读取数据时,如果数据未到达,会一直阻塞到读取到数据为止,所以称为阻塞型IO,在高并发的环境下性能不佳。
NIO不是使用 “流” 来作为数据的传输方式,而是使用通道,通道的数据传输是双向的,且NIO的数据写入和读取都是异步的,不会阻塞线程,所以称为非阻塞型IO,在高并发的环境下性能很好。
流类结构图
流的分类
按照不同的分类方式,可以将流分为不同的类型
- 输入流和输出流
. 输入流:只能从文件读取数据
. 输出流:只能向文件写入数据 - 字节流和字符流
. 字节流:操作的数据单元为8位的字节
. 字符流:操作的数据单元为16位的字符 - 节点流和包装流
. 向特定的I/O设备(如磁盘,网络)读写数据的流
. 用于对一个已经勋在的流进行封装或连接,通过封装后的流来实现数据的读写功能
————————————————————————
这位博主讲得挺详细 》》点点点