Java 输入输出流02

六. Java.IO 流类库

1:io 流的四个基本类

      java.io 包中包含了流式 I/O 所需要的所有类。在 java.io 包中有四个基本类:InputStream、OutputStream 及 Reader、Writer 类,它们分别处理字节流和字符流:

基本数据流的 I/O 

输入 / 输出

字节流

字符流

输入流

Inputstream

Reader

输出流

OutputStream

Writer

 Java 中其他多种多样变化的流均是由它们派生出来的:

JDK1.4 版本开始引入了新 I/O 类库,它位于 java.nio 包中,新 I/O 类库利用通道和缓冲区等来提高 I/O 操作的效率。

      在 java.io 包中, java.io.InputStream 表示字节输入流, java.io.OutputStream 表示字节输出流,处于 java.io 包最顶层。这两个类均为抽象类,也就是说它们不能被实例化,必须生成子类之后才能实现一定的功能。

2:io 流的具体分类

1)按 I/O 类型来总体分类:

     1. Memory 1)从 / 向内存数组读写数据: CharArrayReader、 CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream
                   2)从 / 向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream
     2.Pipe 管道  实现管道的输入和输出(进程间通信): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream
     3.File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream
     4. ObjectSerialization 对象输入、输出 :ObjectInputStream、ObjectOutputStream
     5.DataConversion 数据流 按基本数据类型读、写(处理的数据是 Java 的基本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream
     6.Printing 包含方便的打印方法 :PrintWriter、PrintStream
     7.Buffering 缓冲  在读入或写出时,对数据进行缓存,以减少 I/O 的次数:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
     8.Filtering 滤流,在数据进行读或写时进行过滤:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream 过
     9.Concatenation 合并输入 把多个输入流连接成一个输入流 :SequenceInputStream 
    10.Counting 计数  在读入数据时对行记数 :LineNumberReader、LineNumberInputStream
    11.Peeking Ahead 通过缓存机制,进行预读 :PushbackReader、PushbackInputStream
    12.Converting between Bytes and Characters 按照一定的编码 / 解码标准将字节流转换为字符流,或进行反向转换(Stream 到 Reader,Writer 的转换类):InputStreamReader、OutputStreamWriter

2)按数据来源(去向)分类: 

  1. File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter 

  2. byte[]:ByteArrayInputStream, ByteArrayOutputStream 

  3. Char[]: CharArrayReader, CharArrayWriter 

  4. String: StringBufferInputStream, StringReader, StringWriter 

  5. 网络数据流:InputStream, OutputStream, Reader, Writer 

七. 字节流 InputStream/OutputStream 

1:InputStream 抽象类 

      InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 继承自 InputStream  的流都是向程序中输入数据的,且数据单位为字节(8bit);

InputStream 是输入字节数据用的类,所以 InputStream 类提供了 3 种重载的 read 方法.Inputstream 类中的常用方法: 
  (1) public abstract int read ( ):读取一个 byte 的数据,返回值是高位补 0 的 int 类型值。若返回值 =-1 说明没有读取到任何字节读取工作结束。
  (2) public int read (byte b []):读取 b.length 个字节的数据放到 b 数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的 
  (3) public int read (byte b [], int off, int len):从输入流中最多读取 len 个字节的数据,存放到偏移量为 off 的 b 数组中。 
  (4) public int available ( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果 InputStream 对象调用这个方法的话,它只会返回 0,这个方法必须由继承 InputStream 类的子类对象调用才有用, 
  (5) public long skip (long n):忽略输入流中的 n 个字节,返回值是实际忽略的字节数,跳过一些字节来读取 
  (6) public int close ( ) :我们在使用完后,必须对我们打开的流进行关闭. 

         主要的子类:

         1) FileInputStream 把一个文件作为 InputStream,实现对文件的读取操作     
    2) ByteArrayInputStream:把内存中的一个缓冲区作为 InputStream 使用 
    3) StringBufferInputStream:把一个 String 对象作为 InputStream 
    4) PipedInputStream:实现了 pipe 的概念,主要在线程中使用 
    5) SequenceInputStream:把多个 InputStream 合并为一个 InputStream 

