Java中的IO流

1、File对象的创建

其中第一个\:表示转义字符 第二个\:表示目录层级

File file = new File("E:\\idea\\AAA\\test1.txt");

注:目录层级 在window系统中 \ ;在Linux和mac系统中 /

Java是一个跨平台语言,可以在window系统和Linux和mac系统上使用,那么怎么解决层级目录的问题呢?

(1)window系统兼容 \ 和 /,所以File对象创建的时候可以直接写成下面这种形式

File file = new File("E:/idea/AAA/test.txt");

(2)使用File.separator,在不同的系统中显示不同形式的成绩目录

File file2 = new File("E:"+File.separator+"AAA"+File.separator+"test1.txt");

2、文件的创建和目录的创建

createNewFile():创建文件

mkdir():创建目录

mkdirs():创建多级目录

public class TestAdd {
    public static void main(String[] args) throws IOException {
        File file  = new File("E:/idea/AAA/test1.txt");
        file.createNewFile();//创建文件

        File file1 = new File("E:/idea/AAA/test");
        file1.mkdir();//make directory 创建目录

        File file2 = new File("E:/idea/AAA/test2.txt");
        file2.createNewFile();
        File file3 = new File("E:/idea/AAA/CCC");
        file3.mkdir();
        File file4 = new File("E:/idea/AAA/test/aaa");
        file4.createNewFile();
        File file5 = new File("E:/idea/AAA/aaa/aaa");
        file4.mkdirs();
    }
}

3、删除

public class TestDel {
    public static void main(String[] args) throws InterruptedException {
        File file  = new File("E:/idea/AAA/test1.txt");
        File file1 = new File("E:/idea/AAA/test");
        File file2 = new File("E:/idea/AAA/test2.txt");
        File file3 = new File("E:/idea/AAA/CCC");
        File file4 = new File("E:/idea/AAA/test/aaa");
        //删除操作  有文件时不能删除
        //delete():只能删除空目录
        file1.delete();
        file4.delete();
        //deleteOnExit():程序退出时删除文件
        file3.deleteOnExit();
        Thread.sleep(10000);
    }
}

4、修改权限和重命名

public class TestChange {
    public static void main(String[] args) {
        File file  = new File("E:/idea/AAA/test1.txt");
        File file1 = new File("E:/idea/AAA/test");
        File file2 = new File("E:/idea/AAA/test2.txt");
        File file3 = new File("E:/idea/AAA/CCC");
        File file4 = new File("E:/idea/AAA/test/aaa");
        //设置文件权限
        file.setReadable(false);//读权限
        file.setReadOnly();//设置只读
        file.setWritable(false);//写权限
        //重命名 renameTo():传入的参数类型为File对象类型
        file.renameTo(new File("E:/idea/AAA/test4.txt"));
    }
}

5、查询

public class TestFind {
    public static void main(String[] args) {
        File file  = new File("E:/idea/AAA/test1.txt");
        //查询文件是否存在
        boolean exists = file.exists();
        System.out.println(exists);
        //查询文件的名称
        String name = file.getName();
        System.out.println("file -- name:"+name);//file -- name:test1.txt
        //获取文件的父级路径
        String parent = file.getParent();
        System.out.println("file -- parent:"+parent);//file -- parent:E:\idea\AAA
        //获取文件的完整路径
        String path = file.getPath();
        System.out.println("file -- path:"+path);//file -- path:E:\idea\AAA\test1.txt
        //判断File对象是不是文件
        boolean f = file.isFile();
        System.out.println(f);//true
        //判断File对象是不是目录
        boolean d = file.isDirectory();
        System.out.println(d);//false

        File file1 = new File("E:/idea/AAA");
        //列出E:/idea/AAA目录下的所有文件对象
        File[] files = file1.listFiles();
        //System.out.println(files);//[Ljava.io.File;@4554617c
        for (File file2 : files) {
            //String s = String.valueOf(x);底层源码重写了toString方法
            System.out.println(file2);
        }

        //获取E:/idea/AAA目录下的所有子文件的名称
        String[] list = file1.list();
        System.out.println(list);//[Ljava.lang.String;@4554617c
        System.out.println(Arrays.toString(list));//[CCC, test, test1.txt, test2.txt]
    }
}

 案例:输出某一个目录下所有的文件,包括子目录里的文件,使用递归实现

