File类

File类构造方法

image.png
File的构造方法
image.png

File类实例方法

image.png
image.png
image.png

image.png
image.png

  1. File f1 = new File("E:\\Java_Learning\\0718\\src\\com\\xjt\\myFile\\java");
  2. System.out.println(f1.isDirectory()); //true
  3. System.out.println(f1.isFile()); //false
  4. System.out.println(f1.exists()); //true
  5. System.out.println(f1.getAbsolutePath()); //E:\Java_Learning\0718\src\com\xjt\myFile\java
  6. System.out.println(f1.getPath()); //E:\Java_Learning\0718\src\com\xjt\myFile\java
  7. System.out.println(f1.getName()); //java
  8. String[] fileList = f1.list();
  9. //System.out.println(fileList); //[Ljava.lang.String;@10f87f48
  10. for (String item: fileList) {
  11. System.out.println(item); //java.txt javase.txt spring.md
  12. }
  13. File[] listFiles = f1.listFiles();
  14. for (File file:listFiles) {
  15. System.out.println(file); //E:\Java_Learning\0718\src\com\xjt\myFile\java\java.txt
  16. System.out.println(file.getName()); //java.txt
  17. if(file.isFile()){
  18. System.out.println(file+"-------"); //E:\Java_Learning\0718\src\com\xjt\myFile\java\java.txt-------
  19. }
  20. }

递归

image.png
示例:递归求阶乘

  1. public static long factorial(int n){
  2. if(n==1){
  3. return 1;
  4. }else{
  5. return n*factorial(n-1);
  6. }
  7. }

示例:递归找目录下的所有文件
image.png
image.png

IO流

image.png

字节流

image.png

FileOutputStream字节流-写

构造方法:

  1. //继承关系
  2. java.lang.Object
  3. java.io.OutputStream
  4. java.io.FileOutputStream
  5. //
  6. FileOutputStream文件输出流是用于将数据写入FileFileDescriptor的输出流
