这篇文章主要介绍了java进阶教程之io基础,这里只是对java io的基本介绍,包含读取和写入等操作,需要的朋友可以参考下
计算机最重要的功能是处理数据。一个有用的计算机语言需要拥有良好的io功能,以便让未处理的数据流入程序,让已处理的数据流出。
与其他语言相比,java的io功能显得复杂。在其他语言中,许多io功能(比如读取文件),是被封装好的,可以用一两行程序实现。在java中,程序员往往需要多个层次的装饰(decoration),才能实现文件读取。
相对的复杂性带来的好处是io的灵活性。在java中,程序员可以控制io的整个流程,从而设计出最好的io方式。我们将在下文看到更多。
io示例
下面是我用于演示的文件file.txt
hello world!
hello nerd!
我们先来研究一个文件读取的例子:
import java.io.*;
public class test
{
public static void main(string[] args)
{
try {
bufferedreader br =
new bufferedreader(new filereader("file.txt"));
string line = br.readline();
while (line != null) {
system.out.println(line);
line = br.readline();
}
br.close();
}
catch(ioexception e) {
system.out.println("io problem");
}
}
}
这段程序中包含一个try...catch...finally的异常处理器。可参考java进阶教程之 异常处理
装饰器与功能组合
程序io的关键在于创建bufferedreader对象br:
bufferedreader br = new bufferedreader(new filereader("file.txt"));
在创建的过程中,我们先建立了一个filereader对象,这个对象的功能是从文件"file.txt"中读取字节(byte)流,并转换为文本流。在java中,标准的文本编码方式为unicode。bufferedreader()接收该filereader对象,并拓展filereader的功能,新建出一个bufferedreader对象。该对象除了有上述的文件读取和转换的功能外,还提供了缓存读取(buffered)的功能。最后,我们通过对br对象调用readline()方法,可以逐行的读取文件。
(缓存读取是在内存中开辟一片区域作为缓存,该区域存放filereader读出的文本流。当该缓存的内容被读走后(比如readline()命令),缓存会加载后续的文本流。)
bufferedreader()是一个装饰器(decorator),它接收一个原始的对象,并返回一个经过装饰的、功能更复杂的对象。修饰器的好处是,它可以用于修饰不同的对象。我们这里被修饰的是从文件中读取的文本流。其他的文本流,比如标准输入,网络传输的流等等,都可以被bufferedreader()修饰,从而实现缓存读取。
下图显示了br的工作方式,数据自下而上流动:
上述的装饰过程与linux中的文本流思想很相似。在linux中,我们使用类似函数的方式来处理和传递文本流。在java中,我们使用了装饰器。但它们的目的都类似,就是实现功能的模块化和自由组合。
更多的组合
事实上,java提供了丰富的装饰器。filereader中合并了读取和转换两个步骤,并采用了常用的默认设置,比如编码采取unicode。我们可以使用fileinputstream + inputstreamreader的组合来替代filereader,从而分离读取字节和转换两个步骤,并对两个过程有更好的控制。
(当然,filereader的使用更加方便。inputstreamreader是将fileinputstream转换成一个reader,用于处理unicode文本)
箭头表示数据流动方向
流的读写来自于四个基类: inputstream, outputstream, reader和writer。inputstream和reader是处理读取操作,outputstream和writer是处理写入操作。它们都位于java.io包中。继承关系如下:
java.io
此外,ioexception有如下衍生类:
ioexception
reader和writer及其衍生类是处理unicode文本。如我们看到的buffered reader, inputstreamreader或者filereader。
inputstream和outputstream及其衍生类是处理字节(byte)流。计算机中的数据都可以认为是字节形式,所以inputstream和outputstream可用于处理更加广泛的数据。比如我们可以使用下面的组合来读取压缩文件中包含的数据(比如整数):
箭头表示数据流动方向
我们从压缩文件中读出字节流,然后解压缩,最终读出数据。
写入
写入(write)操作与读取操作相似。我们可以通过使用装饰,实现复杂的写入功能。这里是一个简单的写入文本的例子:
import java.io.*;
public class test
{
public static void main(string[] args)
{
try {
string content = "thank you for your fish.";
file file = new file("new.txt");
// create the file if doesn't exists
if (!file.exists()) {
file.createnewfile();
}
filewriter fw = new filewriter(file.getabsolutefile());
bufferedwriter bw = new bufferedwriter(fw);
bw.write(content);
bw.close();
}
catch(ioexception e) {
system.out.println("io problem");
}
}
}
上面创建了file对象,用于处理文件路径。
总结
这里只是对java io的基本介绍。java的io相对比较复杂。java程序员需要花一些时间来熟悉java.io中的类及其功能。
以上就是java进阶教程之io基础详解的详细内容。