Java I/O总结(二)

来源:互联网 发布:苹果电脑软件删除图标 编辑:程序博客网 时间:2024/04/25 01:43

很多初学者在进行IO操作时搞不清楚什么时候使用输入流,什么时候使用输出流,其实笔者在刚开始学习编程的时候也碰到这种困惑我最开始接触编程是从C语言开始,当时对计算机的很多基础知识都不懂所以在老师解释了很多遍之后仍旧是很难理解,而当我学习过微机原理之后明白了计算机的运行原理后就很容易理解了。输入/输出(I/O)其实是相对于内存(有的说是程序)而言的,我个人认为相对于内存的说法更加具体也更容易理解,计算机在处理数据时,是先将数据载入到内存中然后等待cpu去处理,所以将数据从外部设备输入到内存中当然就要使用输入流了,反之,如果要将内存中的数据保存到外部设备,就要使用输出流了。

其实IO操作说到底就是对文件的操作不管这文件存储在什么地方,所以我们首先还是要了解一下java.io包中的File类,File类定义了一些与平台无关的方法来操作文件。通过调用File类的方法可以进行,文件的创建,删除,重命名,获取文件名等操作。这里需要注意的是“目录”被认为是一种特殊的文件。关于File类的使用比较简单,查看一下API文档大概就能明白怎么使用了,对于File类它只是提供了对文件本身属性的一些操作,并不能从文件中读取或向文件写入内容。

现在我们学习一下我们使用频率最高的两个文件操作类FileInputStream和FileOutputStream

通过前面一节的介绍,我们知道这两个类是InputStream和OutputStream子类

FileInputStream  从文件系统中的某个文件中获得输入字节

FileOutputStream 向文件系统中的某个文件写入字节

由于这两个类比较常用,所以也比较简单,下面的两个程序使用API中的一些常用方法,这中间有一些需要注意点,在注释中已有注明

public class FileInputStreamTest {public static void main(String[] args) throws Exception {String filePath = "F:\\test\\test.txt";FileInputStream fin = new FileInputStream(new File(filePath));// 字节流读取,现将流中的字节读取到byte数组中,所以要先声明一个字节数组byte[] buff = new byte[1024];int len = 0;/** * 关于available方法这里有一点是需要注意的 * 就是这个方法返回的并不一定是当前所读文件的大小 * 按照API中的介绍:有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做 * 所以不要试图写出以下代码,尽管有时候在运行时并没有什么问题 * byte[] buff = new byte[fin.available()]; * fin.read(buff); *  * */int ava = fin.available();System.out.println("ava = "+ava);/** * markSupported方法是用来判断流是否支持放标记,这里涉及另外两个方法 * mark和reset * mark通常是指在流的读入过程中放入标记而reset则是将流读的位置重置到标记位 * 需要注意的是,不是所有流都支持标记的,它通常是指那些带有缓冲区的流才能够支持 *  * 由于FileInputStream不带有缓冲区所以也就不支持标记 * */System.out.println("是否支持标记:" +(fin.markSupported() ? "是" : "否"));while((len = fin.read(buff)) != -1){System.out.println(new String(buff,0,len));}fin.close();}}

输出流FileOutputStream,则更加简单,它就是建立一个向文件写入内容的通道,将所需要的数据以连续的字节流的形式写入外部文件

public class FileOutputStreamTest {public static void main(String[] args) throws Exception {String filePath = "F:\\test\\tt.txt";/** * FileOutputStream(File file)  *  * 写的方式boolean true则在原有文件的基础上进行追加 * FileOutputStream(File file, boolean append)  *  * FileOutputStream(String name)  * FileOutputStream(String name, boolean append)  *  * */FileOutputStream fos = new FileOutputStream(new File(filePath));fos.write("iotest".getBytes());fos.close();}}


0 0