Java IO 详解
IO简单来说就是input和output,输入和输出。在Java的API中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称作输出流。这些字节序列的来源地和目的地可以是文件,也可以是网络连接,甚至是内存块。
IO流分为字符流和字节流,至于二者之间的区别是什么,这里就不详细介绍了,可以自行百度 ^_^
下图是IO流对象的继承关系,这里只是几个比较常用的继承关系,还有一些没有列举出来。其中InputStream、OutputStream、Reader、Writer是抽象类。
了解了这些类之间关系后开始进行实际的代码操作。
字符流的操作
Reader、Writer类的抽象方法
abstract int read()
abstract void write(int c)
read方法将返回一个Unicode码元(0-65535之间的整数)
或者在碰到文件结尾时返回-1。write方法在被调用的时候
需要传递一个Unicode码元
- 控制台读取字符
使用BufferedReader类绑定从控制台传入的字符流
char c;
//System in 表示控制台输入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("请输入字符,按q退出");
do{
c = (char) br.read();//读取字符
System.out.println(c);
}while (c != 'q');
结果如下
读取字符串和上述的操作类似将read方法换成readline(),但是方法是阻塞式的, 如果到达流末尾, 就返回null,数据类型更换一下即可。
字节流的操作
InputStream类抽象方法:
abstract int read()
这个方法将读入一个字节,并返回读入的字节,或者在遇到输入源结尾时返回-1。
int read(byte[] b)
读入一个字节数组,最多读入b.length个字节
int read(byte[] b, int off, int len)
读入一个字节数,off为读入字节应被放置的位置在b中的偏移量
len为读入字节的最大数量
OutputStream的方法和InputStream相同就是数据的流向相反
1. 实现图片的复制(二进制文件)
//创建两个文件流,包括输入和输出的
FileInputStream p1 = new
FileInputStream("C:\\Users\\dell\\Desktop\\原图.jpg");
FileOutputStream p2 = new
FileOutputStream("C:\\Users\\dell\\Desktop\\复制图.jpg");
//将流存入Buffered流中
BufferedInputStream in = new BufferedInputStream(p1);
BufferedOutputStream out = new BufferedOutputStream(p2);
int temp = 0;
//判断是否独到了文件的末尾
while ((temp = in.read())!= -1){
out.write(temp);
}
out.flush();//进行缓存的清除
in.close();
out.close();
结果如下,可以看到图片复制成功,也相当于是按字节读取文件。当然对文本文件进行操作也可以哒
注意:Buffer的方法相当于是该流的缓冲区。可以提高读写效率
当完成对流的读写后,应通过close的方法来关闭它们,这个调用会释放掉十分有限的
操作系统资源。如果一个应用程序打开了过多的流没有关闭,那么系统资源将被耗尽。
关闭一个输出流的同时还会冲刷用于该输出流的缓冲区,当然我们还可以用flush的
方法人为地冲刷这些输出。
2. 文件的读取
File f1 = new
File("C:\\Users\\dell\\Desktop\\test.txt");
//读入缓存区
BufferedReader in = new BufferedReader(new FileReader(f1));
String temp = null;
//判断是否独到了文件的末尾
while ((temp = in.readLine())!= null){
System.out.println("line" + temp);
}
in.close();
文本内容
结果如下
3. 文件的写入
String describe = "我是一个小学生";
//创建file对象,创建路径
File f1 = new
File("C:\\Users\\dell\\Desktop\\newfile.txt");
//判断文件是否存在,不存在直接创建
if(!f1.exists()){
f1.createNewFile();
}
//在这里要将File类转成FileWriter
FileWriter fw = new FileWriter(f1);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(describe);
bw.close();
结果如下,文件写入成功
总结:
主要能学习IO操作中都含有哪些基础的类,对这些基本的类操作要熟练,文件的读写复制等等在这里对文件的操作只使用了Buffer的类进行操作,其实还可以有很多种,像FileOutPutStream、PrintWriter、PrintReader等。感兴趣的可以自己动手实现,都很简单,慢慢积累,多加练习!