返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java io流 详解
  • 422
分享到

Java io流 详解

java开发语言 2023-09-17 15:09:28 422人浏览 安东尼
摘要

文章目录 前言一、IO流的分类二、流的原理及流的数量三、Java IO流对象1. 输入字节流InputStream2. 输出字节流OutputStream 前言 "io流"(Inpu

文章目录


前言

"io流"(Input/Output stream)指的是Java中用于处理输入输出(I/O)数据的机制。在Java中,所有的输入和输出都被抽象为“流”对象,并通过输入流读取数据、输出流写入数据。

Java的I/O包提供了丰富的类和方法来支持不同类型的流,输入流和输出流之间可以自由地进行转换。它们分别主要包括字节流和字符流两种类型。其中,字节流是操作二进制数据的流,可以处理任何类型的数据,常见的例如InputStream和OutputStream;字符流则是处理字符数据的流,其主要使用Reader和Writer接口。

Java中的IO流可以对文件、网络套接字等的数据进行读写操作,这些操作涉及到打开、关闭、查找、修改和删除文件、创建及维护网络连接等等一系列活动。因此,掌握Java中IO流的知识,有助于我们实现更加高效准确地操作文件、网络数据等各种实用应用。

一、IO流的分类

可以从三个不同的维度进行分类:

• 1、按照流的方向(输出输入都是站在程序所在内存的角度划分的)
• 输入流:只能从中读取数据【主要由InputStream和Reader作为基类】

• 输出流:只能向其写入数据【主要由outputStream和Writer作为基类】

• 2、按照流的操作颗粒度划分

• 字节流:以字节为单元,可操作任何数据【主要由InputStream和outPutStream作为基类】

• 字符流:以字符为单元,只能操作纯字符数据,比较方便【主要由Reader和Writer作为基类】

• 3、按照流的角色划分

• 节点流:可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流,也叫【低级流,主要由】

• 处理流:用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能,也叫【高级流】

二、流的原理及流的数量

• 1、流的原理解析

流其实我们可以想象成一个“水管”,源端和目的端就是两个“水桶”,数据是通过这个“水管”进行流动传输的,以InputStream和Reader为例,水管的每个“水滴”就是具体的数据,如果是字节流,那么一个“水滴”就是一个字节,如果是字符流,那么一个“水滴”就是一个字符。
在这里插入图片描述

当创建一个流对象的时候,如fis=new FileInputStream(“…\xx\xx.txt”),记录指针来表示当前正准备从哪个“水滴”开始读取,每当程序从InputStream或者Reader里面取出一个或者多个“水滴”后,记录指针自定向后移动;除此之外,InputStream和Reader里面都提供了一些方法来控制记录指针的移动。

在这里插入图片描述
2. java的流的图结构:
在这里插入图片描述

三、Java IO流对象

1. 输入字节流InputStream

定义和结构说明:

InputStream 是所有的输入字节流的父类,它是一个抽象类。

ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。

ObjectInputStream 和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。
意思是FileInputStream类可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DatainputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)。

【案例 】读取文件内容

import java.io.*;class hello{   public static void main(String[] args) throws IOException {       String fileName="D:"+File.separator+"hello.txt";       File f=new File(fileName);       InputStream in=new FileInputStream(f);       byte[] b=new byte[1024];       in.read(b);       in.close();       System.out.println(new String(b));    }}

注意:该示例中由于b字节数组长度为1024,如果文件较小,则会有大量填充空格。我们可以利用in.read(b);的返回值来设计程序,如下案例:

import java.io.*;class hello{   public static void main(String[] args) throws IOException {       String fileName="D:"+File.separator+"hello.txt";       File f=new File(fileName);       InputStream in=new FileInputStream(f);       byte[] b=new byte[1024];       int len=in.read(b);       in.close();       System.out.println("读入长度为:"+len);       System.out.println(new String(b,0,len));    }}

