学习IO流

下图是一个描述输入流和输出流的类层次图。

 

字符流:

   Reader:用于读取字符流的抽象类。

       |---BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大 多数情况下,默认值就足够大了。

             |---LineNumberReader:跟踪行号的缓冲字符输入流。此类定义了方法setLineNumber(int)和getLineNumbner(),它们可分别用于设置和获取当前行号。

        |---InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

             |---FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。

***************************************************************************

   Writer:写入字符流的抽象类。

        |---BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

        |---OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

             |---FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。

****************************************************************************

   字节流:

   InputStream:是表示字节输入流的所有类的超类。

        |--- FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

        |--- FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。

             |--- BufferedInputStream:该类实现缓冲的输入流。

**************************************************************************

   OutputStream:此抽象类是表示输出字节流的所有类的超类。

        |--- FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。

        |--- FilterOutputStream:此类是过滤输出流的所有类的超类。

              |--- BufferedOutputStream:该类实现缓冲的输出流。

 

 流的操作规律:

   1、明确源和目的。

   数据源:就是需要读取,可以使用两个体系:InputStream、Reader;

   数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;

   2、操作的数据是否是纯文本数据?

   如果是:数据源:Reader

           数据汇:Writer 

   如果不是:数据源:InputStream

             数据汇:OutputStream

   3、虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?

   明确操作的数据设备。

   数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)

   数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。

   4、需要在基本操作上附加其他功能吗?比如缓冲。

   如果需要就进行装饰。

/记住,只要一读取键盘录入,就用这句话。

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

 

 

  输入输出例子:

			File file = new File("E:/a.txt");
			FileOutputStream out = new FileOutputStream(file);
			OutputStreamWriter ow = new OutputStreamWriter(out, "UTF-8");
			ow.append("你好,涂梦");
			ow.append("\r\n");
			ow.append("see you !");
			ow.close();
			out.close();
		    FileInputStream fileIn = new FileInputStream(file);
		    InputStreamReader read = new InputStreamReader(fileIn, "UTF-8");
		    StringBuffer sb = new StringBuffer();
		    while(read.ready()){
		    	sb.append((char)read.read());
		    }
		    System.out.println(sb.toString());
		    read.close();
		    fileIn.close();

遍历一个目录下所有的目录文件

String file = "F:/fileZilla/FileZilla FTP Client";
		File f = new File(file);
		if(f.isDirectory()){
			String [] s =f.list();
			for (int i = 0; i < s.length; i++) {
				String string = s[i];
				File f1 = new File(file+"/"+s[i]);
				
				if(f1.isDirectory()){
					System.out.println(s[i]+"这是一个目录");
				}else{
					System.out.println(s[i]+"这是一个文件");
				}
				
			}
		}else{
			System.out.println(f.getName()+"这是一个文件");
		}

删除一个目录下的所有文件

public static void delete(File f){
		 File [] fs =f.listFiles();
		 if(fs != null){
			 for (File file2 : fs) {
				if(file2.isDirectory()){
					delete(file2);
				}else{
					file2.delete();
				}
			}
		 }else{
			 f.delete();
		 }
	}

copy一个文件:

1.字符流

                File file = new File("E:/a.txt");
		File file2 = new File("E:/b.txt");
		BufferedReader bfr= new BufferedReader(new FileReader(file));
		BufferedWriter bfw = new BufferedWriter(new FileWriter(file2));
		char[] arr = new char[1024];
		int num=0;
		while((num = bfr.read(arr))!= -1){
			bfw.write(arr, 0, num);
		}
		bfw.close();
		bfr.close();
		

 2.字节流

File file = new File("E:/a.txt");
		File file2 = new File("F:/a.txt");
		FileInputStream in = new FileInputStream(file);
		FileOutputStream out = new FileOutputStream(file2);
		int num = 0;
		byte[] a= new byte[1024];
		while((num =in.read(a))!= -1){
			out.write(a, 0, num);
		}
		out.close();
		in.close();

 

 

 

 

 

 

 

### Java SE IO学习教程 #### 一、简介 Java 输入/输出 (I/O) 是指通过数据源读取数据或将数据写入到数据目的地的过程。Java 提供了一套丰富的类库来处理不同类型的 I/O 操作,这些操作被封装在 `java.io` 包中。 #### 二、基本概念 - **字节** 和 **字符**: 字节用于传输原始的8位字节数据;而字符则专门针对Unicode编码的文字进行处理[^1]。 - **节点** 和 **过滤(包装)**: 节点直接连接到底层资源(如文件),而过滤则是基于其他已存在的之上构建的功能增强型[^3]. #### 三、常用类介绍 ##### 文件输入输出 对于简单的文件读写任务可以使用如下两个基础类: - `FileInputStream/FileOutputStream`: 这些是最基本的形式之一,适用于任何类型的文件内容传输[^2]. - `FileReader/FileWriter`: 当只需要处理纯文本时可以选择这两个子类,它们内部实现了对字符集转换的支持[^4]. ##### 缓冲区支持 为了提高效率,在实际应用当中通常会搭配Buffered系列来进行优化: - `BufferedReader/BufferedWriter`: 可以为任意reader/writer对象提供缓存机制从而减少磁盘访问次数并加快速度. ```java // 使用带缓冲功能的字符读取文件示例 import java.io.*; public class BufferedStreamExample { public static void main(String[] args)throws IOException{ try(BufferedReader reader=new BufferedReader(new FileReader("example.txt"))){ String line; while((line=reader.readLine())!=null){ System.out.println(line); } }// 自动调用了close()方法释放资源 } } ``` ##### 数据序列化与反序列化 当涉及到复杂对象保存至外部存储介质或者网络通信场景下,则需要用到Object Stream家族成员完成此过程. - `ObjectInputStream/ObjectOutputStream`: 支持将整个对象图谱按照特定格式持久化下来以便后续恢复原貌. ```java // 序列化对象到文件的例子 import java.io.*; class Person implements Serializable{//注意这里需要实现Serializable接口才能让实例可串行化 private static final long serialVersionUID = 1L; String name; transient int age; // 加上transient修饰符表示该字段不会参与序列化进程 } public class SerializationDemo { public static void writePersonToFile(Person person, File file) throws FileNotFoundException,IOException{ try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))){ oos.writeObject(person); } } @SuppressWarnings("unchecked") public static <T> T readPersonFromFile(File file) throws ClassNotFoundException,FileNotFoundException,IOException{ Object result=null; try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))){ result=(T)ois.readObject(); } return result; } } ``` #### 四、最佳实践建议 - 总是在finally块内关闭所有打开过的以防止内存泄漏发生. - 尽量利用try-with-resources语句简化异常管理逻辑同时确保自动清理工作得以执行. - 对于频繁发生的短小读写动作考虑引入适当大小的buffer来降低开销提升性能表现.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值