public class TestDigui {
    public static void main(String[] args) {
        //输出E:/idea/AAA目录下的所有文件,不包含目录
        Find("E:/idea/AAA");
    }
    //输出所有的文件,不包括目录
    public static void Find(String path){
        //根据传入的path路径创建File对象
        File file = new File(path);
        //如果不是目录也不是文件直接退出
        if (!file.isDirectory() && !file.isFile()){
            return;
        }
        //获取该目录下的所有File对象
        File[] files = file.listFiles();
        for (File f: files ) {
            //是目录继续查找
            if (f.isDirectory()){
                Find(f.getPath());
            }else {
                System.out.println(f.getPath());
            }
        }
    }
}


//运行结果
E:\idea\AAA\test\aaa
E:\idea\AAA\test1.txt
E:\idea\AAA\test2.txt

6、IO流

IO:Java的输入输出流,对文件内容进行读写操作

I:inputStream输入流(读)    O:outputStream输出流(写)

Java流的分类:

(1)流向

  1. 输入流:程序可以从中读取数据的流
  2. 输出流:程序能向其中写入数据的流

(2)流的单位

  1. 字节流:以字节为单位传输数据的流
  2. 字符流:以字符为单位传输数据的流

(3)功能

  1. 节点流:直接和文件进行交互
  2. 处理流:不能直接作用在文件上,需要一个中间的容器

四个基本的流:其他的流都是在这些流的基础上扩展的

InputStream:字节输入流

OutputStream:字节输出流

 

 Reader:字符输入流

 Writer:字符输出流

示例代码:

Writer字符输出流

public class TestWriter {
    public static void main(String[] args) throws IOException {
        //字符输出流(指定对哪个文件(路径)进行写操作)
        Writer writer = new FileWriter("E:/idea/AAA/test1.txt");
        String str = "hello";
        //使用此方法每次都会覆盖之前的内容
        writer.write(str);
        //刷新流
        writer.flush();
        //关闭流
        writer.close();
    }
}

以上这种方式,每次写入都会覆盖之前的内容,那么怎么实现追加效果呢?

public class TestWriter {
    public static void main(String[] args) throws IOException {

        //不覆盖之前的内容,实现追加效果,设置FileWriter的append属性为true,即可实现追加效果
        Writer writer1 = new FileWriter("E:/idea/AAA/test1.txt",true);
        String str1 = " world!";
        writer1.append(str1);//hello world!
        writer1.flush();
        writer1.close();
    }
}

Reader输入流

read方法每次读取后会记录读取的位置,下一次读取时从剩下未读取的部分开始读取。

public class TestReader {
    public static void main(String[] args) throws IOException {
        //创建需要读取的文件对象
        Reader reader = new FileReader("E:/idea/AAA/test1.txt");
        //read()方法返回的时第一个字符的ASSIC表中对应的值,需要进行数据转换
        //int read = reader.read();
        //System.out.println((char) read);
        //定义一个char数组,每次读取的内容存放在数组中
        char[] cs = new char[5];
        //读取的字符个数
        int count = 0;
        //当reader.read(cs)为-1时表示文件中的内容结束
        while ((count = reader.read(cs))!=-1){
            //System.out.print(cs);//hello world!orl
            //将每次读取的数组转为字符串存储,从下标为0的位置存储,存储读取的个数
            String str = new String(cs,0,count);
            System.out.print(str);//hello world!
        }

        /*char[] cs = new char[5];
        int read1 = reader.read(cs);
        System.out.println(read1);//5
        System.out.println(cs);//hello

        read1 = reader.read(cs);
        System.out.println(read1);//5
        System.out.println(cs);// worl

        read1 = reader.read(cs);
        System.out.println(read1);//2
        System.out.println(cs);//d!orl  数组内容替换*/
    }
}

使用字符输入输出流实现文件的复制

public class TestCopyFile {
    //使用字符输入输出流完成文件复制
    @Test
    public void copyFile() throws IOException {
        //创建一个字符输入流
        FileReader fileReader = new FileReader("E:/idea/AAA/test1.txt");

        //创建一个字符输出流
        FileWriter fileWriter = new FileWriter("E:/idea/AAA/test3.txt");

        int count = 0;
        char[] cs = new char[5];
        while ((count = fileReader.read(cs)) != -1) {
            fileWriter.write(cs, 0, count);
            fileWriter.flush();
        }
        fileWriter.close();
        fileReader.close();
    }
}

