肖sir__Java IO流___17

Java IO流
1.1 流概念
在Java中所有数据都是使用流读写的。数据流的处理只能按照数据序列的顺序来进行,即前一个数据处理完之后才能处理后一个数据。
数据流以输入流的形式被程序获取,再以输出流的形式将数据输出到其它设备。
根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。
 
什么是输入/输出流?
输入流就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出流则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备
 
1.2 流概念
Java中I/O的分类:
1,按照流的方向主要分为输入流和输出流两大类。
2,数据流按照数据单位的不同分为字节流和字符流。
3,按照功能可以划分为节点流和处理流。

 

 

 

 

1.3 流概念
输入流:Java流相关的类都封装在 java.io 包中,而且每个数据流都是一个对象。所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类.

 

 

1.4 流概念
输出流:在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和Writer 抽象类(字符输出流)的子类。
 

 

 

1.5 流概念
输入流和输出流的类结构图

 

 

2.1 File类
在Java 中File类是 java.io 包中唯一代表磁盘文件本身的对象,可以通过 File类中定
义的方法来操作文件,如新建、删除、重命名文件和目录等。
File 类三种构造方法:
File(String path):如果 path 是实际存在的路径,则该 File 对象表示的是目录;如
果 path 是文件名,则该 File 对象表示的是文件。
File(String path, String name):path 是路径名,name 是文件名。
File(File dir, String name):dir 是路径对象,name 是文件名。
File 类中常用常量:public static final String separator:用来分隔同一个路径字符
串中的目录的,Windows 下指/。例如 C:/Program Files/Common Files

 

 

2.3 File类
使用File类获取文件属性:
String path = "C:/windows/"; // 指定文件所在的目录
File f = new File(path, "notepad.exe"); // 建立File变量,并设定由f变量引用
System.out.println("文件长度:" + f.length() + "字节");
System.out.println("文件或者目录:" + (f.isFile() ? "是文件" : "不是文件"));
System.out.println("文件或者目录:" + (f.isDirectory() ? "是目录" : "不是目录"));
System.out.println("是否可读:" + (f.canRead() ? "可读取" : "不可读取"));
System.out.println("是否可写:" + (f.canWrite() ? "可写入" : "不可写入"));
System.out.println(“是否隐藏:” + (f.isHidden() ? “隐藏文件” : “非隐藏文件"));
System.out.println("文件名称:" + f.getName());
System.out.println("文件路径:" + f.getPath());
说明:Windows的路径分隔符使用反斜线“
\”,而 Java 程序中的反斜线表示转义字符,所以在Java
中表示Windows下的路径,则应该使用两条反斜线或直接使用斜线“/” 或使用Java中的常量separator
 
2.4 File类
使用File创建和删除文件:
1,假设要在 C 盘上创建一个 test.txt 文件,程序启动时会检测该文件是否存在,如
果不存在则创建;如果存在则删除它再创建。例如:
// 拼接出可以适应操作系统的路径
String path = "C:" + File.separator + "test.txt";
// 创建指向文件的File对象
File f = new File(path);
// 判断文件是否存在
if (f.exists()) {
// 存在则先删除
f.delete();
}
f.createNewFile(); // 再创建
注意:在操作文件时一定要使用 File.separator 表示分隔符。在程序的开发中,往往会使用 Windows 开发环境,
因为在 Windows 操作系统中支持的开发工具较多,而在程序发布时往往是直接在 Linux 或其它操作系统上部署,
所以这时如果不使用 File.separator,则程序运行就有可能存在问题
 
2.5 File类
使用File创建和删除目录:
1,编写程序判断 C 盘根目录下是否存在 config 目录,如果存在则先删除再创建。
例如:
// 拼接出可以适应操作系统的路径
String path = "C: " + File.separator + "config";
// 创建File对象
File f = new File(path);
// 判断是否存在
if (f.exists()) {
f.delete();
}
f.mkdir(); // 创建目录
2.6 File类
File 类的 list() 方法提供了遍历目录功能,该方法有如下两种重载形式。
1. String[] list()
该方法表示返回由 File 对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File 对象不是目录,则返回 null。
2. String[] list(FilenameFilter filter)
该方法的作用与 list() 方法相同,不同的是返回数组中仅包含符合 filter 过滤器的文件和目录,如果 filter 为 null,则读取全部文件和目录。
说明:当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
 
2.7 File类
File 类的 list() 方法提供了遍历目录功能,例如:
String fileList[] = f.list(); // 调用不带参数的list()方法
for (int i = 0; i < fileList.length; i++) { // 遍历返回的字符数组
System.out.print(fileList[i] + "\t\t");
System.out.print((new File("C:/", fileList[i])).isFile() ? "文件" + "\t\t" : "文件夹" + "\t\t");
System.out.println((new File("C:/", fileList[i])).length() + "字节");
}
假设希望只列出目录下的某些文件,这就需要调用带过滤器参数的 list() 方法。首先需要创建文件过滤器,该过滤器必须实现 java.io.FilenameFilter 接口,并在 accept() 方法中指定允许的文件类型。
public class ImageFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".jpg"); // 指定允许的文件类型
}
}
// 使用文件过滤器: String fileList[] = f.list(new ImageFilter());
2.7 File类
FileInputStream文件输入流:
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File()方法来创建一个文件对象:
File f = new File("C:/java/hello");
InputStream out = new FileInputStream(f);
 
