Java IO流

博客主要介绍了IO流,它是不同存储设备间的数据输入输出流。IO流按数据流动方向分为输入流和输出流,按操作数据单位分为字节流和字符流。详细阐述了字节流的文件输入输出流,以及字符流的文件输入输出流,还对比了字符流与字节流的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO流

​ IO流可以看成是不同存储设备(例如磁盘文件,内存等)之间的数据(输入输出操作)流。

IO流分类

​ IO流的常见分类标准是按照流动方向操作数据单位来 分类

按照数据流动方向分类

​ 输入流(InputStream,Reader)和输出流(OutputStream,Writer)

按照操作数据的单位分类

​ 字节流(InputStream,OutputStream)和字符流(Reader,Writer)

字节流

文件输入流(FileInputStream)

构造方法

​ FileInputStream(File file) 表示从file指向的文件中读取

​ FileInputStream(String name) name表示文件的路径名(路径+文件名)

读取的方法
		int read() 
				调用一次读到一个数据字节,返回的int值就是读到的数据
				如果已到达文件末尾,则返回 -1		 	
	 	int read(byte[] b) 
				调用一次本方法表示可以读取多个数据
				读到的内容保存传入的byte数组b中
				返回的是本次调用方法读到的数据字节个数
		int read(byte[] b, int off, int len) 
				和上面的第二个类似,可以指定从b数组什么位置开始装

读取单个数据字节
public static void main(String[] args) throws IOException {
		FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
		System.out.println(fileInputStream.read());
		System.out.println((char)fileInputStream.read());
	}
用循环读取整个文件内容
public static void main(String[] args) throws IOException {
    FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
    int i;
    while((i = fileInputStream.read()) != -1){
        System.out.println((char)i);
    }
一次读取一个数组
public static void main(String[] args) throws IOException {
    FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
    byte[] b = new byte[5];
    int len;
    while((len = fileInputStream.read(b))!=-1){
        for (byte c : b) {
            System.out.println((char)c);
        }
    }
}
直接以byte数组为参数来new一个字符串
public static void main(String[] args) throws IOException {
    FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
    byte[] b = new byte[5];
    int len;
    while((len = fileInputStream.read(b))!=-1){
        System.out.println(new String(b,0,len));
    }

文件输出流(FileOutputStream)

构造方法
FileOutputStream(File file) 
FileOutputStream(String name)
FileOutputStream(File file, boolean append) 
FileOutputStream(String name, boolean append)
方法
void write(int b)			调用一次写入一个数据字节
void write(byte[] b)    		调用一次,可以把一个byte数组中的数据写入
void write(byte[] b, int off, int len)  	调用一次,把b数组中的一部分数据写入
写入单个数据
OutputStream os = new FileOutputStream("E:/java/java.txt");
os.write(65);
os.close();
写入字符串
OutStream os = new FileOutputStream("E:/java/java.txt");
os.write(66666.getByte());
注意事项
  1. 确定输出目录

  2. 创建输出流的对象(调用输入write方法)

  3. 调用write方法写数据

  4. 关闭流资源(不关闭也能成功写入)

字符流

文件输入流(FileReader)

​ 构造方法和方法和字节流输入流FileInputStream非常类似 ,差别就是单位是char

Reader r = new FileReader("D:/123.txt");
char[] cbuf = new char[3];
int len;
while((len = r.read(cbuf))!=-1){
System.out.println(new String(cbuf,0,len));
}
r.close();

文件输出流(FileWriter)

void write(String str) // 写入字符串。 
void write(String str, int off, int len) //写入字符串的一部分

字符流与字节流的区别

  1. 操作的单位不一样,一个是字节,一个是字符
  2. 操作中文的时候使用字符流更方便, 字节流更广泛:文本,视频,音频,图片…
  3. 字符流中有可以直接写字符串的方法
  4. 字节输出流 : 程序 —> 磁盘文件 如果不关闭流也会写入
  5. 字符输出流 :程序 —> 缓冲 —> 磁盘文件 如果不关闭流或者刷新缓冲区,不会写入文件
  6. 字符输出流,关闭的时候会先刷新,关闭之后不能够在操作,刷新之后可以继续操作
  7. 什么时候会用到刷新 : 写入的数据,比较多,可以在中途手动调用刷新的方法提交数据
### Java IO概述 Java I/O 是一种用于处理数据输入和输出的机制,广泛应用于文件读写、网络通信以及与其他外部资源交互的操作。它通过一系列类和接口实现了灵活而高效的输入输出功能[^1]。 #### 节点与处理的区别 Java IO 按照角色的不同可分为 **节点** 和 **处理**(也称为包装)。 - **节点**:直接连接到特定的数据源或目标上,例如 `FileInputStream` 或 `FileOutputStream`。这些负责从底层设备读取或写入原始数据。 - **处理**:建立在其他的基础上,提供额外的功能或过滤器来增强基本的能力。常见的例子有 `BufferedInputStream` 和 `ObjectInputStream` 等[^4]。 --- ### 字节与字符的关系 Java IO 支持两种主要形式:字节和字符。 - **字节**:基于二进制数据传输,适用于任何类型的文件(如图片、视频等),其核心抽象基类为 `InputStream` 和 `OutputStream`[^3]。 ```java try (FileInputStream fis = new FileInputStream("example.txt")) { int data; while ((data = fis.read()) != -1) { System.out.print((char)data); } } catch (IOException e) { e.printStackTrace(); } ``` - **字符**:专门针对文本文件设计,简化了字符串编码转换的过程,核心抽象基类为 `Reader` 和 `Writer`。 ```java try (FileReader fr = new FileReader("example.txt"); BufferedReader br = new BufferedReader(fr)) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } ``` --- ### Apache Commons-IO 工具库简介 为了进一步优化开发者体验并减少重复劳动,Apache 提供了一个名为 **Commons-IO** 的工具集。该工具集中包含了大量实用方法,显著提高了日常 IO 操作的效率[^2]。以下是两个常用的类: - **FileUtils**: 主要用于文件复制、删除以及其他高级操作。 ```java import org.apache.commons.io.FileUtils; File srcFile = new File("source.txt"); File destFile = new File("destination.txt"); try { FileUtils.copyFile(srcFile, destFile); // 复制文件 } catch (IOException e) { e.printStackTrace(); } ``` - **IOUtils**: 集成了多种便捷函数,方便执行诸如关闭或者将内容转成字符串的任务。 ```java InputStream is = getClass().getClassLoader().getResourceAsStream("config.properties"); String content = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(content); ``` --- ### 常见问题及其解决方案 1. **如何高效地读取大文件?** 对于超大规模文件建议采用缓冲区配合分批加载的方式完成读取工作。利用 `BufferedReader` 结合固定大小缓存可有效降低内存占用率。 2. **遇到乱码现象怎么办?** 如果发现程序输出存在乱码,则可能是未指定正确的字符集所引起的问题。务必确认源文件的实际编码格式,并显式声明对应的解码方式,例如 UTF-8 或 GBK。 3. **忘记释放资源会引发什么后果?** 不当管理打开状态下的 Stream 容易造成资源泄漏风险,进而影响应用程序稳定性甚至崩溃。推荐使用 Try-With-Resources 自动化清理机制确保每次调用结束后都能及时回收关联对象实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值