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,把学生信息存储到文件中进行持久化 标签:__,sir,Java,字节,文件,File,字符,new,输入 From: https://www.cnblogs.com/xiaolehong/p/16746939.html