构造器 描述
[FileOutputStream](#%3Cinit%3E(java.io.File))([File](File.html) file) 创建文件输出流以写入由指定的 File对象表示的文件。
[FileOutputStream](#%3Cinit%3E(java.io.File,boolean))([File](File.html) file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。
[FileOutputStream](#%3Cinit%3E(java.lang.String))([String](../lang/String.html) name) 创建文件输出流以写入具有指定名称的文件。
[FileOutputStream](#%3Cinit%3E(java.lang.String,boolean))([String](../lang/String.html) name, boolean append) 创建文件输出流以附加的方式写入具有指定名称的文件。

注意:

  1. FileOutputStream(String name) 底层其实也是FileOutputStream(File file) 传入一个File对象
  2. public FileOutputStream(String name) throws FileNotFoundException {
  3. this(name != null ? new File(name) : null, false);
  4. }

image.png
image.png
image.png
注意:用完文件句柄之后一定记得关掉,释放内存资源

public void close() throws IOException 关闭此文件输出流并释放与此流关联的所有系统资源。 > 此文件输出流可能不再用于写入字节。 image.png
image.png

FileInputStream字节流-读

```java public class FileInputStreamextends InputStream

//FileInputStream从文件系统中的文件获取输入字节,要读取字符流,请考虑使用FileReader

  1. **构造方法:**
  2. | **构造器** | **描述** |
  3. | --- | --- |
  4. | `[FileInputStream](#%3Cinit%3E(java.io.File))([File](File.html) file)` | 通过打开与实际文件的连接来创建 `FileInputStream` ,该文件由文件系统中的 `File`对象 `file`命名。 |
  5. | `[FileInputStream](#%3Cinit%3E(java.lang.String))([String](../lang/String.html) name)` | 通过打开与实际文件的连接来创建 `FileInputStream` ,该文件由文件系统中的路径名 `name`命名。 |
  6. **方法:**
  7. | **变量和类型** | **方法** | **描述** |
  8. | --- | --- | --- |
  9. | `int` | `[available](#available())()` | 返回可以从此输入流中读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。 |
  10. | `void` | `[close](#close())()` | 关闭此文件输入流并释放与该流关联的所有系统资源。 |
  11. | `int` | `[read](#read())()` | 从此输入流中读取一个字节的数据。 |
  12. | `int` | `[read](#read(byte%5B%5D))(byte[] b)` | 读字节数据存储到字节列表b |
  13. | `int` | `[read](#read(byte%5B%5D,int,int))(byte[] b, int off, int len)` | offset 指定的 索引位 开始 读取, len 读取的位数 |
  14. | `long` | `[skip](#skip(long))(long n)` | 跳过并从输入流中丢弃 `n`字节的数据。 |
  15. ```java
  16. FileInputStream fis = new FileInputStream("E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\aaa.txt");
  17. //read():读取一个字节数据
  18. // int len = fis.read(); //h == 104
  19. // System.out.println(len); //104
  20. //read(byte[] b)
  21. byte[] bys = new byte[5];
  22. int len = fis.read(bys);
  23. System.out.println(len); //5
  24. //System.out.println(new String(bys)); //hello
  25. System.out.println(new String(bys,0,len)); ////hello
  26. len = fis.read(bys);
  27. System.out.println(len); //5
  28. //System.out.println(new String(bys)); //\r\nwor
  29. System.out.println(new String(bys,0,len)); //\r\nwor
  30. len = fis.read(bys);
  31. System.out.println(len); //2
  32. //System.out.println(new String(bys)); //ldwor
  33. System.out.println(new String(bys,0,len)); //ld
  34. len = fis.read(bys);
  35. System.out.println(len); //-1
  36. //System.out.println(new String(bys)); //ldwor
  37. //System.out.println(new String(bys,0,len)); //StringIndexOutOfBoundsException
  38. /*new String(bys) 当读取的长度不够bys.length时,会多读bys中的字符
  39. * bys = ['l','d','w','o','r']
  40. * String(byte[],int offset,int len)来控制 读取数组的位数。
  41. * offset 是从指定的索引位开始读取,
  42. * len 是 读取的位数,在这个例子中,最后一次读了2个字母,所以read(byte b)返回的值是2,然后存入len中
  43. * */
  44. //释放资源
  45. fis.close();

while循环读取文件

  1. FileInputStream fis = new FileInputStream("E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\aaa.txt");
  2. byte[] bys = new byte[1024]; //1024及其整数倍
  3. int len;
  4. while ((len=fis.read(bys))!=-1){
  5. System.out.println(new String(bys, 0, len));
  6. }
  7. //释放资源
  8. fis.close();

示例:
image.png

  1. FileInputStream fis = new FileInputStream("E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\story.txt");
  2. FileOutputStream fos = new FileOutputStream("E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\story2.txt");
  3. byte[] bys = new byte[1024]; //1024及其整数倍
  4. int len;
  5. while ((len=fis.read(bys))!=-1){
  6. fos.write(bys,0,len);
  7. }
  8. fis.close();
  9. fos.close();

案例:字节流复制图片
image.png

字节缓冲流-BufferOutputStream和BufferInputStream

image.png

  1. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\aaa.txt",true));
  2. bos.write("hello\r\n".getBytes());
  3. bos.write("world\r\n".getBytes());
  4. bos.write("china\r\n".getBytes());
  5. bos.close();
  6. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\story.txt"));
  7. //一次读一个字节(中文会乱码)
  8. // int ch;
  9. // while ((ch=bis.read()) != -1){
  10. // System.out.println((char)ch);
  11. // }
  12. //一次读一个字符数组长度(1024及其倍数)
  13. int len;
  14. byte[] bytes = new byte[1024];
  15. while ((len=bis.read(bytes))!=-1){
  16. System.out.println(new String(bytes,0,len));
  17. }
  18. bis.close();

案例:拷贝视频
四种实现方法:

  • 基本字节流一次读取一个字节
  • 基本字节流一次读取一个字节数组
  • 字节缓冲流一次读取一个字节
  • 字节缓冲流一次读取一个字节数组 ```java //开始时间 long start = System.currentTimeMillis(); copyVideo4(); long end = System.currentTimeMillis(); System.out.println(“耗时:”+(end-start));

//方式1:基本字节流一次读取一个字节 耗时:199854 public static void copyVideo1() throws IOException { FileOutputStream fos = new FileOutputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\def.flv”); FileInputStream fis = new FileInputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\abc.flv”); int len; while ((len=fis.read())!=-1){ fos.write(len); } fos.close(); fis.close(); } //方式2:基本字节流一次读取一个字节数组 耗时:281 public static void copyVideo2() throws IOException { FileOutputStream fos = new FileOutputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\def.flv”); FileInputStream fis = new FileInputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\abc.flv”); int len; byte[] bytes = new byte[1024]; while ((len=fis.read(bytes))!=-1){ fos.write(bytes,0,len); } fos.close(); fis.close(); } //方式3:字节缓冲流一次读取一个字节 耗时:280 public static void copyVideo3() throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\def.flv”)); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\abc.flv”)); int len; while ((len=bis.read())!=-1){ bos.write(len); } bos.close(); bis.close(); } //方式3:字节缓冲流一次读取一个字节数组 耗时:77 public static void copyVideo4() throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\def.flv”)); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“E:\Java_Learning\0718\src\com\xjt\myIOStream\abc.flv”)); int len; byte[] bytes = new byte[1024]; while ((len=bis.read(bytes))!=-1){ bos.write(bytes,0,len); } bos.close(); bis.close(); }

  1. <a name="sWqoo"></a>
  2. ### 字符流
  3. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1604924463386-2bf0aded-f1a7-4368-897d-45ef49e1056c.png#align=left&display=inline&height=187&margin=%5Bobject%20Object%5D&name=image.png&originHeight=187&originWidth=660&size=69008&status=done&style=none&width=660)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1604924456452-10fa464b-108f-412e-977f-b9a65a21cd77.png#align=left&display=inline&height=375&margin=%5Bobject%20Object%5D&name=image.png&originHeight=375&originWidth=531&size=152346&status=done&style=none&width=531)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1604925021926-cc6a7109-3632-485e-a65e-b58ed21a6693.png#align=left&display=inline&height=261&margin=%5Bobject%20Object%5D&name=image.png&originHeight=261&originWidth=704&size=116744&status=done&style=none&width=704)
  4. <a name="NCGjK"></a>
  5. #### InputStreamReader字符流-读
  6. ```java
  7. java.lang.Object
  8. java.io.Reader
  9. java.io.InputStreamReader
  10. public class InputStreamReader extends Reader
  11. //InputStreamReader是从字节流到字符流的桥接器:它使用指定的charset读取字节并将其解码为字符。
  12. //它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。
构造器 描述
[InputStreamReader](#%3Cinit%3E(java.io.InputStream))([InputStream](InputStream.html) in) 创建一个使用默认字符集的InputStreamReader。
[InputStreamReader](#%3Cinit%3E(java.io.InputStream,java.lang.String))([InputStream](InputStream.html) in, [String](../lang/String.html) charsetName) 创建一个使用指定charset的InputStreamReader。
变量和类型 方法 描述
[String](../lang/String.html) [getEncoding](#getEncoding())() 返回此流使用的字符编码的名称。
int [read](#read())() 读一个字符。
int [read](#read(char%5B%5D,int,int))(char[] cbuf, int offset, int length) 将字符读入数组的一部分。

OutputStreamWriter字符流-写

  1. java.lang.Object
  2. java.io.Writer
  3. java.io.OutputStreamWriter
  4. public class OutputStreamWriter extends Writer
  5. //OutputStreamWriter是从字符流到字节流的桥接器:使用指定的charset将写入其中的字符编码为字节。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。
构造器 描述
[OutputStreamWriter](#%3Cinit%3E(java.io.OutputStream))([OutputStream](OutputStream.html) out) 创建使用默认字符编码的OutputStreamWriter。
[OutputStreamWriter](#%3Cinit%3E(java.io.OutputStream,java.lang.String))([OutputStream](OutputStream.html) out, [String](../lang/String.html) charsetName) 创建使用指定charset的OutputStreamWriter。
变量和类型 方法 描述
void [flush](#flush())() 刷新流。
[String](../lang/String.html) [getEncoding](#getEncoding())() 返回此流使用的字符编码的名称。
void [write](#write(char%5B%5D,int,int))(char[] cbuf, int off, int len) 写一个字符数组的一部分。
void [write](#write(int))(int c) 写一个字符。
void [write](#write(java.lang.String,int,int))([String](../lang/String.html) str, int off, int len) 写一个字符串的一部分。

示例:

  1. String path = "D:\\CodeLearning\\Java开发\\Java学习笔记\\05_Java常用API\\src\\com\\xjt\\charStream\\";
  2. //
  3. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(path+"aaa.txt"));
  4. //1.直接写一个字符串
  5. osw.write("三国演义");
  6. osw.flush();
  7. //2.写一个字符串的一部分
  8. String fullName = "JustinXiong";
  9. osw.write(fullName,6,fullName.length()-6); //写入Xiong
  10. osw.flush();
  11. //3.写一个字符数组
  12. char[] chs = {'a','b','c','d','e'};
  13. osw.write(chs);
  14. osw.flush();
  15. //3.写一个字符数组的一部分
  16. osw.write(chs,0,chs.length-1); //写入{'a','b','c','d'}
  17. osw.flush();
  18. osw.close();
  19. InputStreamReader isr = new InputStreamReader(new FileInputStream(path + "aaa.txt"));
  20. //1.一次读一个字符
  21. // int ch;
  22. // while ((ch = isr.read())!= -1){
  23. // System.out.print((char)ch+"-");
  24. // }
  25. //2.一次读一个字符数组
  26. int len;
  27. char[] chars = new char[1024];
  28. while ((len = isr.read(chars))!= -1){
  29. System.out.print(new String(chars,0,len));
  30. }
  31. isr.close();

FileWriter字符流-写

  1. java.lang.Object
  2. java.io.Writer
  3. java.io.OutputStreamWriter
  4. java.io.FileWriter
  5. public class FileWriter extends OutputStreamWrite
  6. //使用默认缓冲区大小将文本写入字符文件。 从字符到字节的编码使用指定的charset或平台的default charset 。
构造器 描述
[FileWriter](#%3Cinit%3E(java.io.File))([File](File.html) file) File写一个 FileWriter ,使用平台的 default charset)
[FileWriter](#%3Cinit%3E(java.io.File,boolean))([File](File.html) file, boolean append) 在给出要写入的 FileWriter下构造 File ,并使用平台的 default charset构造)一个布尔值,指示是否附加写入的数据。
[FileWriter](#%3Cinit%3E(java.io.File,java.nio.charset.Charset))([File](File.html) file, [Charset](../nio/charset/Charset.html) charset) 构造一个FileWriter给予File编写和charset
[FileWriter](#%3Cinit%3E(java.io.File,java.nio.charset.Charset,boolean))([File](File.html) file, [Charset](../nio/charset/Charset.html) charset, boolean append) 构造FileWriter给出File写入, charset和一个布尔值,指示是否附加写入的数据。
[FileWriter](#%3Cinit%3E(java.lang.String))([String](../lang/String.html) fileName) 构造一个 FileWriter给出文件名,使用平台的 default charset)
[FileWriter](#%3Cinit%3E(java.lang.String,boolean))([String](../lang/String.html) fileName, boolean append) 使用平台的 default charset)构造一个 FileWriter给定一个文件名和一个布尔值,指示是否附加写入的数据。
[FileWriter](#%3Cinit%3E(java.lang.String,java.nio.charset.Charset))([String](../lang/String.html) fileName, [Charset](../nio/charset/Charset.html) charset) 构造一个FileWriter给出文件名和charset
[FileWriter](#%3Cinit%3E(java.lang.String,java.nio.charset.Charset,boolean))([String](../lang/String.html) fileName, [Charset](../nio/charset/Charset.html) charset, boolean append) 构造一个FileWriter给定一个文件名, charset和一个布尔值,指示是否附加写入的数据。

实际上[FileWriter](#%3Cinit%3E(java.lang.String))([String](https://www.yuque.com/yuquexiongjt/lang/String.html) fileName) 内部调用的FileOutputStream(fileName);
public FileWriter(String fileName) throws IOException {
super(new FileOutputStream(fileName));
}
方法:
image.pngimage.png

FileReader字符流-读

image.png
示例:

  1. String path = "D:\\CodeLearning\\Java开发\\Java学习笔记\\05_Java常用API\\src\\com\\xjt\\charStream\\bbb.txt";
  2. FileWriter fw = new FileWriter(path);
  3. fw.write(11); // ASCII中数字对应的字符
  4. fw.write("xiong\r\n");
  5. fw.write("xiong",0,3);
  6. char[] chs = {'a','b','c'};
  7. fw.write(chs);
  8. fw.flush();
  9. fw.close();
  10. //
  11. FileReader fr = new FileReader(path);
  12. //1.读一个字节
  13. // int ch;
  14. // while ((ch = fr.read())!= -1){
  15. // System.out.print((char)ch);
  16. // }
  17. //2.读一个字节数组
  18. char[] chars = new char[1024];
  19. int len;
  20. while ((len = fr.read(chars))!= -1){
  21. System.out.print(new String(chars,0,len));
  22. }
  23. fr.close();

BufferedReader字符缓冲流-读

  1. java.lang.Object
  2. java.io.Reader
  3. java.io.BufferedReader
  4. public class BufferedReader extends Reader
  5. //从字符输入流中读取文本,缓冲字符,以便有效地读取字符,数组和行。
  6. 可以指定缓冲区大小,或者可以使用默认大小。 对于大多数用途,默认值足够大。
构造器 描述
[BufferedReader](#%3Cinit%3E(java.io.Reader))([Reader](Reader.html) in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。
[BufferedReader](#%3Cinit%3E(java.io.Reader,int))([Reader](Reader.html) in, int sz) 创建使用指定大小的输入缓冲区的缓冲字符输入流。
变量和类型 方法 描述
int [read](#read())() 读一个字符。
int [read](#read(char%5B%5D,int,int))(char[] cbuf, int off, int len) 将字符读入数组的一部分。
[String](../lang/String.html) [readLine](#readLine())() 读一行文字。

BufferedWriter字符缓冲流-写

  1. java.lang.Object
  2. java.io.Writer
  3. java.io.BufferedWriter
  4. public class BufferedWriter extends Writer
  5. //将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串。 可以指定缓冲区大小,或者可以接受默认大小。 对于大多数用途,默认值足够大。
  6. 提供了一个newLine()方法,它使用系统自己的行分隔符概念,由系统属性line.separator定义。 并非所有平台都使用换行符('\n')来终止行。 因此,调用此方法终止每个输出行比直接编写换行符更为可取。
  7. windows系统: \r\n
  8. linux: \n
  9. Mac: \r
构造器 描述
[BufferedWriter](#%3Cinit%3E(java.io.Writer))([Writer](Writer.html) out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
[BufferedWriter](#%3Cinit%3E(java.io.Writer,int))([Writer](Writer.html) out, int sz) 创建一个使用给定大小的输出缓冲区的新缓冲字符输出流。
变量和类型 方法 描述
void [flush](#flush())() 刷新流。
void [newLine](#newLine())() 写一个行分隔符。
void [write](#write(char%5B%5D,int,int))(char[] cbuf, int off, int len) 写一个字符数组的一部分。
void [write](#write(int))(int c) 写一个字符。
void [write](#write(java.lang.String,int,int))([String](../lang/String.html) s, int off, int len) 写一个字符串的一部分。

示例:

  1. public static void main(String[] args) throws IOException {
  2. String path = "E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\bufferedChar\\";
  3. BufferedReader br = new BufferedReader(new FileReader(path+"aaa.txt"));
  4. BufferedWriter bw = new BufferedWriter(new FileWriter(path+"bbb.txt"));
  5. //普通方法
  6. // int len;
  7. // char[] bts = new char[1024];
  8. // while ((len = br.read(bts)) != -1){
  9. // System.out.println(new String(bts, 0, len));
  10. // bw.write(bts,0,len);
  11. // bw.flush();
  12. // }
  13. //字符缓冲流特有方法 newLine() readLine()
  14. String line;
  15. while ((line = br.readLine())!=null){
  16. bw.write(line);
  17. bw.newLine();
  18. bw.flush();
  19. }
  20. br.close();
  21. bw.close();
  22. }

IO流小结

字节流

image.png

字符流

image.png

文件的异常处理

  • 直接抛出到外面

image.png

  • try…catch…finally处理异常

image.png

  1. private static void method2(){
  2. BufferedReader br = null;
  3. BufferedWriter bw = null;
  4. try {
  5. br = new BufferedReader(new FileReader("aaa.txt"));
  6. bw = new BufferedWriter(new FileWriter("bbb.txt"));
  7. String line;
  8. while ((line=br.readLine())!=null){
  9. bw.write(line);
  10. bw.newLine();
  11. bw.flush();
  12. }
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }finally {
  16. try {
  17. br.close();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. try {
  22. bw.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  • JDK7改进方案(推荐)

image.png
image.png

  • JDK9改进方案

image.png
image.png

案例

获取当前项目目录:

  1. System.out.println(System.getProperty("user.dir")); //E:\Java_Learning\0718
  2. System.out.println(new File("").getAbsolutePath()); //E:\Java_Learning\0718
  • 学生类存入到ArrayList,然后将ArrayList写入到文件中,格式: 张三,18 ```java String path = “E:\Java_Learning\0718\src\com\xjt\myIOStream\demos\“; ArrayList studentArrayList = new ArrayList<>();

Student s1 = new Student(“张无忌”, 21); Student s2 = new Student(“张翠山”, 45); Student s3 = new Student(“张三丰”, 76); studentArrayList.add(s1); studentArrayList.add(s2); studentArrayList.add(s3);

System.out.println(System.getProperty(“user.dir”)); //E:\Java_Learning\0718 System.out.println(new File(“”).getAbsolutePath()); //E:\Java_Learning\0718

BufferedWriter bw = new BufferedWriter(new FileWriter(path+”aaa.txt”)); for (Student s:studentArrayList) { StringBuilder sb = new StringBuilder(); sb.append(s.getName()+”,”+s.getAge()); bw.write(sb.toString()); bw.newLine(); bw.flush(); } bw.close();

  1. - 读取文件中数据,按格式封装到GaoShou类,并存储到集合中(排序)
  2. ```java
  3. //读取文件中数据,按格式封装到Person类,并存储到集合中
  4. BufferedReader br = new BufferedReader(new FileReader(path + "bbb.txt"));
  5. TreeSet<GaoShou> gaoShouList = new TreeSet<>(new Comparator<GaoShou>() {
  6. @Override
  7. public int compare(GaoShou gs1, GaoShou gs2) {
  8. //按攻击值从大到小排序,攻击值相同比较年龄(从小到大)
  9. int num1 = gs2.getAttack() - gs1.getAttack();
  10. int num2 = num1 == 0 ? gs1.getAge() - gs2.getAge() : num1;
  11. return num2;
  12. }
  13. });
  14. String line;
  15. while ((line=br.readLine())!= null){
  16. String[] stringList = line.split(",");
  17. String name = stringList[0];
  18. Integer age = Integer.parseInt(stringList[1]);
  19. String menpai = stringList[2];
  20. String skill = stringList[3];
  21. Integer attack = Integer.parseInt(stringList[4]);
  22. GaoShou gs = new GaoShou(name, age, menpai, skill, attack);
  23. gaoShouList.add(gs);
  24. }
  25. br.close();
  26. for (GaoShou gs:gaoShouList) {
  27. System.out.println(gs.getName()+","+gs.getAge()+","+gs.getMenpai()+","+gs.getSkill()+","+gs.getAttack());
  28. }

bbb.txt
image.png
打印结果:
image.png

  • 集合到文件

image.png

  • 复制单级文件夹(文件夹中只包含文件不包含文件夹)

image.png

  1. public static void main(String[] args) throws IOException {
  2. String path = "E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\bufferedChar";
  3. //源目录对象
  4. File srcFile = new File(path);
  5. //源目录名
  6. String srcDirName = srcFile.getName();
  7. //新目录对象
  8. File destDir = new File("E:\\Java_Learning\\0718\\src\\com\\xjt\\myIOStream\\demos\\"+srcDirName);
  9. //如果新目录不存在就创建
  10. if(!(destDir.exists())){
  11. destDir.mkdir();
  12. }
  13. //获取源目录中所有文件的 File数组
  14. File[] srcFiles = srcFile.listFiles();
  15. //获取源目录中各个文件对象并复制到新目录中
  16. for (File srcfile:srcFiles) {
  17. String fileName = srcfile.getName();
  18. File destfile = new File(destDir, fileName);
  19. //复制文件
  20. copyFile(srcfile,destfile);
  21. }
  22. }
  23. private static void copyFile(File srcfile,File destfile) throws IOException {
  24. //除了文本文件可能还有二进制文件需要使用缓冲字节流
  25. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcfile));
  26. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfile));
  27. int len;
  28. byte[] bys = new byte[1024];
  29. while ((len = bis.read(bys))!=-1){
  30. bos.write(bys,0,len);
  31. }
  32. bis.close();
  33. bos.close();
  34. }
  • 复制多级文件夹(文件夹中包含文件和文件夹)

image.png

  1. public static void main(String[] args) throws IOException {
  2. String path = "E:\\copyFolder\\";
  3. //源目录对象
  4. File srcFile = new File(path);
  5. //新目录对象
  6. File destFile = new File("F:\\");
  7. copyFolders(srcFile,destFile);
  8. }
  9. private static void copyFolders(File srcFile, File destFile) throws IOException {
  10. if(srcFile.isDirectory()){
  11. String srcFileName = srcFile.getName();
  12. File newFolder = new File(destFile, srcFileName);
  13. if(!newFolder.exists()){
  14. newFolder.mkdir();
  15. }
  16. //获取源目录下所有文件集合
  17. File[] listSrcFiles = srcFile.listFiles();
  18. for (File file:listSrcFiles) {
  19. copyFolders(file,newFolder);
  20. }
  21. }else{
  22. //当srcFile是文件时,在新目录下创建该对象
  23. File newFile = new File(destFile, srcFile.getName());
  24. copyFile(srcFile,newFile);
  25. }
  26. }
  27. private static void copyFile(File srcfile,File destfile) throws IOException {
  28. //除了文本文件可能还有二进制文件需要使用缓冲字节流
  29. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcfile));
  30. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfile));
  31. int len;
  32. byte[] bys = new byte[1024];
  33. while ((len = bis.read(bys))!=-1){
  34. bos.write(bys,0,len);
  35. }
  36. bis.close();
  37. bos.close();
  38. }

标准输入输出流

System.in

  1. public static final InputStream in
  2. //“标准”输入流,此流已打开并准备好提供输入数据,通常该流对应于键盘输入或由主机环境或用户指定的另一输入源。

System.out

  1. public static final PrintStream out
  2. //“标准”输出流,此流已打开并准备接受输出数据,通常该流对应于主机环境或用户指定的显示输出或另一输出目的地。
  3. 对于简单的独立Java应用程序,编写一行输出数据的典型方法是:
  4. System.out.println(data)

释义:

  1. public static void main(String[] args) throws IOException {
  2. InputStream in = System.in;
  3. InputStreamReader isr = new InputStreamReader(in);
  4. BufferedReader br = new BufferedReader(isr);
  5. //一步完成
  6. // BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  7. String line = br.readLine();
  8. PrintStream ps = System.out;
  9. ps.println(line);
  10. //自己实现键盘录入数据太麻烦了,java为我们提供了
  11. Scanner sc = new Scanner(System.in);
  12. /*
  13. public Scanner(InputStream source) {
  14. this(new InputStreamReader(source), WHITESPACE_PATTERN);
  15. }
  16. * */
  17. }

字节打印流

image.png
image.png
image.png

对象序列化反序列化流

image.png

  • ObjectOutputStream ```java public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstantsObjectOutputStream

//将Java对象的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象,可以通过使用流的文件来完成对象的持久存储。 如果流是网络套接字流,则可以在另一个主机或另一个进程中重新构建对象。只有实现java.io.Serializable接口的对象才能写入流。

//构造方法 ObjectOutputStream(OutputStream out) //创建一个写入指定OutputStream的ObjectOutputStream

//方法 public final void writeObject(Object obj) throws IOException //将指定的对象写入ObjectOutputStream

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1604999378331-9af33c83-eb1a-42c1-a935-4d127a433539.png#align=left&display=inline&height=360&margin=%5Bobject%20Object%5D&name=image.png&originHeight=360&originWidth=713&size=97556&status=done&style=none&width=713)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1605000274051-50163b26-9ee1-4079-82bc-7d50eb4e1523.png#align=left&display=inline&height=434&margin=%5Bobject%20Object%5D&name=image.png&originHeight=434&originWidth=809&size=54336&status=done&style=none&width=809)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1604999375207-fb7b6579-5cd2-4dc1-9d80-7791bfa9b871.png#align=left&display=inline&height=300&margin=%5Bobject%20Object%5D&name=image.png&originHeight=300&originWidth=617&size=92925&status=done&style=none&width=617)<br />序列化Student类,存储到文件中,再从文件中读取反序列化,如果修改了Student类会造成
  2. > Exception in thread "main" java.io.InvalidClassException: com.xjt.myIOStream.serializableStream.Student; local class incompatible: stream classdesc serialVersionUID = 3001235629277929748, local class serialVersionUID = 5223036644798306068
  3. 详情可查看JDK-Serializable<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1605000631282-426365d5-27eb-4b54-bd66-f0cdf53e1552.png#align=left&display=inline&height=276&margin=%5Bobject%20Object%5D&name=image.png&originHeight=276&originWidth=895&size=57457&status=done&style=none&width=895)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1559629/1605000789164-8a365640-5837-4783-93ee-fc51968a182a.png#align=left&display=inline&height=129&margin=%5Bobject%20Object%5D&name=image.png&originHeight=129&originWidth=454&size=14100&status=done&style=none&width=454)
  4. <a name="XLUPH"></a>
  5. ### Properties字典流
  6. ```java
  7. java.lang.Object
  8. java.util.Dictionary<K,V>
  9. java.util.Hashtable<Object,Object>
  10. java.util.Properties
  11. public class Properties extends Hashtable<Object,Object>
  12. //构造方法
  13. Properties() //创建一个没有默认值的空属性列表

image.png

  1. Properties pp = new Properties();
  2. pp.setProperty("name","张无忌");
  3. pp.setProperty("age","21");
  4. pp.setProperty("skill","九阳神功");
  5. System.out.println("pp.getProperty(\"name\")="+pp.getProperty("name"));
  6. Set<String> stringSet = pp.stringPropertyNames();
  7. for (String item: stringSet) {
  8. String value = pp.getProperty(item);
  9. System.out.println(value);
  10. }

Properties和IO流结合

image.png
案例:猜数字游戏
image.png
游戏类:
image.png
main()
image.png