注意:观察上面的例子可以看出,我们预先申请了一个指定大小的空间,但是有时候这个空间可能太小,有时候可能太大,我们需要准确的大小,这样节省空间,那么我们可以这样做:

import java.io.*;class hello{   public static void main(String[] args) throws IOException {       String fileName="D:"+File.separator+"hello.txt";       File f=new File(fileName);       InputStream in=new FileInputStream(f);       byte[] b=new byte[(int)f.length()];       in.read(b);       System.out.println("文件长度为:"+f.length());       in.close();       System.out.println(new String(b));    }}

注意:有时候我们不知道文件有多大,这种情况下,我们需要判断是否独到文件的末尾。

import java.io.*;class hello{   public static void main(String[] args) throws IOException {       String fileName="D:"+File.separator+"hello.txt";       File f=new File(fileName);       InputStream in=new FileInputStream(f);       byte[] b=new byte[1024];       int count =0;       int temp=0;       while((temp=in.read())!=(-1)){           b[count++]=(byte)temp;       }       in.close();       System.out.println(new String(b));    }}

2. 输出字节流OutputStream

定义和结构说明:

OutputStream 是所有的输出字节流的父类,它是一个抽象类。

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,

ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。具体例子跟InputStream是对应的。

1.向文件中写入字符串

import java.io.*;class hello{   public static void main(String[] args) throws IOException {       String fileName="D:"+File.separator+"hello.txt";       File f=new File(fileName);       OutputStream out =new FileOutputStream(f);       String str="Hello World";       byte[] b=str.getBytes();       out.write(b);       out.close();    }}

2.向文件中追加新内容

