0
点赞
收藏
分享

微信扫一扫

Java IO流(上)

Java IO流

一、基础知识

IO流即存储和读取数据的解决方案。

(一)File

表示系统中的文件或者文件夹的路径

获取文件信息(大小,文件名,修改时间)

创建文件/文件夹

删除文件/文件夹

判断文件的类型

注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。

(二)IO流

用于读写文件中的数据(可以读写文件,或网络中的数据…)

1. IO流的分类

(1) 按流的方向分

Java IO流(上)_数据

可以分为输入流与输出流。(IO流的方向是以程序自身作为参照的,也可以说是以内存为参照)


(2) 按操作文件的类型分

Java IO流(上)_JAVA IO_02

可以分为字节流与字符流。字节流可以操作所有类型的文件,如视频、音频文件等等;而字符流只能操作纯文本文件。

什么是纯文本文件呢?Windows自带的记事本打开能读懂的文件即为纯文本文件,如txt、md文件。


(三)小结

1.什么是IO流?

存储和读取数据的解决方案

l:input

O:output

流:像水流一样传输数据

2.IO流的作用?

用于读写数据(本地文件,网络)

3.IO流按照流向可以分类哪两种流?

输出流:程序-> 文件

输入流:文件-> 程序

4.IO流按照操作文件的类型可以分类哪两种流?

l 字节流:可以操作所有类型的文件

l 字符流:只能操作纯文本文件

5.什么是纯文本文件?

用windows系统自带的记事本打开并且能读懂的文件txt文件,md文件,xml文件,lrc文件等。


二、IO流体系

Java IO流(上)_输出流_03

InputStream、OutputStream及Reader、Writer都是抽象类。

(一)字节流

Java IO流(上)_数据_04

1. FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。

(1) FileOutputStream字节输出流的细节
① 创建字节输出流对象

细节1:参数是字符串表示的路径或者是File对象都是可以的

细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。

细节3:如果文件已经存在,则会清空文件

② 写数据

细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符,如:

‘9’

‘7’

续写:

如果想要续写,打开续写开关即可开关位置:创建对象的第二个参数,默认false:表示关闭续写,此时创建对象会清空文件。手动传递true:表示打开续写,此时创建对象不会清空文件,如下:

// 1.创建对象并设置为续写模式
FileOutputStream fos = new FileOutputStream("text/b.txt",true);

③ 释放资源

每次使用完流之后都要释放资源


(3) IO Stream使用步骤:

①创建字节输出流对象

②写数据

③释放资源

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class IODemo1 {
    public static void main(String[] args) throws IOException {
        /*
        使用步骤:
        ①创建字节输出流对象
        ②写数据
        ③释放资源

        需求:字节输出流FileOutputStream
              写一段文字到本地文件中。(暂时不写中文)
         */

        // 1.创建对象
        File file = new File("text\\a.txt");
        // 如果文件不存在,则先新建
        if (!file.exists()){
            file.createNewFile();
        }
        // 2.创建输出流
        FileOutputStream fos = new FileOutputStream(file);
        // 3.写出数据
        fos.write(97);
        // 4.释放资源
        fos.close();
    }
}

(4) FileOutputStream基础知识小结

①创建字节输出流对象

细节1:参数是字符串表示的路径或者File对象都是可以的

细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。

细节3:如果文件已经存在,则会清空文件

②写数据

细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

③释放资源

细节:每次使用完流之后都要释放资源

(5) FileOutputStream写数据的3种方式

方法名称

说明

void write(int b)

一次写一个字节数据

void write(byte[]b)

一次写一个字节数组数据

void write(byte[]b,int off,int len)

一次写一个字节数组的部分数据

关于write(byte[]b,int off,int len)函数:

l 参数一:数组

l 参数二:起始索引0

l 参数三:个数

(6) FileOutputStream小结

a.FileOutputStream的作用

可以把程序中的数据写到本地文件上,是字节流的基本流。

b.书写步骤

创建对象,写出数据,释放资源

c.三步操作的细节

创建对象:文件存在、文件不存在、追加写入

写出数据:写出整数、写出字节数组、换行写

释放资源:关闭通道

1. FilelnputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。

(1) 使用步骤

①创建字节输入流对象

②读数据

③释放资源

import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        // 1.创建输入流
        FileInputStream fis = new FileInputStream("text/c.txt");
        // 2.读取并回显数据
        // 当到达文件终点时read方法返回-1
        for(int c = fis.read(); c != -1; c = fis.read()){
            System.out.println((char) c);
        }
    }
}


(1) FilelnputStream使用详解

①创建字节输入流对象

细节1:如果文件不存在,就直接报错。

②读取数据

细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字

细节2:读到文件末尾了,read方法返回-1。

③释放资源

细节1:每次使用完流必须要释放资源。

(2) FilelnputStream一次读多个字节

方法名称

说明

public int read()

一次读一个字节数据

public int read(byte[] buffer)

一次读一个字节数组数据

read(byte[] buffer)方法可以一次读一个字节数组的数据,每次读取会尽可能把数组装满。




2. 练习:文件拷贝

一个字节一个字节的读取,效率低,代码如下:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) throws IOException {
        // 源文件路径
        String sourcePath = "D:\\npp.8.5.8.Installer.x64.exe";
        // 目标文件地址
        String destPath = "dest\\notepad++858.exe";

        // 创建输入流
        FileInputStream fis = new FileInputStream(sourcePath);
        // 创建输出流
        FileOutputStream fos = new FileOutputStream(destPath);
        // 记录当前系统时间
        long beginMill = System.currentTimeMillis();
        // 循环读取并写出
        for (int b = fis.read(); b != -1; b = fis.read()){
            fos.write(b);
        }
        System.out.println("拷贝共花费" + (System.currentTimeMillis() - beginMill) + "毫秒");
        // 关闭资源
        fis.close();
        fos.close();
    }
}

改进使用1M大小的buffer数组作为缓冲区,读写效率将大大提高:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyPlus {
    public static void main(String[] args) throws IOException {
        // 源文件路径
        String sourcePath = "D:\\npp.8.5.8.Installer.x64.exe";
        // 目标文件地址
        String destPath = "dest\\notepad++858.exe";

        // 创建输入流
        FileInputStream fis = new FileInputStream(sourcePath);
        // 创建输出流
        FileOutputStream fos = new FileOutputStream(destPath);
        // 记录当前系统时间
        long beginMill = System.currentTimeMillis();

        // 创建缓冲数组1M
        byte[] buffer = new byte[1024 * 1024];
        // 循环读取并写出
        for (int len = fis.read(buffer); len != -1; len = fis.read(buffer)){
            fos.write(buffer,0, len);   // 写出buffer中的数据,从0索引开始,写len个数据
        }

        // 统计消耗时间
        System.out.println("拷贝共花费" + (System.currentTimeMillis() - beginMill) + "毫秒");
        // 关闭资源
        fis.close();
        fos.close();
    }
}

举报

相关推荐

java io流

Java IO流

【java】io流

java -io流

java IO流

0 条评论