2:OutputStream 抽象类 

  OutputStream 提供了 3 个 write 方法来做数据的输出,这个是和 InputStream 是相对应的。 
  1. public void write (byte b []):将参数 b 中的字节写到输出流。 
  2. public void write (byte b [], int off, int len) :将参数 b 的从偏移量 off 开始的 len 个字节写到输出流。 
  3. public abstract void write (int b) :先将 int 转换为 byte 类型,把低字节写入到输出流中。 
  4. public void flush ( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。 
  5. public void close ( ) : 关闭输出流并释放与流相关的系统资源。 

       主要的子类:

      1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 
      2) FileOutputStream:把信息存入文件中 
      3) PipedOutputStream:实现了 pipe 的概念,主要在线程中使用 
      4) SequenceOutputStream:把多个 OutStream 合并为一个 OutStream 

流结束的判断:方法 read () 的返回值为 - 1 时;readLine () 的返回值为 null 时。

3:文件输入流: FileInputStream 类

      FileInputStream 可以使用 read () 方法一次读入一个字节,并以 int 类型返回,或者是使用 read () 方法时读入至一个 byte 数组,byte 数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个 byte 数组通常被当作缓冲区,因为这么一个 byte 数组通常扮演承接数据的中间角色。

作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。
使用方法 (1)    
   

  File  fin=new File("d:/abc.txt"); 
  FileInputStream in=new FileInputStream( fin);

使用方法 (2)
   

FileInputStream  in=new  FileInputStream(“d: /abc.txt”);

程序举例:
将 InputFromFile.java 的程序的内容显示在显示器上

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

public class TestFile {  
    public static void main(String args[]) throws IOException {  
        try{      
               FileInputStream rf=new   FileInputStream("InputFromFile.java");  
               int n=512;   byte  buffer[]=new  byte[n];     
               while((rf.read(buffer,0,n)!=-1)&&(n>0)){  
                   System.out.println(new String(buffer) );  
                }  
                System.out.println();  
                rf.close();  
        } catch(IOException  IOe){        
              System.out.println(IOe.toString());  
        }  
  
    }  
  
}

4:文件输出流:FileOutputStream 类

   作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件

      FileOutputStream 类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是 File 或 FileDescriptor 对象。 
  创建一个文件流对象有两种方法: 
  方式 1: 
   File   f=new  File (“d:/myjava/write.txt ");
        FileOutputStream  out= new FileOutputStream (f);
  方式 2: 
  FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt "); 
  方式 3:构造函数将 FileDescriptor () 对象作为其参数。 
  FileDescriptor() fd=new FileDescriptor(); 
  FileOutputStream f2=new FileOutputStream(fd); 
  方式 4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。 
  FileOutputStream f=new FileOutputStream("d:/abc.txt",true); 
  注意: (1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读 / 写操作结束时,应调用 close 方法关闭流。

程序举例:使用键盘输入一段文章,将文章保存在文件 write.txt 中

import java.io.IOException;  
import java.io.FileOutputStream;  
public class TestFile {  
    public static void main(String args[]) throws IOException {  
        try {  
            System.out.println("please Input from      Keyboard");  
            int count, n = 512;  
            byte buffer[] = new byte[n];  
            count = System.in.read(buffer);  
            FileOutputStream wf = new FileOutputStream("d:/myjava/write.txt");  
            wf.write(buffer, 0, count);  
            wf.close(); // 当流写操作结束时,调用close方法关闭流。  
            System.out.println("Save to the write.txt");  
        } catch (IOException IOe) {  
            System.out.println("File Write Error!");  
        }  
    }  
  
}

5:FileInputStream 流和 FileOutputStream 的应用

利用程序将文件 file1.txt 拷贝到 file2.txt 中。

import java.io.File;  
import java.io.IOException;  
import java.io.FileOutputStream;  
import java.io.FileInputStream;  
  
public class TestFile {  
    public static void main(String args[]) throws IOException {  
        try {  
            File inFile = new File("copy.java");  
            File outFile = new File("copy2.java");  
            FileInputStream finS = new FileInputStream(inFile);  
            FileOutputStream foutS = new FileOutputStream(outFile);  
            int c;  
            while ((c = finS.read()) != -1) {  
                foutS.write(c);  
            }  
            finS.close();  
            foutS.close();  
        } catch (IOException e) {  
            System.err.println("FileStreamsTest: " + e);  
        }  
    }  
  
}

 6:缓冲输入输出流 BufferedInputStream/ BufferedOutputStream

       计算机访问外部设备非常耗时。访问外存的频率越高,造成 CPU 闲置的概率就越大。为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。为此,除了程序和流节点间交换数据必需的读写机制外,还应该增加缓冲机制。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。

BufferedInputStream: 当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。

BufferedOutputStream : 当从向缓冲流读取数据时候,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取数据到缓冲区。

1)将文件读入内存:

将 BufferedInputStream 与 FileInputStream 相接 

  FileInputStream in = new FileInputStream(“file1.txt ”);

  BufferedInputStream bin = new BufferedInputStream(in); 

2)将内存写入文件:

