Java编程入门至精通:输入输出与文件操作

目录

一 简介

二 IO流基础(字节流、字符流)

A.字节流

B.字符流

C.字节流与字符流的转换

D.应用场景

E.缓冲

F.注意事项

三 文件读写操作

A.文件读取操作

a.字节流读取

b.字符流读取

B.文件写入操作

a.字节流写入

b.字符流写入

C.异常处理


一 简介

Java通过java.io包提供了丰富的输入输出(I/O)与文件操作API。Java I/O以流(Stream)为基础,实现对字节和字符数据的读写,如FileInputStream、FileOutputStream处理文件的字节流,而Reader和Writer系列类处理字符流,支持Unicode字符编码。File类用于文件和目录路径的管理,实现创建、删除、重命名以及查询文件属性等功能。通过I/O流,开发者可以高效、灵活地进行文件读写、网络通信和数据持久化。

二 IO流基础(字节流、字符流)

Java的输入/输出(I/O)流系统是Java处理数据输入和输出的核心部分,主要分为两大类别:字节流和字符流。

A.字节流

  • 字节流以字节(8位)为基本处理单位,适用于处理任何类型的二进制数据,包括文本、图片、音频、视频等非文本格式的数据。在Java中,所有字节流都继承自以下两个抽象类:
    • java.io.InputStream:代表所有输入字节流的超类,提供读取字节的方法。
    • java.io.OutputStream:代表所有输出字节流的超类,提供写入字节的方法。
    示例类包括 FileInputStreamFileOutputStream,分别用于读写文件的字节流。

B.字符流

  • 字符流以字符(通常是16位Unicode字符)为基本处理单位,特别适用于处理文本数据。字符流基于字节流构建,自动处理字符编码和解码。在Java中,字符流类继承自以下两个抽象类:
    • java.io.Reader:所有读取字符流的超类,提供了读取字符的方法。
    • java.io.Writer:所有写入字符流的超类,提供了写入字符的方法。
    示例类包括 FileReaderFileWriter,它们用于读写文本文件的字符流。

C.字节流与字符流的转换

  • 由于字节流与字符流之间的差异,在处理字符数据时,往往需要将字节流转换为字符流,这通过以下类完成:
    • InputStreamReaderOutputStreamWriter,这两个类分别将字节流包装成字符流,内部使用指定的字符编码(如UTF-8)进行转换。

D.应用场景

  • 字节流通常应用于处理二进制文件或网络数据传输。
  • 字符流更适合处理纯文本数据,尤其是需要考虑字符编码的情况。

E.缓冲

  • 为了提升性能,Java I/O流还引入了缓冲的概念,通过BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter等类在内存中暂存数据,减少对物理媒介的访问次数。

F.注意事项

  • 字节流操作不受字符集限制,而字符流在读写过程中会隐式涉及字符编码转换,因此在处理多语言文本时,确保正确的字符编码至关重要。

三 文件读写操作

Java中的文件读写操作主要依赖于Java I/O包(java.io)提供的各种类来进行,主要包括字节流和字符流两种类型。下面简要概述Java进行文件读写的基础操作:

A.文件读取操作

a.字节流读取
  • 字节流适用于读取任何类型的文件,包括二进制文件(如图像、音频、视频等)。例如,使用FileInputStream读取文件:
FileInputStream fis = new FileInputStream("path_to_file");
byte[] buffer = new byte[(int) fis.available()];
fis.read(buffer); // 一次性读取整个文件
// 或者逐个读取字节
int data;
while ((data = fis.read()) != -1) {
    // 处理单个字节
}
fis.close(); // 关闭流
b.字符流读取
  • 字符流更适合读取文本文件,因为它能处理字符编码。使用FileReaderBufferedReader进行读取:
FileReader fr = new FileReader("path_to_file", "UTF-8"); // 指定编码
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line); // 逐行读取并打印
}
br.close();

B.文件写入操作

a.字节流写入
  • 使用FileOutputStream将数据写入文件:
FileOutputStream fos = new FileOutputStream("output_file");
fos.write(dataBytes); // 写入字节数组
// 或逐个写入字节
for (byte b : dataBytes) {
    fos.write(b);
}
fos.close();
b.字符流写入
  • 使用FileWriterBufferedWriter写入文本文件:
FileWriter fw = new FileWriter("output_file", true); // 第二个参数为true表示追加模式
BufferedWriter bw = new BufferedWriter(fw);
bw.write("Some text to write");
bw.newLine(); // 写入换行符
bw.flush(); // 刷新缓存,确保数据立即写入文件
bw.close();

C.异常处理

在进行文件读写操作时,务必注意异常处理,使用try-catch-finally结构或Java 7以后引入的try-with-resources语句,确保资源得到及时释放:

try (FileInputStream fis = new FileInputStream("input_file")) {
    // 读取操作...
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

try (FileWriter fw = new FileWriter("output_file")) {
    // 写入操作...
} catch (IOException e) {
    e.printStackTrace();
}

以上仅为基本操作示例,实际开发中可能需要结合具体需求,使用更多的高级特性或优化方法,例如使用FileChannel进行高效的大文件操作,或者使用RandomAccessFile实现文件的随机访问等。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值