这里用到了junit单元测试

junit 单元测试 @Test注解 可以让方法独立运行,相当于main方法的作用

修饰符为public 不能有返回值,也不能有形参

@Test
public void test1(){
    System.out.println("~~~~~~~~~~~~~~~~~~~~~");
}

@Test
public void test2(){
    System.out.println("---------------------");
}

使用字符输入输出流可以复制文件,那么可以复制图片和视频吗?

字符输入输出流以字符为单位,复制图片和视频需要使用字节输入输出流

OutputStream字节输出流

当定义的字节输出流没有该文件时,会新建文件,但是不会新建目录

需要将要存储的数据转为字节数组进行存储

public class TestStream {

    //字节输出流测试
    @Test
    public void testOutputStream() throws IOException {
        //如果没有文件会新建文件,但是不会新建目录
        OutputStream outputStream = new FileOutputStream("E:/idea/AAA/test4.txt");
        String str = "hello";
        //把字符串转为字节数组
        byte[] bytes = str.getBytes();
        outputStream.write(bytes);
        outputStream.close();
    }
}

InputStream字节输入流

以字节数组为单位读取,如果中文可能会出现乱码情况,utf-8编码下一个汉字占3个字节,如果不正常读取,就会出现中文乱码情况,解决方法:可以将字节数组的容量设置的足够大,但是如果文件中的内容是文本的话,推荐使用字符输入流。

public class TestStream {

    //字节输入流测试
    @Test
    public void testInoutStream() throws IOException {
        //定义字节输入流
        InputStream inputStream = new FileInputStream("E:/idea/AAA/test4.txt");
        //定义字节数组
        byte[] bytes = new byte[3];
        int count = 0;
        while ((count = inputStream.read(bytes))!=-1){
            String str = new String(bytes,0,count);
            //System.out.print(bytes);//[B@14bf9759[B@14bf9759
            //System.out.print(Arrays.toString(bytes));//[104, 101, 108][108, 111, 108]
            System.out.print(str);//hello
        }
        inputStream.close();
    }
}

使用字节输入输出流实现图片的复制

public class TestCopyImg {
    @Test
    public void copyImg() throws IOException {
        InputStream inputStream = new FileInputStream("E:/idea/AAA/cat.jpg");
        OutputStream outputStream = new FileOutputStream("E:/idea/AAA/cat1.jpg");
        byte[] bytes = new byte[5];
        int count = 0;
        while ((count = inputStream.read(bytes))!=-1){
            outputStream.write(bytes,0,count);
        }
        outputStream.close();
        inputStream.close();
    }
}

缓存流

缓存流是在四个基础流上添加了一个缓冲池的功能,可以提高IO的效率,降低IO的次数。

读写操作,先将数据存入缓存池中,然后刷新缓存池,将数据写入文件/程序

public class TestBuffer {

    //输出缓存流测试
    @Test
    public void testOuntputBuffer() throws IOException {
        OutputStream out = new FileOutputStream("E:/idea/AAA/test8.txt");
        //缓存流必须作用在四个基础流上
        BufferedOutputStream bos = new BufferedOutputStream(out);
        String str = "qwertyuiop";
        byte[] bytes = str.getBytes();
        //写入的内容暂时存放在缓存池中,如果不刷新缓存池,文件中就不会显示你的完整内容
        bos.write(bytes);
        //关闭缓存流,先刷新缓存池,在关闭流资源
        bos.close();
    }
}

对象流

对象流的作用就是让数据持久化,即存储到硬盘上,相当于存档(写,序列化),读档(读,反序列化)

对象输出流(存档)

public class TestObjStream {
    //存档  序列化
    @Test
    public void objOutputStream() throws IOException {
        OutputStream outputStream = new FileOutputStream("E:/idea/AAA/Game.txt");
        //定义对象输出流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        //定义对象
        Game game = new Game("zjw",3,"耍无赖");
        //使用对象输出流调用输出方法 输出的类对象 该类必须实现Serializable 序列化接口 java.io.NotSerializableException
        objectOutputStream.writeObject(game);
        objectOutputStream.close();
    }
}