将 BufferedOutputStream 与 FileOutputStream 相接

FileOutputStreamout = new FileOutputStream(“file1.txt”);

BufferedOutputStream bin = new BufferedInputStream(out);


3)键盘输入流读到内存

将 BufferedReader 与标准的数据流相接  

InputStreamReader sin = new InputStreamReader (System.in) ;

BufferedReader bin = new BufferedReader(sin);

import java.io.*;  
  
public class ReadWriteToFile {  
    public static void main(String args[]) throws IOException {  
        InputStreamReader sin = new InputStreamReader(System.in);  
        BufferedReader bin = new BufferedReader(sin);  
        FileWriter out = new FileWriter("myfile.txt");  
        BufferedWriter bout = new BufferedWriter(out);  
        String s;  
        while ((s = bin.readLine()).length() > 0) {  
            bout.write(s, 0, s.length());  
        }  
  
    }  
}

程序说明:
从键盘读入字符,并写入到文件中 BufferedReader 类的方法:String readLine()
作用:读一行字符串,以回车符为结束。
BufferedWriter 类的方法:bout.write(String s,offset,len)
作用:从缓冲区将字符串 s 从 offset 开始,len 长度的字符串写到某处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/223919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多向通信----多人聊天

package 多人聊天; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; publ…

信道的极限容量

目录 信道的最高码元传输速率 限制码元在信道上的传输速率的因素: (1)信道能够通过的频率范围 (2) 信噪比 任何实际的信道都不是理想的,在传输信号时会产生各种失真以及带来多种干扰。 码元传输的速率越…

Avalonia中如何将View事件映射到ViewModel层

前言 前面的文章里面我们有介绍在Wpf中如何在View层将事件映射到ViewModel层的文章,传送门,既然WPF和Avalonia是两套不同的前端框架,那么WPF里面实现模式肯定在这边就用不了,本篇我们将分享一下如何在Avalonia前端框架下面将事件…

如何配置WinDbg和VMware实现内核的调试

设置 VMware 的虚拟串口 运行 VMware,首先将 Guest OS 系统电源关闭,这样才能修改该系统的虚拟机设置。 单击界面上的“编辑虚拟机设置”选项对虚拟机的属性进行设置。 单击“添加”按钮,打开 VMware 的 添加硬件向导 对话框 选择“串行端口…

构建第一个事件驱动型 Serverless 应用

我相信,我们从不缺精彩的应用创意,我们缺少的把这些想法变成现实的时间和付出。 我认为,无服务器技术真的有助于最大限度节省应用开发和部署的时间,并且无服务器技术用可控的成本,实现了我的那些有趣的想法。 在我 2…

c语言笔记之文件操作

16 文件操作 嵌入式开发中基本用不上,这章不重要 a 字符集:泛泛意义上的文本文件中的数据与磁盘中保存的二进制之间的映射关系。 常见的字符集:ASCLL,Latin,GB2312,GBK,UTF-8 解码过程:从看不懂到看得懂的过程。 ​ 如果操作时…

02Docker容器卷

Docker容器卷 1.数据卷是什么 简而言之: 就是Docker用来存储数据的,在镜像被删除的时候,卷中数据不会被删除,就是相当于一个数据库备份数据,相当于Windows中的目录或文件 2.目的 解决数据持久化 独立容器的生存周期,帮助容器间继承和共享数据 3.数据卷的使用 1.直接添加 doc…

Linux 多线程(C语言) 备查