2.8 File类
FileInputStream文件输入流常用方法:

 

 

2.8 File类
FileOutputStream文件输出流:
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
2.9 File类
FileOutputStream文件输出流常用方法

 

 

3.1 字节流
字节输入流:
InputStream类及其子类的对象表示字节输入流,InputStream常用子类:
ByteArrayInputStream 类:将字节数组转换为字节输入流,从中读取字节。
FileInputStream 类:从文件中读取数据。
PipedInputStream 类:连接到一个 PipedOutputStream(管道输出流)。
SequenceInputStream 类:将多个字节输入流串联成一个字节输入流。
ObjectInputStream 类:将对象反序列化。
 
3.2 字节流
字节输出流
OutputStream 类及其子类的对象表示一个字节输出流。OutputStream 常用子类:
ByteArrayOutputStream 类:向内存缓冲区的字节数组中写数据。
FileOutputStream 类:向文件中写数据。
PipedOutputStream 类:连接到一个 PipedlntputStream(管道输入流)。
ObjectOutputStream 类:将对象序列化。
 
4.1 字符流
字符输入流
Reader 类的常用子类如下:
CharArrayReader 类:将字符数组转换为字符输入流,从中读取字符。
StringReader 类:将字符串转换为字符输入流,从中读取字符。
BufferedReader 类:为其他字符输入流提供读缓冲区。
PipedReader 类:连接到一个 PipedWriter。
InputStreamReader 类:将字节输入流转换为字符输入流,可以指定字符编码
4.2 字符流
字符输出流
Writer 类的常用子类如下。
CharArrayWriter 类:向内存缓冲区的字符数组写数据。
StringWriter 类:向内存缓冲区的字符串(StringBuffer)写数据。
BufferedWriter 类:为其他字符输出流提供写缓冲区。
PipedWriter 类:连接到一个 PipedReader。
OutputStreamReader 类:将字节输出流转换为字符输出流,可以指定字符编码。
 
5.1 转换流
InputStreamReader 用于将字节输入流转换为字符输入流,其中
OutputStreamWriter 用于将字节输出流转换为字符输出流。使用转换流可以在一定
程度上避免乱码,还可以指定输入输出所使用的字符集。
例如:
FileInputStream fis = new FileInputStream("D://java.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
// true表示追加内容,false表示覆盖内容
FileOutputStream fos = new FileOutputStream(("D://java.txt", true);
//使用转换流解决写入中文字符时中文乱码问题,(UTF-8 文件编码格式)
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
课后练习题
1,每到学校开学季都会新进一批图书教材,需要将这些图书信息保存到文件,再将
它们打印出来方便老师查看。下面编写程序,使用文件输入/输出流完成图书信息的
存储和读取功能,使用控制台输入图书信息。
2,设计开发一个学生管理系统,学生有姓名,年龄,性别,学号。
A,可以通过控制台来录入学生的姓名,年龄,学号信息。
B,可以通过查询所有学生信息在控制台进行展示。
C,可以根据姓名和学号查询某个学生信息。
D,可以修改某个学生信息
E,可以删除某个学生信息
F,把学生信息存储到文件中进行持久化
 
 
posted @ 2022-10-01 11:10  xiaolehua  阅读(23)  评论(0编辑  收藏  举报