在学习Java IO之前应该先了解一些基本概念。
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输的特性将流抽象为各种类,方便更直观的进行数据操作。
根据处理数据的类型的不同分为:字符流和字节流。
根据数据流向不同分为:输入流输出流。
字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
字节流和字符流的区别:
(1) 读取单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读取多个字节。
(2) 处理对象不同:字节流能处理所有类型的数据(如图片、视频等),而字符流只能处理字符类型的数据。
(3) 字节流在操作的时候本身是不会用到缓冲区的,是对文件本身直接操作的;而字符流在操作的时候会用到缓冲区,是通过缓冲区操作文件。
结论:优先使用字节流。因为硬盘上所有的文件都是以字节的形式进行传输或者保存的,包括图片等内容。
以程序为中心,读入数据的流称为输入流,输入流只能进行读操作;写出数据的流称为输出流,输出流只能进行写操作。
在Java IO流中除了可以按流向划分为输入流和输出流两类,按读写数据的基本单位划分为字节流和字符流以外,还可以按照流是否直接连接实际数据源,将流又可以划分为实体流和装饰流两大类。
实体流:实体流直接实现将数据源转换为流对象,在实体流类中实现了流和数据源之间的转换,实体流类均可单独进行使用。
装饰流:装饰流指不直接连接数据源,而是以其它流对象(实体流对象或装饰流对象)为基础建立的流类。该类流实现了将实体流中的数据进行转换,增强流对象的读写能力。装饰流不可以单独使用,必须配合实体流火装饰流进行使用。
对Java IO的类图结构有个清晰的了解有利于我们更好的学习。
File类以路径的形式表示文件或目录,表示的文件或目录可以不存在。File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否刻度、获取当前文件的路径名,判断指定的文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。File类以路径的形式表示文件或目录,表示的文件或目录可以不存在。
File类中静态字段
|
pathSeparator |
|
pathSeparatorChar |
|
separator |
|
separatorChar |
pathSeparator、pathSeparatorChar和separator、separatorChar的区别,前者是多个路径的分隔符,后者是同一个路径的分隔符。例如在windows系统中前者表示“;”,后者表示“\”
File类中常用方法
创建 |
createNewFile() |
在指定位置创建一个空文件,成功返回ture,如果已存在就不创建然后返回false |
|
mkdir() |
在指定位置创建目录,只会创建最后一级目录,如果上机目录不存在则抛出异常 |
||
mkdirs() |
在指定位置创建目录,会创建路径中所有不存在的目录 |
||
renameTo(File dest) |
重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。移动/重命名成功则返回true,失败则返回false。 |
||
删除 |
delete() |
删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。 |
|
deleteOnExit() |
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除 |
||
判断 |
exists() |
文件或文件夹是否存在。 |
|
isFile() |
是否是一个文件,如果不存在,则始终为false。 |
||
isDirectory() |
是否是一个目录,如果不存在,则始终为false。 |
||
isHidden() |
是否是一个隐藏的文件或是否是隐藏的目录。 |
||
isAbsolute() |
测试此抽象路径名是否为绝对路径名。 |
||
获取 |
文件相关 |
getName() |
获取文件或文件夹的名称,不包含上级路径。 |
getPath() |
返回绝对路径,可以是相对路径,但是目录要指定 |
||
getAbsolutePath() |
获取文件的绝对路径,与文件是否存在没关系 |
||
length() |
获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。 |
||
getParent() |
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。 |
||
lastModified() |
获取最后一次被修改的时间 |
||
文件夹相关 |
listRoots() |
列出所有的根目录(Window中就是所有系统的盘符) |
|
list() |
返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。 |
||
list(FilenameFilter filter) |
返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。 |
||
listFiles() |
返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。 |
||
listFiles(FilenameFilter filter) |
返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。 |
创建文件
import java.io.File;
import java.io.IOException;
public class Demo1{
public static void main(String []args) throws IOException{
File file = new File("F:\\abc.txt");
boolean flag = file.createNewFile();
System.out.println("创建文件成功吗? "+flag);
}
}
删除文件
import java.io.File;
import java.io.IOException;
public class Demo1{
public static void main(String []args) throws IOException{
File file = new File("F:\\abc.txt");
boolean flag = file.delete();
System.out.println("删除文件成功吗? "+flag);
}
}
InputStream子类:
ByteArrayInputStream |
三种基本的介质流,它们分别从Byte数组、StringBuffer和本地文件中读取数据 |
StringBufferInputStream |
|
FileInputStream |
|
PipedInputStream |
从其它线程共用的管道中读取数据。 |
ObjectInputStream |
ObjectInputStrea和所有FilterInputStream子类都是装饰流。 |
FilterInputStream |
|
SequenceInputStream |
表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 |
InputStream常用方法
read() |
从输入流中读取数据的下一个字节。 |
read(byte[] b) |
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 |
read(byte[] b, int off, int len) |
将输入流中最多 len 个数据字节读入 byte 数组。 |
FileInputStream读取文件内容
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo1{
public static void main(String []args) throws IOException{
File file = new File("F:\\abc.txt");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] b = new byte[1024];
fileInputStream.read(b);
System.out.println(new String(b));
fileInputStream.close();
}
}
OutputStream子类
ByteArrayOutputStream |
两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。 |
FileOutputStream |
|
PipedOutputStream |
向与其它线程共用的管道中写入数据 |
ObjectOutputStream |
ObjectOutputStrm和所有FilterOutputStream的子类都是装饰流 |
FilterOutputStream |
常用方法
close() |
关闭此输出流并释放与此流有关的所有系统资源。 |
flush() |
刷新此输出流并强制写出所有缓冲的输出字节。 |
write(byte[] b) |
将 b.length 个字节从指定的 byte 数组写入此输出流。 |
write(byte[] b, int off, int len) |
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 |
write(int b) |
将指定的字节写入此输出流 |
FileOutputStream写文件
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1{
public static void main(String[] args) throws IOException{
File file = new File("F:\\abc.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
String str = "hello world!";
fileOutputStream.write(str.getBytes());
fileOutputStream.close();
}
}
Reader子类
CharReader |
两种基本的介质流,它们分别将Char 数组、String中读取数据。 |
StringReader |
|
BufferedReader |
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 |
FilterReader |
用于读取已过滤的字符流的抽象类。其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。 |
PipedReader |
从与其它线程共用的管道中读取数据。 |
InputStreamReader |
是一个连接字节流和字符流的桥梁. 它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 |
常用方法
close() |
关闭该流并释放与之关联的所有资源。 |
read() |
读取单个字符。 |
read(char[] cbuf) |
将字符读入数组。 |
read(char[] cbuf, int off, int len) |
将字符读入数组的某一部分。 |
read(CharBuffer target) |
试图将字符读入指定的字符缓冲区。 |
FileReader读取文件
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Demo1{
public static void main(String[] args) throws IOException{
File file = new File("F:\\abc.txt");
FileReader fileReader = new FileReader(file);
char[] ch = new char[1024];
int length;
while((length = fileReader.read(ch)) != -1){
System.out.println(new String(ch));
}
FileReader.close();
}
}
Writer子类
CharArrayWriter |
两种基本的介质流,它们分别向Char 数组、String 中写入数据。 |
StringWriter |
|
PipedWrite |
是向与其它线程共用的管道中写入数据。 |
BufferedWriter |
是一个装饰器为Writer 提供缓冲功能 |
OutputStreamWriter |
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 |
FilterWriter |
用于写入已过滤的字符流的抽象类 |
PrintWriter |
向文本输出流打印对象的格式化表示形式 |
常用方法
append(char c) |
将指定字符添加到此 writer。 |
append(CharSequence csq) |
将指定字符序列添加到此 writer。 |
append(CharSequence csq, int start, int end) |
将指定字符序列的子序列添加到此 writer.Appendable。 |
close() |
关闭此流,但要先刷新它。 |
write(char[] cbuf) |
写入字符数组。 |
write(char[] cbuf, int off, int len) |
写入字符数组的某一部分。 |
write(String str) |
写入字符串。 |
write(String str, int off, int len) |
写入字符串的某一部分。 |
FileWriter写入文件
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Demo1{
public static void main(String[] args) throws IOException {
File file = new File("F:\\abc.txt");
FileWriter writer = new FileWriter(file);
String str = "hello java!";
writer.write(str);
writer.close();
}
}