Java 读写文件
经过前一章节的学习,我们知道 一个流被定义为一个数据序列
输入流用于从源读取数据,输出流用于向目标写数据
下图是一个描述输入流和输出流的类层次图
看到这张图是不是吓一跳,我当初就是看到庞大的 IO 图觉得 Java 太复杂了
不过,本章节我们只介绍两个重要的流 FileInputStream 和 FileOutputStream
FileInputStream
该流用于从文件读取数据
我们可以使用 new 关键字来创建一个 FileInputStream 对象
FileInputStream 提供了许多构造方法
-
可以使用字符串类型的文件名来创建一个输入流对象来读取文件
InputStream f = new FileInputStream("C:/java/hello");
-
可以使用一个文件对象来创建一个输入流对象来读取文件
不过我们首先得使用 File() 方法来创建一个文件对象
File f = new File("C:/java/hello"); InputStream out = new FileInputStream(f);
当我们有了 FileInputStream 对象后,就可以调用下面的方法来读取流或者进行其他的流操作
方法及描述 |
---|
public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常 |
protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出 IOException 异常 |
public int read(int r)throws IOException{} 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回 -1 |
public int read(byte[] r) throws IOException{} 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回 -1 |
public int available() throws IOException{} 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值 |
除了 InputStream 外,还有一些其他的输入流
FileOutputStream
FileOutputStream 类用来创建一个文件并向文件中写数据
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件
有两个构造方法可以用来创建 FileOutputStream 对象
-
使用字符串类型的文件名来创建一个输出流对象
OutputStream f = new FileOutputStream("/tmp/hello.txt")
-
可以使用一个文件对象来创建一个输出流来写文件
首先得使用 File() 方法来创建一个文件对象
File f = new File("C:/java/hello"); OutputStream f = new FileOutputStream(f);
创建 OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其它的流操作
方法及描述 |
---|
public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常 |
protected void finalize() throws IOException {} 清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
public void write(int w) throws IOException{} 把指定的字节写到输出流中 |
public void write(byte[] w) 把指定数组中 w.length 长度的字节写到 OutputStream 中 |
除了 OutputStream 外,还有一些其它的输出流
范例
下面的代码演示了 InputStream 和 OutputStream 的用法
import java.io.*; public class fileStreamTest{ public static void main(String args[]){ try{ byte bWrite [] = {11,21,3,40,5}; OutputStream os = new FileOutputStream("test.txt"); for(int x=0; x < bWrite.length ; x++){ os.write( bWrite[x] ); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for(int i=0; i< size; i++){ System.out.print((char)is.read() + " "); } is.close(); }catch(IOException e){ System.out.print("Exception"); } } }
上面这段代码首先创建文件 test.txt,并把给定的数字以二进制形式写进该文件,同时输出到控制台上
但是,因为这段代码是二进制写入,可能存在乱码
我们可以使用下面的代码来解决乱码问题
import java.io.*; public class fileStreamTest2{ public static void main(String[] args) throws IOException { File f = new File("a.txt"); FileOutputStream fop = new FileOutputStream(f); // 构建FileOutputStream对象,文件不存在会自动新建 OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8"); // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); // 写入到缓冲区 writer.append("\r\n"); //换行 writer.append("English"); // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入 writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉 fop.close(); // 关闭输出流,释放系统资源 FileInputStream fip = new FileInputStream(f); // 构建FileInputStream对象 InputStreamReader reader = new InputStreamReader(fip, "UTF-8"); // 构建InputStreamReader对象,编码与写入相同 StringBuffer sb = new StringBuffer(); while (reader.ready()) { sb.append((char) reader.read()); // 转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); // 关闭读取流 fip.close(); // 关闭输入流,释放系统资源 } }
其它相关类
还有一些关于文件和 I/O 的类