Java IO (下)
File
Java IO API中的FIle类可以让你访问底层文件系统,通过File类,你可以做到以下几点:
- 检测文件是否存在
- 读取文件长度
- 重命名或移动文件
- 删除文件
- 检测某个路径是文件还是目录
- 读取目录中的文件列表
1 @Test
2 public void fileTest () throws IOException{
3 //实例化一个java.io.File对象
4 File file = new File("d:\\fileTest.txt");
5 //检测文件是否存在
6 if (file.exists()) {
7 //文件长度
8 System.out.println(file.length());
9 }
10 //重命名或移动文件
11 boolean flag=file.renameTo(new File("d:\\fileTest3.txt"));
12 if (flag) {
13 //删除文件
14 System.out.println(file.delete());
15 }
16
17 File file2 = new File("d:\\file");
18 //可以通过调用isDirectory()方法,可以判断当前File对象指向的是文件还是目录。
19 //当方法返回值是true时,File指向的是目录,否则指向的是文件
20 boolean isDirectory = file2.isDirectory();
21 if (isDirectory) {
22 //list()方法返回当前File对象指向的目录中所有文件与子目录的字符串名称
23 String[] fileNames = file.list();
24 for (int i = 0; i < fileNames.length; i++) {
25 System.out.println(fileNames[i]);
26 }
27 }
28 }
BufferedInputStream
BufferedInputStream能为输入流提供缓冲区,能提高很多IO的速度。你可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节。特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多。
BufferedOutputStream
与BufferedInputStream类似,BufferedOutputStream可以为输出流提供缓冲区。可以构造一个使用默认大小缓冲区的BufferedOutputStream
@Test
public void bufferedInputStream () throws IOException{
InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"));
//给构造函数传递一个值,设置内部使用的缓冲区设置大小(默认缓冲区大小8 * 1024B)
InputStream input2 = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"),8*1024);
//除了能够为输入流提供缓冲区以外,其余方面BufferedInputStream基本与InputStream类似
}
DataInputStream
DataInputStream可以使你从输入流中读取Java基本类型数据,而不必每次读取字节数据。你可以把InputStream包装到DataInputStream中,然后就可以从此输入流中读取基本类型数据了
@Test
public void dataInputStream () throws IOException{
DataInputStream input = new DataInputStream(new FileInputStream("binary.data"));
int aByte = input.read();
int anInt = input.readInt();
float aFloat = input.readFloat();
double aDouble = input.readDouble();
input.close();
}
当你要读取的数据中包含了int,long,float,double这样的基本类型变量时,DataInputStream可以很方便地处理这些数据。
DataOutputStream
DataOutputStream可以往输出流中写入Java基本类型数据
@Test
public void dataInputStream() throws IOException {
DataOutputStream output = new DataOutputStream(new FileOutputStream(
"binary.data"));
output.write(45);
// byte data
output.writeInt(4545);
// int data
output.writeDouble(109.123);
// double data
output.close();
}
Reader
Reader是Java IO中所有Reader的基类。Reader与InputStream类似,不同点在于,Reader基于字符而非基于字节。
换句话说,Reader用于读取文本,而InputStream用于读取原始字节。
Writer
Writer是Java IO中所有Writer的基类。与Reader和InputStream的关系类似,Writer基于字符而非基于字节,Writer用于写入文本,OutputStream用于写入字节。
同样,你最好使用Writer的子类,不需要直接使用Writer,因为子类的实现更加明确,更能表现你的意图。常用子类包括OutputStreamWriter,CharArrayWriter,FileWriter等。
IO中的类要么以Stream结尾,要么以Reader或者Writer结尾,那这两个同时以字节流和字符流的类名后缀结尾的类是什么用途呢?
简单来说,这两个类把字节流转换成字符流,中间做了数据的转换,类似适配器模式的思想。
InputStreamReaderInputStreamReader会包含一个InputStream,从而可以将该输入字节流转换成字符流
@Test
public void inputStreamReader() throws IOException {
InputStream inputStream = new FileInputStream("c:\\data\\input.txt");
Reader reader = new InputStreamReader(inputStream);
int data = reader.read();
while(data != -1){
char theChar = (char) data;
data = reader.read();
}
reader.close();
}
OutputStreamWriter
OutputStreamWriter会包含一个OutputStream,从而可以将该输出字节流转换成字符流
@Test
public void outputStreamWriter() throws IOException {
OutputStream outputStream = new FileOutputStream("c:\\data\\output.txt");
Writer writer = new OutputStreamWriter(outputStream);
writer.write("Hello World");
writer.close();
}
FileReader
FileReader能够以字符流的形式读取文件内容。除了读取的单位不同之外(译者注:FileReader读取字符,FileInputStream读取字节),FileReader与FileInputStream并无太大差异,
也就是说,FileReader用于读取文本。根据不同的编码方案,一个字符可能会相当于一个或者多个字节。
@Test
public void fileReader() throws IOException {
Reader reader = new FileReader("c:\\data\\input-text.txt");
int data = reader.read();
while(data != -1) {
//do something with data...
data = reader.read();
}
reader.close();
}
FileReader会假设你想使用你所使用的JVM的版本的默认编码处理字节流,但是这通常不是你想要的,你可以手动设置编码方案。
如果你想明确指定一种编码方案,利用InputStreamReader配合FileInputStream来替代FileReader(译者注:FileReader没有可以指定编码的构造函数)。
InputStreamReader可以让你设置编码处理从底层文件中读取的字节。
FileWriter
FileWriter能够把数据以字符流的形式写入文件。同样是处理文件,FileWriter处理字符,FileOutputStream处理字节。根据不同的编码方案,一个字符可能会相当于一个或者多个字节
BufferedReader
BufferedReader能为字符输入流提供缓冲区,可以提高许多IO处理的速度。你可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节。特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多。
BufferedReader和BufferedInputStream的主要区别在于,BufferedReader操作字符,而BufferedInputStream操作原始字节。只需要把Reader包装到BufferedReader中,就可以为Reader添加缓冲区(译者注:默认缓冲区大小为8192字节,即8KB)。代码如下:
@Test
public void bufferedReader() throws IOException {
//把Reader包装到BufferedReader中,就可以为Reader添加缓冲区
Reader input1 = new BufferedReader(new FileReader("c:\\data\\input-file.txt"));
//指定缓冲区大小
Reader input2 = new BufferedReader(new FileReader("c:\\data\\input-file.txt"), 8 * 1024);
//指定编码
Reader input3 = new BufferedReader(new InputStreamReader(new FileInputStream(""), "gbk"));
}
BufferedWriter
与BufferedReader类似,BufferedWriter可以为输出流提供缓冲区。可以构造一个使用默认大小缓冲区的BufferedWriter(译者注:默认缓冲区大小8 * 1024B),代码如下:
@Test
public void bufferedWriter() throws IOException {
Writer writer1 = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"));
Writer writer2 = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"), 8 * 1024);
}