IO流

本文详细介绍了计算机中IO流的概念及其工作原理,并针对字节流和字符流进行了深入解析。文章通过实例展示了如何使用Java中的FileInputStream、FileOutputStream、FileReader、FileWriter等类进行文件读写操作。

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

IO流作用:解决设备之间数据传输问题
1.内存到硬盘:写入  输出流
2.硬盘到内存:读取  输入流


按照输出流向:


输入流


输出流


按照处理的单位来进行划分:


字节流:读取的数据是文件中的二进制数据,不会对这个二进制进行任何的处理,直接以二进制流的方式传输


字符流:读取的数据是以字符为单位的,字符串也是读取到这些二进制数据,然后他会把这些二进制数据转化为我们熟悉的字符


字符流=字节流+解码


字节流
    输入流
         FileInputStream
         BufferedInputStream
    输出流
FileOutputStream
BufferedOutputStream
字符流
    输入流
FileReader
BufferedReader
    输出流
FileWriter
  BufferedWriter


输入流的用法步骤:
1.读取目标文件位置
2.建立数据传输通道
3.读取文件的数据
4.关闭资源


读数据:FileInputStream
int content=0;
while((content=inputStream.read())!=-1){
System.out.println((char)content);


}






1.read(byte[] buff)
2.int read(byte[] b, int off, int len) 


byte[] b=new byte[1024];
int length=0;
while((length=input.read(b))!=-1){


String str=new String(b,0,length);
System.out.println("读取数据的内容是:"+str);


}


写数据:FileOutputStream
注意点:
1.使用FileOutputStream 类 来写入数据到 磁盘的时候, 如果指定的 目标文件 不存在,那么会自己创建这个目标文件。


2.使用FileOutputStream 类 来写入数据到 磁盘的时候, 如果指定的 目标文件 存在,那么写入的时候会先清空文件中原本的数据,然后再写入数据(会覆盖掉原本的内容)


3..如果我们不想覆盖这个已经存在的文件中的内容,那么我们可以 用 FileOutputStream(File file, boolean append)  构造输出流对象


String data="今天太阳很大";
byte[] b=data.getByte();
outputStream.write(b,0,length);
//outputStream.write(b);


byte[] b=new byte[1024];
int length=0;
while((length=inputStream.read(b))!=-1){
for(int i=0;i<b.length;i++){
System.out.println(b[i]+" ");
}
}


BufferedOutputStream
注意点:
1.使用bufferdOutputStream 写数据的时候,它的 write方法 实际上是先把数据写到了它内部维护的 字节数组中, 没有马上写入到 磁盘中
2.当你调用 flush()方法, 就相当于通知它 把数据写到磁盘中去
3.当你调用close()方法,关闭资源的时候, 再也不会有数据写入了,也会立刻写数据到磁盘




String str="hello world";
byte[] b=new str.getByte();
bufferedOutputStream.write(str,0,length);


int content=0;
while((content=bufferedInput.read())!=-1){
bufferedOutput.write(content);
bufferedOutput.flush();
}


输入字符流
      Reader
FileReader


char[] cbuf=new char[1024];
int length=0;
while((length=fileReader.read(cbuf))!=-1){


String str=new String(cbuf,0,length);
System.out.println(str);
}
int content=0;
while((content=fileReader.read())!=-1){


System.out.println((char)content);
}


输出字符流
Writer
 FileWriter


char[] cbuf=new char[1024];
int length=0;
while((length=reader.read(cbuf))!=-1){
writer.writer(cbuf);
writer.flush();
}


bufferedWriter


它的内部还是为了一个  字符数组 作为缓冲区,同时扩展了一些功能
buffer.newLine();
buffer.writer("\r\n哈哈哈哈");
buffer.flush();
buffer.close();
### Java IO概述 Java IO(Input/Output)用于处理数据输入和输出操作。它提供了多种类来实现文件、网络和其他设备的数据传输功能。这些类主要位于 `java.io` 包中。 #### 文件读写的两种基本方式 Java 中的 IO 分为两大类:字节和字符。 - **字节**:适用于二进制数据的操作,例如图片、音频等文件。 - **字符**:专门针对文本文件设计,提供更方便的编码转换支持。 以下是常见的几种及其用途: | 类型 | 输入 | 输出 | |--------------|----------------------------------|-------------------------------| | 字节 | `InputStream` | `OutputStream` | | 字符 | `Reader` | `Writer` | --- ### 示例代码展示 #### 1. 使用字节复制图片文件 下面是一个完整的例子,展示了如何通过字节完成图片文件的复制[^2]。 ```java import java.io.*; public class ByteStreamExample { public static void main(String[] args) { try (InputStream is = new FileInputStream("source_image.png"); OutputStream os = new FileOutputStream("destination_image.png")) { byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } } catch (IOException e) { System.err.println("Error occurred during file copy: " + e.getMessage()); } } } ``` 此代码片段实现了从源路径到目标路径的文件拷贝过程。其中使用了缓冲区技术以提高性能。 #### 2. 缓冲字节的应用 为了进一步提升效率,可以引入带缓冲机制的子类——`BufferedInputStream` 和 `BufferedOutputStream`[^3]。 ```java import java.io.*; public class BufferedByteStreamExample { public static void main(String[] args) { try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) { int data; while ((data = bis.read()) != -1) { bos.write(data); } } catch (IOException e) { System.err.println("I/O error encountered: " + e.getMessage()); } } } ``` 上述程序利用缓冲特性减少了底层磁盘访问次数,从而加快了执行速度。 #### 3. 对象序列化与反序列化 如果需要保存复杂结构的对象至外部存储介质,则需要用到对象 `ObjectInputStream` 和 `ObjectOutputStream`[^1]。 ```java // 序列化对象 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.ser"))) { MySerializableClass obj = new MySerializableClass(); oos.writeObject(obj); } catch (Exception ex) { System.out.println(ex.toString()); } // 反序列化对象 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.ser"))) { MySerializableClass restoredObj = (MySerializableClass) ois.readObject(); System.out.println(restoredObj); } catch (Exception ex) { System.out.println(ex.toString()); } ``` 注意:要使某个类能够被序列化,该类需实现 `java.io.Serializable` 接口。 --- ### 总结 以上介绍了三种典型场景下的 Java IO 应用实例,分别是基于字节的基础文件操作、借助缓存优化后的高效版本以及面向对象持久化的高级技巧。每种情况都体现了不同层次的需求满足能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值