1、分类
1.1以读写内容的角度看可以分为:
- 字节流
- 字符流
字节流即以字节为单位进行读写操作,字符流即以字符为单位进行读写操作。
注:计算机中的内容都是以字节为单位存储的,包括文本文件也是由一个个字节组成,计算机在打开文本文件时都会指定一种编码,以解析文本文件的内容,比如常见的UTF-8编码。关于字符编码的知识大家可以看这篇博客(http://www.cnblogs.com/o-andy-o/archive/2012/04/11/2441937.html)。
1.2 以读写的方向可以分为
- 输入流
- 输出流
这里的输入输出是针对内存而言的,输入流指由其他输入源输入至内存,输出流则是由内存输出到外界。
2、File类
java中使用file类表示文件或者目录。我们使用File类创建文件和目录、删除文件和目录、打印文件夹子文件等操作。常用File类函数如下:
2.1 创建方法
- boolean createNewFile() true:文件不存在且创建成功 flase:文件以存在
- boolean mkdir() 创建目录,如果父目录不存在,则创建失败
- boolean mkdirs() 创建多级目录,如果父目录不存在也创建
2.2 删除方法
- boolean delete() 删除文件或文件夹
2.3 查询方法
- String getName() 得到文件名
- String getPath() 得到文件路径
- String getAbsolutePath() 得到文件绝对路径
- String getParent() 得到父文件对象
- File[] listFiles() 得到文件夹下的所有文件
2.4 判断方法
- boolean exists() 判断文件是否存在
- boolean isDirectory() 判断文件是否是文件夹
- boolean isFile() 判断文件是否是文件
注:File类仅用于表示文件或文件目录,不具有操作文件的功能。
3、常见字节流类
3.1 InputStream
所有字节输入流的基类,是一个抽象类,该类不能实例化。
3.2 OutputStream
所有字节输出流的基类,是一个抽象类,该类不能实例化。
3.3 FileInputStream
该类提供从文件中读取数据的功能,可以使用如下代码初始化。
try(InputStream inputStream=new FileInputStream("/Users/guest/test.txt")){
int len;
byte[]bs=new byte[1024];
while((len=inputStream.read(bs))!=-1){
System.out.println(new String(bs,0,len));
}
}
3.4 FileOutputStream
该类提供写入数据到磁盘文件的功能,可以使用如下代码初始化。
try (OutputStream outputStream = new FileOutputStream("/Users/guest/test.txt")) {
outputStream.write("hello world".getBytes());
outputStream.flush();
}
3.5 ByteArrayInputStream
该类可以接受一个字节数组,然后将该字节数组封装成一个字节输入流。
try(InputStream inputStream = new ByteArrayInputStream("hello world".getBytes())){
int len;
byte[] bs = new byte[1024];
while ((len = inputStream.read(bs)) != -1) {
System.out.println(new String(bs, 0, len));
}
}
3.6 ByteArrayOutputStream
该类可以将数据输出至一个字节数组
try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
byteArrayOutputStream.write("hello world".getBytes());
byte[] bs = byteArrayOutputStream.toByteArray();
System.out.println(new String(bs));
}
3.7 BufferedInputStream
该类的使用和普通InputStream一样,不过他在读取数据时会一次性读取多个字节的数据放在buf数组中。
try(InputStream inputStream = new BufferedInputStream(new FileInputStream("/Users/guest/test.txt"))){
int len;
byte[] bs = new byte[1024];
while ((len = inputStream.read(bs)) != -1) {
System.out.println(new String(bs, 0, len));
}
}
3.8 BufferedOutputStream
该类的使用和普通OutStream一样,不过他在写数据时会先将数据写入buf数组缓存中,等到缓冲区满时再一次性将缓冲区数据写入磁盘。
try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("/Users/hws/Desktop/test.txt"))) {
outputStream.write("hello world".getBytes());
outputStream.flush();
}
4、常见字符流
4.1Reader
所有字符输入流的基类,是一个抽象类,该类不能实例化。
4.2 Writer
所有字符输出流的基类,是一个抽象类,该类不能实例化。
4.3 FileReader
该类提供从文件中读取数据的功能,它内部是通过FileInputStream实现。
try (Reader reader = new FileReader("/Users/hws/Desktop/test.txt")) {
int len;
char[] chs = new char[1024];
while ((len = reader.read(chs)) != -1) {
System.out.println(new String(chs, 0, len));
}
}
4.4 FileWriter
该类提供写入数据到磁盘文件的功能,可以使用如下代码初始化。
try (Writer writer = new FileWriter("/Users/hws/Desktop/test.txt")) {
writer.write("hello world".toCharArray());
writer.flush();
}
4.5 CharArrayReader
该类可以接受一个字符数组,然后将该字符数组封装成一个字符输入流。
try(Reader reader = new CharArrayReader("hello world".toCharArray())){
int len;
char[] chs = new char[1024];
while ((len = reader.read(chs)) != -1) {
System.out.println(new String(chs, 0, len));
}
}
4.6 CharArrayWriter
该类可以将数据输出至一个字符数组
try(CharArrayWriter charArrayWriter = new CharArrayWriter()){
charArrayWriter.write("hello world".toCharArray());
char[] chs = charArrayWriter.toCharArray();
System.out.println(new String(chs));
}
4.7 BufferedReader
该类的使用和普通Reader一样,增加了一个readLine函数,可以一次性读取一行文本数据,它在读取数据时会一次性读取多个字符的数据放在cb字符数组中。
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("/Users/hws/Desktop/test.txt"),"UTF-8"))) {
String str;
while ((str = bufferedReader.readLine())!=null){
System.out.println(str);
}
}
4.8 BufferedWriter
该类的使用和普通Writer一样,不过他在写数据时会先将数据写入cb字符数组缓存中,等到缓冲区满时再一次性将缓冲区数据写入磁盘。
try (BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/Users/hws/Desktop/test.txt"),"UTF-8"))) {
bufferedWriter.write("hello world");
bufferedWriter.flush();
}
4.9 InputStreamReader
该类继承自Reader,它作为字节输入流到字符输入流转换的一个桥梁,构造函数接收一个InputStream对象,同时可以指定字节流转换成字符流过程中使用的字符编码。我们可以在此指定字符流的编码,它在内部读取流时会自动的帮我们将字节流转换成字符流。如下是以GBK读取磁盘中的文件。
try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("/Users/hws/Desktop/test.txt"),"GBK")) {
int len;
char[] chs = new char[1024];
while ((len = inputStreamReader.read(chs)) != -1) {
System.out.println(new String(chs, 0, len));
}
}
4.10 OutputStreamWriter
该类继承自Writer,它作为字节输出流到字符输出流转换的一个桥梁,构造函数接收一个OutputStream对象,同时可以指定字符输出转换成字节过程中使用的编码。我们可以在此指定字符流的编码,以GBK编码将数据保存至磁盘中。
try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("/Users/hws/Desktop/test.txt"),"GBK")) {
outputStreamWriter.write("hello world");
outputStreamWriter.flush();
}
5、管道输入输出流
管道输入输出流一般用于多个线程中数据的传递。有关代码可以在此查看:
https://github.com/linpeng123l/pipedstream