基本概念
在学习Java IO之前应该先了解一些基本概念。
流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输的特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的分类
根据处理数据的类型的不同分为:字符流和字节流。
根据数据流向不同分为:输入流输出流。
字符流和字节流
字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
字节流和字符流的区别:
(1) 读取单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读取多个字节。
(2) 处理对象不同:字节流能处理所有类型的数据(如图片、视频等),而字符流只能处理字符类型的数据。
(3) 字节流在操作的时候本身是不会用到缓冲区的,是对文件本身直接操作的;而字符流在操作的时候会用到缓冲区,是通过缓冲区操作文件。
结论:优先使用字节流。因为硬盘上所有的文件都是以字节的形式进行传输或者保存的,包括图片等内容。
输入流和输出流
以程序为中心,读入数据的流称为输入流,输入流只能进行读操作;写出数据的流称为输出流,输出流只能进行写操作。
装饰流和实体流
在Java IO流中除了可以按流向划分为输入流和输出流两类,按读写数据的基本单位划分为字节流和字符流以外,还可以按照流是否直接连接实际数据源,将流又可以划分为实体流和装饰流两大类。
实体流:实体流直接实现将数据源转换为流对象,在实体流类中实现了流和数据源之间的转换,实体流类均可单独进行使用。
装饰流:装饰流指不直接连接数据源,而是以其它流对象(实体流对象或装饰流对象)为基础建立的流类。该类流实现了将实体流中的数据进行转换,增强流对象的读写能力。装饰流不可以单独使用,必须配合实体流火装饰流进行使用。
Java流类图结构
对Java IO的类图结构有个清晰的了解有利于我们更好的学习。
Java IO 类
1. File
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);
}
}
2. InputStream
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();
}
}
3. OutputStream
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();
}
}
4. Reader
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();
}
}
5. Writer
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();
}
}
java.io 的分层结构
- java.lang.Object
- java.io.Console (implements java.io.Flushable)
- java.io.File (implements java.lang.Comparable<T>, java.io.Serializable)
- java.io.FileDescriptor
- java.io.InputStream (implements java.io.Closeable)
- java.io.ByteArrayInputStream
- java.io.FileInputStream
- java.io.FilterInputStream
- java.io.BufferedInputStream
- java.io.DataInputStream (implements java.io.DataInput)
- java.io.LineNumberInputStream
- java.io.PushbackInputStream
- java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants)
- java.io.PipedInputStream
- java.io.SequenceInputStream
- java.io.StringBufferInputStream
- java.io.ObjectInputStream.GetField
- java.io.ObjectOutputStream.PutField
- java.io.ObjectStreamClass (implements java.io.Serializable)
- java.io.ObjectStreamField (implements java.lang.Comparable<T>)
- java.io.OutputStream (implements java.io.Closeable, java.io.Flushable)
- java.io.ByteArrayOutputStream
- java.io.FileOutputStream
- java.io.FilterOutputStream
- java.io.BufferedOutputStream
- java.io.DataOutputStream (implements java.io.DataOutput)
- java.io.PrintStream (implements java.lang.Appendable, java.io.Closeable)
- java.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants)
- java.io.PipedOutputStream
- java.security.Permission (implements java.security.Guard, java.io.Serializable)
- java.security.BasicPermission (implements java.io.Serializable)
- java.io.SerializablePermission
- java.io.FilePermission (implements java.io.Serializable)
- java.security.BasicPermission (implements java.io.Serializable)
- java.io.RandomAccessFile (implements java.io.Closeable, java.io.DataInput, java.io.DataOutput)
- java.io.Reader (implements java.io.Closeable, java.lang.Readable)
- java.io.BufferedReader
- java.io.LineNumberReader
- java.io.CharArrayReader
- java.io.FilterReader
- java.io.PushbackReader
- java.io.InputStreamReader
- java.io.FileReader
- java.io.PipedReader
- java.io.StringReader
- java.io.BufferedReader
- java.io.StreamTokenizer
- java.lang.Throwable (implements java.io.Serializable)
- java.lang.Error
- java.io.IOError
- java.lang.Exception
- java.io.IOException
- java.lang.Error
- java.io.CharConversionException
- java.io.EOFException
- java.io.FileNotFoundException
- java.io.InterruptedIOException
- java.io.ObjectStreamException
- java.io.InvalidClassException
- java.io.InvalidObjectException
- java.io.NotActiveException
- java.io.NotSerializableException
- java.io.OptionalDataException
- java.io.StreamCorruptedException
- java.io.WriteAbortedException
- java.io.SyncFailedException
- java.io.UnsupportedEncodingException
- java.io.UTFDataFormatException
- java.io.Writer (implements java.lang.Appendable, java.io.Closeable, java.io.Flushable)
- java.io.BufferedWriter
- java.io.CharArrayWriter
- java.io.FilterWriter
- java.io.OutputStreamWriter
- java.io.FileWriter
- java.io.PipedWriter
- java.io.PrintWriter
- java.io.StringWriter