欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基础(十二)IO输入输出

程序员文章站 2022-07-07 09:00:27
一、IO 概述 1、IO 概念 IO:I 代表 Input 输入;O 代表 Output 输出。 Java 中 IO 是以流为基础进行输入输出,所有的数据被串行化(保存)写入输出流,或者从输入流读入。 注:数据串行化指把对象的状态以特定的形式(比如 byte[])保存到流,通过流的方式写入。 2、I ......

一、IO 概述

1、IO 概念

  IO:I 代表 Input 输入;O 代表 Output 输出。

  Java 中 IO 是以流为基础进行输入输出,所有的数据被串行化(保存)写入输出流,或者从输入流读入。

  注:数据串行化把对象的状态以特定的形式(比如 byte[]保存到通过流的方式写入

2、IO 的作用

  1、文本文件,通过特定方法能够把数据写到文件,也能够读取出文件中的内容。

  2、把信息保存到磁盘文件中。

3、Java 操作文件

1、创建 File 对象方式

Java基础(十二)IO输入输出

  测试创建文件的三种方式:

 1 import org.junit.Test;
 2 
 3 import java.io.File;
 4 
 5 /**
 6  * @author zt1994
 7  * @date 2018/3/2 10:56
 8  */
 9 public class CreateFile {
10     
11     /**
12     * 测试创建文件的三种方式,仅仅在程序中创建File对象
13     */
14     @Test
15     public void testCreateFile(){
16         //1、File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
17         File file = new File("test1.txt");  //相对路径(相对于当前工程)
18         File file1 = new File("D:\\file\\test1.txt");//绝对路径
19 
20         //2、File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
21         File file2 = new File("D:\\file\\", "test2.txt");
22 
23         //3、File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
24         File file3 = new File(new File("D:\\file\\"), "test3.txt");
25 
26         System.out.println(file);  //test1.txt
27         System.out.println(file1);  //D:\file\test1.txt
28         System.out.println(file2);  //D:\file\test2.txt
29         System.out.println(file3);  //D:\file\test3.txt
30     }
31 }

2、创建删除文件和文件夹

1、创建文件

Java基础(十二)IO输入输出

 1 import org.junit.Test;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 /**
 7  * @author zt1994
 8  * @date 2018/3/2 11:16
 9  */
10 public class CreateNewFile {
11     
12     /**
13      * 在磁盘上面创建文件
14      * 1、创建文件的路径必须存在,否则抛出异常
15      * 2、如果文件已经存在,返回false
16      * 3、此方法只能创建文件,不能创建文件夹
17      */
18     @Test
19     public void testCreateNewFile() throws IOException {
20         File file1 = new File("D:\\test.txt");//绝对路径
21         boolean b = file1.createNewFile();
22         System.out.println(b);
23     }
24 }

 2、创建和删除文件夹

Java基础(十二)IO输入输出

Java基础(十二)IO输入输出

  测试创建和删除文件夹:

 1 import java.io.File;
 2 
 3 /**
 4  * @author zt1994
 5  * @date 2018/3/2 11:27
 6  */
 7 public class CreateDir {
 8     /**
 9      * 测试和删除创建文件夹
10      */
11     @Test
12     public void testMakeDir(){
13         //创建文件夹
14         File dir = new File("E:\\testIo");
15         System.out.println(dir);
16         //1、创建单层文件夹
17         boolean mkdir = dir.mkdir();
18         System.out.println(mkdir);
19 
20         //2、创建多层文件夹
21         File dirs = new File("E:\\Demo\\test\\file");
22         boolean mkdirs = dirs.mkdirs();
23         System.out.println(mkdirs);
24         boolean deleteDirs = dirs.delete();  //删除
25         System.out.println(deleteDirs);
26 
27         //删除文件夹 public boolean delete()
28         boolean delete = dir.delete();
29         System.out.println(delete);
30     }
31 }

3、其他常用方法

  boolean exists() 测试文件或者目录是否存在;

  String getName() 得到文件或者目录的名称;

  String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。

  boolean isFile() 测试是否是一个文件;

  boolean isDirectory 测试是否一个目录;

3、删除文件夹目录的全部内容(递归删除)

 1 import org.junit.Test;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 public class TestDeleteAll {
 7     /**
 8      * 删除文件夹内所有文件,递归删除
 9      */
10     @Test
11     public void testDeleteAll(){
12         //创建一个多层文件夹
13         File file = new File("E:\\Demo\\test\\file");
14         file.mkdirs();
15 
16         File file1 = new File("E:\\Demo");
17         deleteAll(file1);
18 
19     }
20 
21     //删除指定目录下所有文件
22     public static void deleteAll(File file){
23         if (file.isFile() || file.list().length==0){
24             file.delete();
25         }else {
26             File[] files = file.listFiles();
27             for (File f:files){
28                 deleteAll(f);  //调用方法自身
29                 f.delete();
30             }
31         }
32     }
33 }

 二、IO 流读写文件

1、IO 流分类

1、按流动方向分类

  输入流和输出流,流动方向是相对的。

2、按数据的单位分类

  字节流和字符流。

Java基础(十二)IO输入输出

  测试 IO 流代码:

  1 import org.junit.Test;
  2 
  3 import java.io.*;
  4 
  5 /**
  6  * 输出流和输入流程测试
  7  */
  8 public class TestIoStream {
  9     /**
 10      * 1.读取单个字符和字符转换
 11      */
 12     @Test
 13     public void test1() throws IOException {
 14         //创建文件对象
 15         File file = new File("f1.txt");
 16 
 17         FileInputStream fileInputStream = new FileInputStream(file);
 18 
 19         int i = fileInputStream.read();
 20         System.out.println(i);
 21 
 22         //字符编码转换
 23         char x = (char) i;
 24         System.out.println(x);
 25     }
 26 
 27 
 28     /**
 29      * 2.读取多个字符
 30      */
 31     @Test
 32     public void test2() throws Exception {
 33         File file = new File("f1.txt");
 34         FileInputStream fileInputStream = new FileInputStream(file);
 35 
 36         byte[] fs = new byte[(int) file.length()];
 37         while (fileInputStream.read(fs) != -1){
 38             System.out.println(new String(fs));
 39             for (byte b: fs){
 40                 System.out.print((char) b);
 41             }
 42         }
 43 
 44         fileInputStream.close();
 45     }
 46 
 47 
 48     /**
 49      * 3.输出流,会覆盖
 50      * @throws IOException
 51      */
 52     @Test
 53     public void test3() throws IOException {
 54         File file = new File("f1.txt");
 55 
 56         FileOutputStream fileOutputStream = new FileOutputStream(file);
 57 
 58         String str = "你好,世界!";
 59 
 60         //获取字符串数组对象
 61         byte[] bytes = str.getBytes();
 62 
 63         fileOutputStream.write(bytes);
 64         fileOutputStream.flush();
 65         fileOutputStream.close();
 66     }
 67 
 68     /**
 69      * 4.字符流输入
 70      */
 71     @Test
 72     public void test4() throws IOException {
 73         FileReader fileReader = new FileReader("f1.txt");
 74 
 75         boolean f = true;
 76         while(f){
 77 
 78             int read = fileReader.read();
 79             System.out.print((char) read);
 80             if (read == -1){
 81                 f = false;
 82             }
 83         }
 84     }
 85 
 86 
 87     /**
 88      * 5.字符流输出
 89      */
 90     @Test
 91     public void test5() throws IOException {
 92         FileWriter fileWriter = new FileWriter("f1.txt");
 93 
 94         fileWriter.write("方便的输出");
 95 
 96         fileWriter.close();
 97     }
 98 
 99 
100     /**
101      * 6.字节流转字符流
102      */
103     @Test
104     public void test6() throws IOException {
105         FileInputStream inputStream = new FileInputStream("f1.txt");
106         InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
107 
108         boolean f = true;
109         while (f){
110             int i = reader.read();
111             System.out.print((char) i);
112             if (i == -1){
113                 f = false;
114             }
115         }
116     }
117 }

3、字节流和字符流的区别

①操作的单位不一样,一个是字节,一个是字符;

②操作中文使用字符流很爽;

③字符流的输出流可以直接写一个字符串 write(String msg);

④执行流程:

  字节输出流  --》程序 --》文件

  字符输出流  --》程序 --》缓存 ---》文件

测试:

      A:字节流调用了写数据的方法之后如果没有关闭,还是会把数据写到文件;

      B:字符流调用了写数据的方法之后如果没有关闭,不会把数据写到文件;