import java.io.*;class hello{   public static void main(String[] args) throws IOException {       String fileName="D:"+File.separator+"hello.txt";       File f=new File(fileName);       OutputStream out =new FileOutputStream(f,true);//true表示追加模式,否则为覆盖       String str="Rollen";       //String str="\r\nRollen"; 可以换行       byte[] b=str.getBytes();       for (int i = 0; i < b.length; i++) {           out.write(b[i]);       }       out.close();    }}

3. 复制文件

import java.io.*;class hello{   public static void main(String[] args) throws IOException {       if(args.length!=2){           System.out.println("命令行参数输入有误,请检查");           System.exit(1);       }       File file1=new File(args[0]);       File file2=new File(args[1]);                if(!file1.exists()){           System.out.println("被复制的文件不存在");           System.exit(1);       }       InputStream input=new FileInputStream(file1);       OutputStream output=new FileOutputStream(file2);       if((input!=null)&&(output!=null)){           int temp=0;           while((temp=input.read())!=(-1)){                output.write(temp);           }       }       input.close();       output.close();    }}

3.缓存流的使用(BufferedInputStream/BufferedOutputStream,BufferedReader/BufferedWriter)

import java.io.*;public class TestBufferStream {public static void main (String[] args) throws IOException{BufferedInputStream bis=null;BufferedOutputStream bos=null;try {FileInputStream fis = new FileInputStream("C:\\Users\\41639\\Desktop\\java\\FileText\\src\\TestFileImportStream.java");FileOutputStream fos = new FileOutputStream("C:\\Users\\41639\\Desktop\\java\\temp\\out2.java");bis = new BufferedInputStream(fis);bos = new BufferedOutputStream(fos);byte[] b = new byte[1024];int off=0;while ((off=bis.read(b))>0) {bos.write(b,0,off);}bis.close();bos.close();}catch (IOException e) {e.printStackTrace();}finally {bis.close();bos.close();}}}

他们最基本的其实也是FileInputStream和FileOutputStream,在这个“流”的基础上,又加了缓存的功能流BufferedInputStream和BufferedOutputStream。

4.转换流的使用(InputStreamReader/OutputStreamWriter)

字面意思理解,转化流就是用来转化的,那么到底是什么转什么呢?我们可以通过以下的例子来熟悉。读取键盘输入的每一行内容,并写入到文本中,直到遇到over行结束输入

public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\41639\\Desktop\\java\\temp\\test1031.txt"));String line =null;while ((line=br.readLine())!=null) {if ("over".contentEquals(line)) {break;}bw.write(line);bw.newLine();bw.flush();}    bw.close();    br.close();}

5.对象流的使用(FileInputStream/ObjectOutputStream)

import java.io.*;public class ObjectStreamTest {public static void main(String[] args) throws Exception{try {Person P=new Person("Jeccica",26);FileOutputStream fos=new FileOutputStream("C:\\Users\\admin\\Desktop\\Java\\temp\\22.txt");ObjectOutputStream oos=new ObjectOutputStream(fos);oos.writeObject(P);oos.flush();oos.close();}catch(FileNotFoundException e) {e.printStackTrace();}catch(IOException e) {e.printStackTrace();}FileInputStream fis=new FileInputStream("C:\\Users\\admin\\Desktop\\Java\\temp\\22.txt");ObjectInputStream ois=new ObjectInputStream(fis);Person P2=(Person)ois.readObject();System.out.println(P2.name+"的年龄为"+P2.age);}}class Person implements Serializable{String name=null;int age=0;Person(String _name,int _age){name=_name;age=_age;}}

字节数组流的使用(ByteArrayInputStream/ByteArrayOutputStream)【通常结合数据流DataInputStream/DataOutputStream】

public static void main(String[] args) {ByteArrayOutputStream baos=new ByteArrayOutputStream();//创建字节数组流,同时会在内存里面创建数组DataOutputStream dos=new DataOutputStream(baos);//对字节数组流外封装成数据处理流try {dos.writeDouble(Math.random());//利用数据流里面的写入方法,写一个Double类型的随机数据dos.writeBoolean(true);ByteArrayInputStream bias=new ByteArrayInputStream(baos.toByteArray());//toByteArray()方法是创建一个新分配的字节数组。数组的大小和当前输出流的大小。这里指的是baos这个字节数组System.out.println(bias.available());DataInputStream dis=new DataInputStream(bias);System.out.println(dis.readDouble());System.out.println(dis.readBoolean());dos.close();dis.close();}catch (IOException e) {e.printStackTrace();}}

来源地址:https://blog.csdn.net/m0_68987535/article/details/131156724

--结束END--

本文标题: Java io流 详解

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

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

猜你喜欢
  • Java io流 详解
    文章目录 前言一、IO流的分类二、流的原理及流的数量三、Java IO流对象1. 输入字节流InputStream2. 输出字节流OutputStream 前言 "IO流"(Inpu...
    99+
    2023-09-17
    java 开发语言
  • JAVA—IO流详解
    1. 流概述 1.1. 什么是IO IO:Input/Output即输入&输出,也称之为流(河流,水流),指的是数据从一个地点到另一个地点过程;对于计算机来说文件的拷贝过程,文件的编写保存,显示功能都是使用到IO;将数据的传输过程看做一个输...
    99+
    2023-08-16
    java jvm 网络
  • Java IO之流的分类详解
    目录一、根据流向分为输入流和输出流:二、根据传输数据单位分为字节流和字符流三、根据功能分为节点流和包装流总结一、根据流向分为输入流和输出流: 注意输入流和输出流是相对于程序而言的。 ...
    99+
    2024-04-02
  • Java IO详解
    一、I/O简介 IO即Input和Output,即输入和输出。这里的输入和输出都是相对于内存来说的,具体见下图。 InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。 OutputStream/Wr...
    99+
    2023-08-20
    java
  • java IO流
    目录 序 一、IO流开篇 1、概念 2、流的分类 3、IO流的作用 4、IO流的使用场景 二、字节流 1、字节流抽象基类 2、字节流写数据 (1)基本步骤 (2)三种方式 (3)两个问题 (4)异常处理 3、字节缓冲流 (1)基本分类&概述...
    99+
    2023-09-04
    java 后端 沉默是今晚的康桥...
  • Java中IO流解析及代码实例详解
    目录1、IO流1.流和流的分类什么是IO流?IO流的分类?java.io包下需要掌握的流有16个:2.如何使用流1、输入流(读文件):FileInputStream2、输出流(写文件...
    99+
    2024-04-02
  • Java IO流深入理解
    目录阻塞(Block)和非阻塞(Non-Block)同步(Synchronization)和异步(Asynchronous)BIO与NIO对比面向流与面向缓冲阻塞与非阻塞选择器的问世...
    99+
    2024-04-02
  • 详解Java多线程和IO流的应用
    目录Java多线程和流的应用RamdomAccessFile多线程本地文件复制(完整代码)多线程网络下载(完整代码)测试代码及结果总结Java多线程和流的应用 最近看到了一个例子,是...
    99+
    2023-05-15
    Java多线程 Java IO流
  • Java中IO流的详细介绍
    这篇文章主要介绍“Java中IO流的详细介绍”,在日常操作中,相信很多人在Java中IO流的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中IO流的详细介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • Java IO流 - 打印流详细使用介绍
    文章目录 打印流打印流基本使用输出语句重定向 打印流 打印流基本使用 打印流: 作用:打印流可以实现更方便、更高效的打印数据到文件中去。打印流一般是指:PrintStrea...
    99+
    2023-09-05
    java 算法 开发语言
  • Java详细讲解IO流的Writer与Reader操作
    目录接口连接一、Writer方法二、Reader方法接口连接 public static void main(String[] args) throws Exception io流的...
    99+
    2024-04-02
  • Java超详细讲解IO操作字节流与字符流
    目录IO操作字节流FileInputStreamFileOutputStream字节流读写案例字符流FileReaderFileWriter字节流与字符流的区别IO操作 字节流 ...
    99+
    2024-04-02
  • Java-IO流实验
    目录前言一、资源管理器[1]. 题目[2]. 实例[3]. 代码二、文件复制与剪切[1]. 题目[2]. 复制[3]. 剪切[4]. 代码三、文件数据读写[1]. 题目[2]. 实例...
    99+
    2024-04-02
  • java中的IO流
    目录java中的IO流1.普通字节流2.字节缓冲流3.转换流4.常用的IO类FileReader和BufferedReader5.总结java中的IO流 前言: 在java中IO类...
    99+
    2024-04-02
  • Java IO流 - 字节流的使用详细介绍
    文章目录 IO流的基本介绍字节流的使用文件字节输入流创建字节输入流每次读取一个字节每次读取一个数组一次读取全部字节 文件字节输出流创建字节输出流写入文件输出流 文件拷贝练习 ...
    99+
    2023-09-16
    java jvm 前端
  • Java IO流 - 缓冲流的详细使用介绍
    文章目录 缓冲流缓冲流概述字节缓冲流字符缓存流 缓冲流 缓冲流概述 缓冲流介绍: 缓冲流也称为高效流、或者高级流。之前学习的字节流和字符流可以称为原始流。 作用:缓冲流自带...
    99+
    2023-09-11
    java jvm 算法
  • C++详细讲解IO流原理
    目录1. C语言的输入与输出2. 流是什么3. C++IO流4. stringstream的简单介绍1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf (...
    99+
    2024-04-02
  • Java中文件的读写方法之IO流详解
    目录1.File类1.1File类概述和构造方法1.2File类创建功能1.3File类判断和获取功能1.4File类删除功能2.递归2.1递归2.2递归求阶乘2.3递归遍历目录3....
    99+
    2024-04-02
  • Java详解IO流创建读取与写入操作
    目录概念io流对应的方法一、File方法(创建文件)二、FileInputStream(获取字节方法)输入流三、FileOutputStream(写入字节方法)输出流总结概念 IO流...
    99+
    2024-04-02
  • Java基础学习之IO流应用案例详解
    目录一、点名器二、集合到文件三、文件到集合一、点名器 需求: 我有一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随机点名器 实现步骤: 创建字符缓冲输入流对象创...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作