对象输入流(读档)

public class TestObjStream {

    @Test
    public void objInputStream() throws IOException, ClassNotFoundException {
        InputStream inputStream = new FileInputStream("E:/idea/AAA/Game.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        Object object = objectInputStream.readObject();
        System.out.println(object);//com.gjx.testIO.Game@59ec2012
        objectInputStream.close();
    }
}

### 回答1: JavaIO流操作基本流程如下: 1. 创建流对象:通过File类或其他相关类创建输入流或输出流对象。 2. 打开流:使用输入流或输出流对象的open()方法打开流,这样就可以读取或写入数据。 3. 读取或写入数据:使用输入流或输出流对象的read()或write()方法读取或写入数据。 4. 关闭流:使用输入流或输出流对象的close()方法关闭流,释放资源。 需要注意的是,在使用IO流操作时,要遵循“先打开、后关闭”的原则,以确保数据的完整性和流的正确性。同时,在操作过程也需要进行异常处理,以避免出现不必要的错误。 ### 回答2: JavaIO流基本操作流程如下: 1. 打开文件或者建立网络连接:使用File类或者URL类打开文件或者建立网络连接。 2. 创建流对象:根据需要选择输入流(读取数据)或输出流(写入数据),并创建相应的流对象。常见的输入流有FileInputStream、BufferedReader等,常见的输出流有FileOutputStream、BufferedWriter等。 3. 读取或写入数据:使用流对象读取或写入数据。对于输入流,可以通过调用相关方法(如read()、readline()等)逐个字符或逐行读取数据;对于输出流,可以通过调用相应方法(如write()、print()等)逐个字符或逐行写入数据。 4. 关闭流:读取或写入完成后,需要关闭文件或网络连接,以释放资源。可以调用流对象的close()方法来关闭流。 需要注意的是,在处理IO流时,应该始终使用try-catch-finally块,以确保在发生异常时能够正确关闭流。可以把IO操作放在try块,catch块用于捕获异常,并在finally块关闭流。 另外,为了提高IO效率,可以考虑使用缓冲流来进行读写操作。缓冲流(BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter)可以通过缓冲区将数据从源读入到缓冲区,再从缓冲区写入到目标,提高读写的速度。 以上就是JavaIO流基本操作的流程。根据实际需要选择合适的流对象,并遵循打开、读取/写入、关闭的流程,可以实现灵活、高效的IO操作。 ### 回答3: 在JavaIO流是用于处理输入输出操作的工具。下面是JavaIO流的基本操作流程: 1. 创建流对象:通过使用Java的InputStream和OutputStream类来创建流对象。InputStream类用于读取输入流,而OutputStream类用于写入输出流。 2. 打开流:通过使用流对象对应的构造函数和方法来打开输入和输出流。根据具体情况,可以选择文件流、网络流或内存流来打开流。 3. 读取/写入数据:使用流对象提供的读取和写入方法来读取和写入数据。例如,使用InputStream的`int read()`方法来读取一个字节的数据,使用OutputStream的`void write(int b)`方法来写入一个字节的数据。 4. 关闭流:在读取或写入结束后,必须关闭流以释放相关资源。通过调用流对象的`close()`方法来关闭流。 需要注意的是,在处理异常的时候,我们需要对可能出现的`IOException`进行处理。可以使用try-catch语句块来捕获和处理异常。 流程示例: ```java import java.io.*; public class IOExample { public static void main(String[] args) { try { // 1. 创建流对象 FileInputStream fis = new FileInputStream("input.txt"); FileOutputStream fos = new FileOutputStream("output.txt"); // 2. 打开流 // 3. 读取/写入数据 int data; while ((data = fis.read()) != -1) { fos.write(data); } // 4. 关闭流 fis.close(); fos.close(); } catch(IOException e) { e.printStackTrace(); } } } ``` 上述示例,我们创建了一个用于将一个文件的内容拷贝到另一个文件的程序。首先,我们创建了一个FileInputStream对象来读取输入文件的内容,然后创建了一个FileOutputStream对象来写入输出文件。接下来,我们通过循环从输入流读取一个字节的数据,并将其写入到输出,直到读取完所有的数据。最后,我们关闭了流对象来释放资源。 这就是JavaIO流的基本操作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值