首页 > 编程语言 >Java IO流(上)

Java IO流(上)

时间:2023-12-08 23:03:53浏览次数:28  
标签:文件 Java 字节 read FileOutputStream IO import

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流(上)_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,字节,read,FileOutputStream,IO,import
From: https://blog.51cto.com/tangxiaohu/8741895

相关文章

  • Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
    Python提供了强大的输入输出和文件处理工具,通过io、pickle和json等模块,开发者可以轻松处理文件、序列化和反序列化数据,并在不同格式之间进行转换。在本文中,我们将深入介绍这些模块的用法和实际示例。1.io模块:强大的输入输出工具io模块提供了对文件I/O进行灵活处理的能力......
  • Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
    Python提供了强大的输入输出和文件处理工具,通过io、pickle和json等模块,开发者可以轻松处理文件、序列化和反序列化数据,并在不同格式之间进行转换。在本文中,我们将深入介绍这些模块的用法和实际示例。1.io模块:强大的输入输出工具io模块提供了对文件I/O进行灵活处理的能力......
  • Java 时间相减
    题目描述你是个贪睡虫,有一天被老师逮个正着,这个老师很有意思,提出一个问题:“给定入睡时刻和起床时刻,计算一共睡了多长时间”,如果回答正确就可以免于处罚。入睡时刻和起床时刻都采用24小时制表示法(见备注),而且知道睡觉时间最少为1秒,最多为24小时。输入【输入格式】输入第一行描......
  • MDM介绍:4. macOS和iOS下软件安装一触即发
    不管是在工作中还是生活中,只要使用电子产品,都离不开软件。软件一般分为系统软件和应用软件,无论是哪一种软件都避免不了安装、升级、卸载等操作。在企业、学校中,如果内部有100台设备,每台设备有15个软件,平均每个软件每3个月有一个更新,那么每3个月就有1500次更新,如果有500台就有7500次......
  • DVWA SQL Injection注入
    SQL注入步骤:寻找注入点判断注入点类型,是数字型还是字符型如果是字符型则根据真假页面或者报错语句判断闭合方式判断回显列数groupby/orderby判断回显位unionselect并且将前面的语句判定为假值获取数据库名获取数据库的表名获取数据库中表的字段名获取数据库中表的字......
  • Java之包装类的详细解析
     包装类5.1概述Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:基本类型对应的包装类(位于java.lang包中)byteByteshortShortintIntege......
  • JavaScript笔记
    JavaScript的组成:     1.数据类型:JavaScript有8种基本数据类型,包括Undefined、Null、Boolean、Number、String、BigInt、Symbol和Object。变量:在JavaScript中,可以使用var、let或const关键字声明变量。函数:JavaScript中的函数是一种可重用的代码块,可以使用fun......
  • Java-Spring框架中用到的设计模式
    Java-Spring框架中用到的设计模式单例模式(Singleton)Spring中的Bean默认是单例的,容器中只存在一个实例。这有助于节省资源,提高性能。工厂模式(Factory)Spring使用工厂模式来创建和管理Bean。通过配置文件或注解,Spring容器可以根据需要创建相应的Bean对象。代理模......
  • Java-聚簇索引和非聚簇索引
    Java-聚簇索引和非聚簇索引聚簇索引(ClusteredIndex)和非聚簇索引(Non-clusteredIndex)是数据库中两种不同的索引结构。聚簇索引(ClusteredIndex):定义:聚簇索引是按照索引的顺序直接排列数据表的行的一种索引结构。实际上,聚簇索引决定了数据表的物理排序方式。主键:通常,聚簇索......
  • java中%的含义,千万别弄反了!!!
    i%j代表的是i除以j的余数,比如5%2=1,千万别弄反了!!!因为敲代码时候弄反,导致结果出错/*题目:找出100以内所有素数/质数,10000以内的呢*/publicclassPrimeNumberTest{publicstaticvoidmain(String[]args){for(inti=1;i<=100;i++){booleanisFlag=tr......