广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中IO流解析及代码实例详解
  • 149
分享到

Java中IO流解析及代码实例详解

2024-04-02 19:04:59 149人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、io流1.流和流的分类什么是IO流?IO流的分类?java.io包下需要掌握的流有16个:2.如何使用流1、输入流(读文件):FileInputStream2、输出流(写文件

1、IO流

1.流和流的分类

什么是IO流?

I:Input (输入)

O: Ouput(输出)

IO流的分类?

有多种分类方式:

  • 一种方式是按照流的方向进行分类:

以内存作为参照物

往内存中去,叫做输入(Input)。或者叫做读(Read) .

从内存中出来,叫做输出(output)。或者叫做写(write) .

  • 另一种方式是按照读取薮据方式不同进行分类:
    • 有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制。
    • 这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频……
    • 有的流是按照字符的方式读取数据的,一次读取一个字符,这种流是为了方便读取普通文本文件而存在的,这种流不能读取:图片、声音、视频等文件。只能读取纯文本文件,连Word文件都无法读取

总结:流的分类

输入流、输出流、字节流、字符流

Java IO流的四大家族

java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流

注意:

  • 四个都是抽象类。
  • 所有流都是实现了java.io.Closeable接口,都是可关闭的
    • 流是一个管道,是内存和硬盘之间的通道。用完后一定要关闭,不然会占用很多资源。
  • 所有的输出流都实现了java.io.Flushable接口,都是可刷新的
    • 最终输出后,一定要记得调用flush()方法。目的是将管道中剩余未输出的数据强行输出完(清空管道)
    • 如果没有flash(),可能会导致丢失数据
  • 在java中只要”类名”以strean结尾的都是字节流。以"Reader/writer"结尾的都是字符流

java.io包下需要掌握的流有16个:

文件专属:

java . io.FileInputstream

java.io.FileOutputstream

java.io.FileReader

java.io.Filewriter

转换流:(将字节流转换成字符流)

java . io . InputstreamReader

java . io. outputstreamWriter

缓冲流专属:

java. io. BufferedReader

java.io.BufferedWriter

java.io. BufferedInputstream

java . io.Bufferedoutputstrean

数据流专属:

java . io . Datainputstream

java .io. Dataoutputstrean

标准输出流:

java . io . Printwriter

java . io . Printstream

对象专属流:

java.io.ObjectInputstream

java.io.ObjectOutputstream

一下子看到这么多流。不用怕,只需要掌握一组的使用方法就可以了,使用其他的都是一样,一通百通。

下面以万能的字节流(FileInputStream、FileOutputStream)来举例说明。

2.如何使用流

1、输入流(读文件):FileInputStream

方法一

使用FileInputStream的read()

步骤:

1、 创建流对象

​ new FileInputStream(参数)

​ 参数可以是一个File类、String字符串表示的文件路径

2、使用流的方法对文件进行读

输入流调用read()方法,每次从流中读取一个数据字节。返回值是读到的字节的ASCII值

读取一个后,他会指向下一个字符,如果到达末尾。返回-1,可以用while()来实现。

3、关闭流

调用close()方法

实例:


package com.io.stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TestFileInputStream {
    //定义一个流对象
    private static FileInputStream fis;
    public static void main(String[] args) {
        try {
            //1、 创建流对象.参数可以是一个File类、String字符串表示的文件路径
            fis = new FileInputStream("E:\\aaa.txt");//在e盘下有一个aaa.txt的文件夹,内容为(abcdefg)
            //2、使用流的方法对文件进行读
            while (true) {
                int read = fis.read();//注意这里返回的是int类型,代表是字符的ASCII值
                if (read==-1) {//读到最后会返回-1,退出条件
                    break;
                }
                System.out.println(read);
            }
        } catch (FileNotFoundException e) {//异常细粒化,不同异常可以选择不同的处理方式
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //3、关闭流
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


int read()

该方法因为每次都是只读取一个字节,这样内存和硬盘交互太频繁 ,开销大且效率不高。一般不使用,但是要了解,这是基础。

方法二

一般使用这种方法

使用read(byte[] b)

一次读取最多 b.length 个字节,减少内存和硬盘交互,提高执行效率

该方法返回的是读到的字节的数量

使用步骤:和前面只有第二步有些差别

byte[] b= new byte[3];

int readNum = fis.read(b);

解析

  • 新建一个byte[]数组b,代表我们一次需要读多少个字符。读完这么多字符后,下次一读是从当前读到的位置开始,和上面一样
  • 将byte数组b传入read()方法中,返回一个我们byte数组的大小,此时readNum值为3

那么我们读出来的数据在哪里呢。自然是存放在byte数组里。我们打印b数组看,发现b数组里存放的读到的ascii值

细节:

因为数组的长度是我们设定的。如果文件读到最后,不一定刚好符合我们设定的长度,最后一组的长度只有小于或等于数组的长度。如果小于它会返回剩余的字符的数量,读不到返回-1,我们可以利用这个作为循环退出的条件。

另外一个,因为他的长度小于b数组,那么它的值也是无法填满b数组的,此时,它只更新b数组中前面的n个读到的值,b数组后面的是上一个读取时读取到的值。

实例:

仍然读取aaa.txt文件,内容为(abcdefg)


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class TestFileInputStream2 {
    private static FileInputStream fis;
    public static void main(String[] args) {
        try {
            fis = new FileInputStream("IO流\\aaa.txt");
            //准备一个byte数组
            byte[] b= new byte[3];
            int readNum = 0;
            while (true) {
                //先进行读操作。
                readNum=fis.read(b);
                //判断
                if (readNum == -1) {
                    break;
                }
                //将字符数组转为String,后面两个参数为起始位置,和长度
                String str = new String(b, 0, readNum);
                System.out.println(str);
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭流
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

其他常用的方法

int available()

返回流中还有多少个字符没有读。(相当于获得文件读到的位置到末尾字符的个数,如果没开始读,返回文件中总字符的数量)

使用这个可以对一些比较小的(字符长度)文件一次读完,如果不超过byte数组的范围的话


public class TestFileInputStream3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("IO流\\aaa.txt");
        byte[] bytes = new byte[fis.available()];//创建一个和文件字符数量一样大的byte数组,文件不能太大。
        fis.read(bytes);
        System.out.println(new String(bytes));//b转为字符串,输出abcdefg
    }
}

skip(long n)

顾名思义:从输入流中跳过并丢弃 n 个字节的数据。

2、输出流(写文件):FileOutputStream

和输入的流程差不多,过程也基本相同

write(byte[] b)

注意:

  • byte的范围是-128~127,超过会报错
  • 写完之后,一定要刷新
  • 如果当前路径下文件已存在,会将原文件清空,再写入(慎用)。
    • 如果它是一个目录,而不是一个常规文件,会报错。
    • 或者该文件不存在,但无法创建它,会报错。
  • 如果当前路径下文件不存在,会新建文件。

package com.io.stream.output;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test1 {
    private static FileOutputStream fos;
    public static void main(String[] args) {
        try {
            //新建一个输出流,参数是输出的路径,最后的为文件名。
            fos = new FileOutputStream("IO流\\bbb.txt");
            //新建一个byte数组,里面对应的是abcd的ascii值
            byte[] bytes = {97, 98, 99, 100,101,127}; //注意byte的范围是-128~127
            //输出流调用write方法写入byte数组,以文件形式保存到上面的路径
            fos.write(bytes);
            //写完之后,一定要刷新
            fos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

追加写文件

想要追加写文件,则需要在新建流的的时候,加一个参数true。

表示将字节写入文件末尾处,而不是写入文件开始处


//新建一个输出流,参数是输出的路径,最后的为文件名。增加true表示开启追加写
fos = new FileOutputStream("IO流\\bbb.txt",true);

注意:和上面一样,不一样的点只是追加写。

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

将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流.

意思就是,写入的内容为off~len。如果off是0,len是数组长度,那就全部写入;如果off是数组长度-1,len是数组长度,那就只写入了一个字符

3.文件的拷贝

  • 使用FileInputStream+FileOutputStream即可完成文件的拷贝
  • 拷贝的过程应该是一边读、一边写
  • 使用上面的字节流拷贝文件的时候,文件类型随意,是万能的。什么文件都可以拷贝

实例


package com.io.stream.copy;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestCopy {
    private static FileInputStream fis;
    private static FileOutputStream fos;
    public static void main(String[] args) {
        try {
            //创建一个输入流
            fis = new FileInputStream("D:\\edgeDownload\\vscodeUserSetup-x64-1.55.0.exe");
            //创建一个输出流
            fos = new FileOutputStream("C:\\Users\\PC\\Desktop\\copy\\b\\VSCodeUserSetup-x64-1.55.0.exe");
            //核心,一边读、一边写
            byte[] bytes = new byte[1024*1024];//1MB,一次最多拷贝1MB
            int readNum=0;
            while((readNum=fis.read(bytes))!=-1){
                fos.write(bytes,0,readNum);//将bytes全部写入
            }
            //刷新
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //资源要分开释放,不然一个出错会导致另一个无法释放
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: Java中IO流解析及代码实例详解

本文链接: https://www.lsjlt.com/news/132717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中IO流解析及代码实例详解
    目录1、IO流1.流和流的分类什么是IO流?IO流的分类?java.io包下需要掌握的流有16个:2.如何使用流1、输入流(读文件):FileInputStream2、输出流(写文件...
    99+
    2022-11-12
  • Java中IO流解析及代码实例
    目录I/O简介字节流和字符流常用API字节字符流相关操作字节流读取文本内容字符流读取文本内容字节流读取文件到输出到指定位置字符流读取文件到输出到指定位置缓冲流BufferedInpu...
    99+
    2022-11-12
  • Java IO流相关知识代码解析
    一、IO流的分类字符流ReaderInputStreamReader(节点流)BufferedReader(处理流)WriterOutputStreamWriter(节点流)BufferedWriter(处理流)PrintWriter字节流...
    99+
    2023-05-30
    java io流 相关知识
  • Android json数据解析详解及实例代码
     Android json数据解析详解 移动开发经常要与服务器数据交互,也常使用json数据格式,那就说说Android json解析。 1.最简单json格式解析...
    99+
    2022-06-06
    json数据 JSON Android
  • IO流:java中解码和编码出现乱码说明及代码实现
    IO流:java中解码和编码的代码实现 一、UTF-8和GBK编码方式二、idea和eclipse的默认编码方式三、解码和编码方法四、代码实现编码解码 五、额外知识扩展 一、UTF-8...
    99+
    2023-10-18
    java IO流 解码 编码 数组 GBK UNICODE
  • Java IO流 文件的编码实例代码
    •文件的编码package cn.test;import java.io.UnsupportedEncodingException;public class Demo15 { public static void main(S...
    99+
    2023-05-31
    java io 编码
  • Java控制流程示例代码详解
    目录用户交互Scanner、Scanner进阶使用用户交互ScannerScanner进阶使用顺序结构选择结构*if选择结构Switch选择结构循环结构*while循环do..whi...
    99+
    2022-11-13
  • Android CoordinatorLayout详解及实例代码
    Android CoordinatorLayout详解 一、CoordinatorLayout有什么作用 CoordinatorLayout作为“super-powered F...
    99+
    2022-06-06
    coordinatorlayout Android
  • Android ToggleButton 详解及实例代码
    Android ToggleButton 详解 在Android的开发过程中,对于ToggleButton的使用频率也是相当的高的,下面我就来说一下,这个组件的两种使用方式。 ...
    99+
    2022-06-06
    Android
  • Android ViewPagerIndicator详解及实例代码
    Android ViewPagerIndicator详解及实例代码关于自定义View的属性零碎知识自定义View和自定义属性的知识不再此提及,这里着重说的是属性在自定义View中的获取方式,自定义的属性如下:<?xml ver...
    99+
    2023-05-31
    android viewpagerindicator age
  • JAVA的IO流、File、字节流及字符流实例分析
    今天小编给大家分享一下JAVA的IO流、File、字节流及字符流实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。IO简...
    99+
    2023-06-30
  • Java Base64编码方法详解及实例分析
    Base64.encodeBase64String方法是一个Java语言中用于Base64编码的方法。它可以将二进制数据转换为Base64编码的字符串形式。在本文中,我们将详细解释这个方法的使用,提供完整的实例和代码,并分析运行结果。最后,...
    99+
    2023-09-04
    java 开发语言
  • Java中Volatile关键字详解及代码示例
    一、基本概念先补充一下概念:Java内存模型中的可见性、原子性和有序性。可见性:可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了...
    99+
    2023-05-30
    java volatile关键字 ava
  • python 队列详解及实例代码
    队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。 Queue模块最常与threading模块一起构成生产-消费者模型,提供了一个适用于多线程编程的先进...
    99+
    2022-06-04
    队列 详解 实例
  • Android ListView position详解及实例代码
     我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget.AdapterView.OnItemClickListener。对O...
    99+
    2022-06-06
    listview position Android
  • Android 混淆代码详解及实例
    为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译,下面来总结以下混淆代码的步骤: 1. 大家也许都注意到新建一个工程会看到项目下边有这样proguard-proj...
    99+
    2022-06-06
    Android
  • 详解json string转换为java bean及实例代码
    详解json string转换为java bean及实例代码pom中添加如下两个库:<dependency> <groupId>org.codehaus.jackson </groupId> <...
    99+
    2023-05-31
    json string java
  • Java之dao模式详解及代码示例
    什么是dao模式?DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化...
    99+
    2023-05-30
    java dao设计模式 ava
  • android 通知Notification详解及实例代码
    android Notification实例详解 1.使用Builder模式来创建 2.必须要设置一个smallIcon,还可以设置setTicker 3.可以设置 set...
    99+
    2022-06-06
    notification Android
  • Python heapq使用详解及实例代码
    Python heapq 详解 Python有一个内置的模块,heapq标准的封装了最小堆的算法实现。下面看两个不错的应用。 小顶堆(求TopK大) 话说需求是这样的: 定长的序列,求出TopK大的数据。...
    99+
    2022-06-04
    详解 实例 代码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作