目录:系统学习 Java IO---- 目录,概览html
这是一个简单的FileInputStream示例:java
InputStream input = new FileInputStream("D:\\input.txt"); int data = input.read(); while(data != -1) { //do something with data... doSomethingWithData(data); data = input.read(); } input.close();
注意:为了代码清晰,这里并无考虑处理异常的状况,IO 异常处理有专门的介绍。数组
FileInputStream 类有三个不一样的构造函数,可用于建立 FileInputStream 实例。app
构造函数将一个包含文件系统中要读取的文件所在的路径 String 做为参数: FileInputStream fileInputStream = new FileInputStream( "D:\\1.txt");
注意路径须要双反斜杠\\
,由于反斜杠是Java字符串中的转义字符,经过此方式得到单个反斜杠。
在unix上,文件路径可能以下所示:
String path = "/home/czwbig/data/thefile.txt";
注意使用正斜杠/
做为目录分隔符。 这是在 unix 上编写文件路径的方法。 实际上,Java 也会理解在 Windows 上使用/
做为目录分隔符,例如new FileInputStream("D:/out.txt")
dom
String path = "D:\\out.txt"; File file = new File(path); FileInputStream fileInputStream = new FileInputStream(file);
应该使用哪一个构造函数取决于在打开 FileInputStream 以前具备该路径的形式。 若是您已经有一个 String 或 File ,只需按原样使用它。 将 String 转换为 File 或将 File 转换为 String 没有特别的好处。函数
做为 InputStream 的子类,FileInputStream 还有两个 read() 方法,能够将数据读入字节数组。 能够在个人有关 InputStream 的文章中阅读,不展开了。学习
建议使用 try 自动关闭,参考 IO 异常处理章节。unix
这是一个简单的 FileOutputStream 示例:指针
OutputStream output = new FileOutputStream("D:\\out.txt"); while(moreData) { int data = getMoreData(); output.write(data); } output.close();
和 FileInputStream 的 3 个构造器差很少,参考上面便可。
另外多了两个构造方法:code
OutputStream outputStream = new FileOutputStream("D:\\test\\1.txt");
,执行后对应的 1.txt 文件(若是存在)会马上被清空,而无论有没有调用 OutputStream 的 write() 方法。参考 OutputStream 。
这里的随机访问是指,指定任何一个位置,都可以访问它;而不是不肯定的随机访问某一个位置。
在使用 RandomAccessFile 类以前,必须实例化它。它有两个构造器,以下:
实例:
RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
参数:
file、name- 该文件对象
mode - 访问模式,以下表:
值 | 含意 |
---|---|
"r" | 以只读方式打开。调用结果对象的任何 write 方法都将致使抛出 IOException。 |
"rw" | 打开以便读取和写入。若是该文件尚不存在,则尝试建立该文件。 |
"rws" | "rw" + “sync”,另外还要求对文件的内容或元数据的每一个更新都同步写入到底层存储设备。 |
"rwd" | "rw" + “data”,另外还要求对文件内容的每一个更新都同步写入到底层存储设备。 |
可用于减小执行的 I/O 操做数量.使用 "rwd" 仅要求更新要写入存储的文件的内容;使用 "rws" 要求更新要写入的文件内容及其元数据,这一般要求至少一个以上的低级别 I/O 操做。
若是该文件位于本地存储设备上,那么当返回此类的一个方法的调用时,能够保证由该调用对此文件所作的全部更改均被写入该设备。这对确保在系统崩溃时不会丢失重要信息特别有用。若是该文件不在本地设备上,则没法提供这样的保证。
要在 RandomAccessFile 中的特定位置读取或写入,必须首先将文件指针放在要读取或写入的位置。 这是使用 seek() 方法完成的。 能够经过调用 getFilePointer() 方法获取文件指针的当前位置。
read() 方法将文件指针递增为指向刚刚读取的字节后文件中的下一个字节! 这意味着能够继续调用 read() 而无需手动移动文件指针。
看以下例子:
public class RandomAccessFileExample { public static void main(String[] args) throws IOException { // out.txt 此时的文件内容为 "123456789" RandomAccessFile file = new RandomAccessFile("D:\\out.txt", "rw"); System.out.println("pointer: " + file.getFilePointer()); // 输出 pointer: 0 System.out.println("char: " + (char) file.read()); // 输出 char: 1 System.out.println("pointer: " + file.getFilePointer()); // 输出 pointer: 1 file.seek(4); // 下标从 0 开始的,让其指向第 5 个字节 System.out.println("pointer: " + file.getFilePointer()); // 输出 pointer: 4 System.out.println("char: " + (char) file.read()); // 输出 char: 5 System.out.println("pointer: " + file.getFilePointer()); // 输出 pointer: 5 file.close(); } }
从 RandomAccessFile 读取是使用其众多 read() 方法之一完成的。
方法 | 描述 |
---|---|
read(byte[] b) | 将最多 b.length 个数据字节今后文件读入 byte 数组。 |
readByte() | 今后文件读取一个有符号的八位值。 |
readChar() | 今后文件读取一个字符。 |
readFully(byte[] b) | 将 b.length 个字节今后文件读入 byte 数组,并从当前文件指针开始。 |
readLine() | 今后文件读取文本的下一行。 |
skipBytes(int n) | 尝试跳过输入的 n 个字节以丢弃跳过的字节。 |
setLength(long newLength) | 设置此文件的长度。 |
writeChars(String s) | 按字符序列将一个字符串写入该文件。 |