系统学习 Java IO (三)----FileInputStream/FileOutputStream & RandomAccessFile

目录:系统学习 Java IO---- 目录,概览

FileInputStream

这是一个简单的FileInputStream示例:

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 类有三个不同的构造函数,可用于创建 FileInputStream 实例。

  1. 构造函数将一个包含文件系统中要读取的文件所在的路径 String 作为参数:
String path = "D:\\.txt";
FileInputStream fileInputStream = new FileInputStream(path);

注意路径需要双反斜杠\\,因为反斜杠是Java字符串中的转义字符。 要获得单个反斜杠,需要使用转义序列\。

在unix上,文件路径可能如下所示:

String path = "/home/czwbig/data/thefile.txt";

注意使用正斜杠/作为目录分隔符。 这是在 unix 上编写文件路径的方法。 实际上,Java 也会理解在 Windows 上使用/作为目录分隔符,例如new FileInputStream("D:/out.txt")

  1. 构造函数将 File 对象作为参数。 File 对象必须指向要读取的文件。 这是一个例子:
String path = "D:\\out.txt";
File   file = new File(path);
FileInputStream fileInputStream = new FileInputStream(file);

应该使用哪个构造函数取决于在打开 FileInputStream 之前具有该路径的形式。 如果您已经有一个 String 或 File ,只需按原样使用它。 将 String 转换为 File 或将 File 转换为 String 没有特别的好处。

  1. public FileInputStream(FileDescriptor fdObj)

    通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。不常用。

read(byte[])

作为 InputStream 的子类,FileInputStream 还有两个read()方法,可以将数据读入字节数组。 可以在我的有关 InputStream 的文章中阅读,不展开了。

close() 统一在 Java IO 异常处理讲解了

FileOutputStream

这是一个简单的FileOutputStream示例:

OutputStream output = new FileOutputStream("D:\\out.txt");
while(moreData) {
  int data = getMoreData();
  output.write(data);
}
output.close();
FileOutputStream 构造器

和 FileInputStream 的3个构造器差不多,参考上面即可。

另外多了两个构造方法:

  • FileOutputStream(File file, boolean append) ;
  • FileOutputStream(String name, boolean append) ;

    参数 append - 如果为 true,则将字节写入文件末尾处,而不是写入文件开始处,这样就能不覆盖文件,而是追加内容。

write(...); flush()

参考 OutputStream 。

RandomAccessFile

这里的随机访问是指,随便指定一个位置,访问它;而不是随便访问一个位置。

在使用RandomAccessFile类之前,必须实例化它。它有两个构造器,如下:

  1. RandomAccessFile(File file, String mode)
  2. RandomAccessFile(String name, String mode)

    实例:

    RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");

    参数:

    file、name- 该文件对象

    mode - 访问模式,如下表:

含意
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" "rw" + “sync”,另外还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd" "rw" + “data”,另外还要求对文件内容的每个更新都同步写入到底层存储设备。
"rwd" 模式

可用于减少执行的 I/O 操作数量.使用 "rwd" 仅要求更新要写入存储的文件的内容;使用 "rws" 要求更新要写入的文件内容及其元数据,这通常要求至少一个以上的低级别 I/O 操作。

"rws" 和 "rwd" 模式

如果该文件位于本地存储设备上,那么当返回此类的一个方法的调用时,可以保证由该调用对此文件所做的所有更改均被写入该设备。这对确保在系统崩溃时不会丢失重要信息特别有用。如果该文件不在本地设备上,则无法提供这样的保证。

使用 RandomAccessFile 在文件中跳转

要在 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();
    }
}
read & write

从 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) 按字符序列将一个字符串写入该文件。

原文地址:https://www.cnblogs.com/czwbig/p/10010293.html

时间: 2024-08-08 13:59:11

系统学习 Java IO (三)----FileInputStream/FileOutputStream & RandomAccessFile的相关文章

系统学习 Java IO (十六)----这么多类,应该用哪个?

目录:系统学习 Java IO---- 目录,概览 ### Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原因是,所有这些子类都在解决各种不同的目的. 所涉及的目的总结如下: 网络访问 内部缓冲区访问 线程间通信(管道) 缓冲 过滤 解析 阅读和写作文本(Reader/Writer) 读写原始数据(long,int等) 读和写对象 Java IO类概述表 在讨论了 Java IO 类所针对的源,目

系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader

目录:系统学习 Java IO---- 目录,概览 BufferedReader BufferedReader 类构造器接收一个 Reader 对象,为 Reader 实例提供缓冲. 缓冲可以加快 IO 的速度. BufferedReader 不是一次从网络或磁盘读取一个字符,而是一次读取一个更大的块. 这通常要快得多,特别是对于磁盘访问和更大的数据量. 类似于 BufferedInputStream ,主要区别在于 BufferedReader 读取字符(文本),而 BufferedInput

系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类

目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取字符的行号.行号从 0 开始.每当 LineNumberReader 在包装的 Reader 返回的字符中遇到行终止符时,行号递增. 可以通过调用 getLineNumber() 方法获取当前行号,也可以通过调用 setLineNumber() 方法设置当前行号. 注意设置的行号不会改变实际的文件指

java IO操作:FileInputStream,FileOutputStream,FileReader,FileWriter实例

FileInputStream   <span style="font-family:Verdana;">import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class TestFileInputStream { public static void main(String[] args) throws Exception { // 异常抛出, 不处理

如何系统学习java体系?

如何系统学习java体系? | 浏览:1248 | 更新:2013-08-26 14:56 | 标签:java 1 2 3 4 分步阅读 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,它在工业界应用非常广泛,掌握好java这门技术,你能轻松找一份java程序员的工作. 工具/原料 一些书.一台电脑 方法/步骤 学java首先你要学 J2SE,它是java体系的基础,也是重中之重.很多人往往不重视基础,其实这是舍本逐末的做法.说这么多就是希望大家能重视基础,能在这条路上走的更远.

学习 java netty (三) -- Channel

学习 java netty (三) – Channel 前言:netty封装的channel,看一下官网的定义 A nexus to a network socket or a component which is capable of I/O operations such as read, write, connect, and bind. 可以I/O操作(如读,写,连接和绑定)的连网套接字或组件 A channel provides a user: All I/O operations a

零基础如何系统学习Java Web

零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个月后被辞退了,当然我们还是朋友. 前两个条件都符合了你就可以学了,首先要了解web是什么,一般呢,java web开发无外乎就这么两大类,第一,互联网公司,第二,软件公司.对于互联网公司和软件公司还有一些差别,互联公司是面向广大网民的,会有专门的ui设计,前台开发,后台代码开发,ios开发,androi

【Java IO】FileInputStream 和 FileOutputStream

class FileInputStream extends  InputStream implements Closeable 作用:用于从文件系统中的某个文件中获得输入字节,处理二进制原始字节文件,如exe 图片等. 1.构造关联 的文件可以使用 String 描述,也可以使用File ,FileDescriptor 对象表示 2.read 是可能阻塞当前线程的.当read等其他操作的字节数大于此对象直接可用(available)的字节数时会阻塞. 3.read到文件末尾返回 -1 构造函数

java IO(三):字符流

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h