基础 1)线程在运行态和就绪态不停的切换。 2)每个线程都有自己的栈区和寄存器 1)进程是资源分配的最小单位,线程是操作系统调度执行的最小单位 2)线程的上下文切换的速度比进程快得多 3)从应用程序A中启用应…

【UE】制作地月全息投影

效果 步骤 1. 在必应国际版上搜索“purlin noise”,下载如下所示图片 再搜索“Earth Map”,下载如下所示图片 再搜索“Moon 360”,下载如下所示图片 这三张图片的资源链接如下: 链接:https://pan.baidu.com/s/1b_50q…

Leetcode每日一题学习训练——Python3版(最小化旅行的价格总和)

版本说明 当前版本号[20231206]。 版本修改说明20231206初版 目录 文章目录 版本说明目录最小化旅行的价格总和理解题目代码思路参考代码 原题可以点击此 2646. 最小化旅行的价格总和 前去练习。 最小化旅行的价格总和 现有一棵无向、无根的树,树中有 n 个节点…

【Spark学习笔记】- 5.1 IO基本实现原理

IO基本实现原理 Input& Output 字节流 InputStream in new FileInputStream("path") int i -1while ( (i in.read()) ! -1 ) {println(i); }上述为字节流 需要一个字节一个字节读取数据,读一个打印一个。功能可以实现,效率不高。 缓…

9_企业架构队列缓存中间件分布式Redis

企业架构队列缓存中间件分布式Redis 学习目标和内容 1、能够描述Redis作用及其业务适用场景 2、能够安装配置启动Redis 3、能够使用命令行客户端简单操作Redis 4、能够实现操作基本数据类型 5、能够理解描述Redis数据持久化机制 6、能够操作安装php的Redis扩展 7、能够操作实现…

AI跨界学习,不再是梦!

大家好!今天给大家推荐的 GPTs 是【行业知识脉络】,帮助大家快速了解某个领域的脉络,并提供足够的学习资料和建议。 在AI时代,从小白到专家的1万小时定律即将失效,用少于1千小时掌握行业知识树和其核心概念是如何学习的…

内核无锁队列kfifo

文章目录 1、抛砖引玉2、内核无锁队列kfifo2.1 kfifo结构2.2 kfifo分配内存2.3 kfifo初始化2.4 kfifo释放2.5 kfifo入队列2.6 kfifo出队列2.7 kfifo的判空和判满2.8 关于内存屏障 1、抛砖引玉 昨天遇到这样一个问题,有多个生产者,多个消费者&#xff0c…

使用Java网络编程,窗口,线程,IO,内部类等实现多人在线聊天1.0

1.整体思路 思路图 整体思路如上: 涉及知识点:线程网络编程集合IO等 TCP 协议 2.代码实现过程 服务端 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import jav…

SQL手工注入漏洞测试(Sql Server数据库)-墨者

———靶场专栏——— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 靶场背景: 来源: 墨者学院 简介: 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

大模型应用设计的10个思考

技术不是万能的,但没有技术却可能是万万不能的,对于大模型可能也是如此。基于大模型的应用设计需要聚焦于所解决的问题,在自然语言处理领域,大模型本身在一定程度上只是将各种NLP任务统一成了sequence 到 sequence 的模型。利用大…

使用 Webshell 访问 SQL Server 主机并利用 SSRS

本文将指导您使用RDS SQL Server实例的主机账号登录和管理SQL Server Reporting Services(SSRS)数据库。 背景信息 RDS SQL Server提供Webshell功能,用户可以通过Web界面登录RDS SQL Server实例的操作系统。通过Webshell,用户可…

一次重新加载所有 maven 项目产生的 OOM

1、解决什么问题? 忘了截图了,用文字描述就是由于Reload All Maven Projects导致的 OOM 异常。 2、尝试与解决 2.1、尝试 2.1.1、尝试清理idea缓存(无效) 2.1.2、重启idea(无效) 2.1.3、重启电脑&am…

硬件连通性测试对象与实施过程

硬件连通性测试是一种系统性的测试方法,用于验证硬件设备之间的连接、通信和协作是否正常。这包括各种硬件组件,如计算机、网络设备、传感器、打印机等。测试的目的是确保硬件设备在其设计和运行环境中能够正确地交互和通信。 一、硬件连通性测试对象 网…