java IO学习笔记

2023-10-30

       Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。

       Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。 

 

( 一 )以字节为导向的 stream------InputStream/OutputStream

InputStream 和 OutputStream 是两个 abstact 类,对于字节为导向的 stream 都扩展这两个鸡肋(基类 ^_^ ) ;

1、 InputStream

 

1.1

ByteArrayInputStream -- 把内存中的一个缓冲区作为 InputStream 使用 .

construct---

(A)ByteArrayInputStream(byte[]) 创建一个新字节数组输入流( ByteArrayInputStream ),它从指定字节数组中读取数据( 使用 byte 作为其缓冲区数组)

(B)---ByteArrayInputStream(byte[], int, int) 创建一个新字节数组输入流,它从指定字节数组中读取数据。

---mark:: 该字节数组未被复制。

1.2

StringBufferInputStream -- 把一个 String 对象作为 InputStream .

construct---  

StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。

 

注释:不推荐使用 StringBufferInputStream 方法。 此类不能将字符正确的转换为字节。

同 JDK 1.1 版中的类似,从一个串创建一个流的最佳方法是采用 StringReader 类。

1.3

FileInputStream -- 把一个文件作为 InputStream ,实现对文件的读取操作

construct---

(A)FileInputStream(File name) 创建一个输入文件流,从指定的 File 对象读取数据。

(B)FileInputStream(FileDescriptor) 创建一个输入文件流,从指定的文件描述器读取数据。

(C)-FileInputStream(String  name) 创建一个输入文件流,从指定名称的文件读取数据。

method ---- read() 从当前输入流中读取一字节数据。

read(byte[]) 将当前输入流中 b.length 个字节数据读到一个字节数组中。

read(byte[], int, int) 将输入流中 len 个字节数据读入一个字节数组中。

1.4

PipedInputStream :实现了 pipe 的概念,主要在线程中使用 . 管道输入流是指一个通讯管道的接收端。

一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。

construct---

PipedInputStream() 创建一个管道输入流,它还未与一个管道输出流连接。

PipedInputStream(PipedOutputStream) 创建一个管道输入流 , 它已连接到一个管道输出流。

1.5

SequenceInputStream :把多个 InputStream 合并为一个 InputStream . “序列输入流”类允许应用程序把几个输入流连续地合并起来,

并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。

然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。

construct---

SequenceInputStream(Enumeration) 创建一个新的序列输入流,并用指定的输入流的枚举值初始化它。

SequenceInputStream(InputStream, InputStream) 创建一个新的序列输入流,初始化为首先 读输入流 s1, 然后读输入流 s2 。

 

2、 OutputSteam

 

2.1

ByteArrayOutputStream : 把信息存入内存中的一个缓冲区中 . 该类实现一个以字节数组形式写入数据的输出流。

当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。

constructor

(A)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。

(B)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。

(C)--- ByteArrayOutputStream(int) 创建一个新的字节数组输出流,并带有指定大小字节的缓冲区容量。

toString(String) 根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符。

write(byte[], int, int) 将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。

write(int) 将指定字节写入该字节数组输出流。

writeTo(OutputStream) 用 out.write(buf, 0, count) 调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数。

2.2  

FileOutputStream: 文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。

constructor

(A)FileOutputStream(File  name) 创建一个文件输出流,向指定的 File 对象输出数据。

(B)FileOutputStream(FileDescriptor) 创建一个文件输出流,向指定的文件描述器输出数据。

(C)FileOutputStream(String  name) 创建一个文件输出流,向指定名称的文件输出数据。

(D)FileOutputStream(String, boolean) 用指定系统的文件名,创建一个输出文件。

2.3

PipedOutputStream: 管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,

而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。

constructor

(A)PipedOutputStream() 创建一个管道输出流,它还未与一个管道输入流连接。

(B)PipedOutputStream(PipedInputStream) 创建一个管道输出流,它已连接到一个管道输入流。

 

( 二 )以字符为导向的 stream Reader/Writer

以 Unicode 字符为导向的 stream ,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。

Reader/Writer 为 abstact 类

以 Unicode 字符为导向的 stream 包括下面几种类型:

1. Reader

 

1.1

  CharArrayReader :与 ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区

constructor

CharArrayReader(char[]) 用指定字符数组创建一个 CharArrayReader 。

CharArrayReader(char[], int, int) 用指定字符数组创建一个 CharArrayReader

1.2

StringReader : 与 StringBufferInputStream 对应其源为一个字符串的字符流。

StringReader(String) 创建一新的串读取者。

1.3

FileReader : 与 FileInputStream 对应

1.4

PipedReader :与 PipedInputStream 对应

 

2.  Writer


2.1    CharArrayWrite : 与 ByteArrayOutputStream 对应

2.2   StringWrite :无与之对应的以字节为导向的 stream

2.3  FileWrite : 与 FileOutputStream 对应

2.4  PipedWrite :与 PipedOutputStream 对应

 

3、两种不同导向的 stream 之间的转换  

3.1

InputStreamReader 和 OutputStreamReader :

把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。

InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。

使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。

InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。

为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader ,

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

例如: // 实现从键盘输入一个整数

  1. String s = null;             
  2. InputStreamReader re = new InputStreamReader(System.in);  
  3.               BufferedReader br = new BufferedReader(re);  
  4.               try {  
  5.               s = br.readLine();  
  6.               System.out.println("s= " + Integer.parseInt(s));  
  7.               br.close();  
  8.               }  
  9.               catch (IOException e)  
  10.               {  
  11.               e.printStackTrace();  
  12.               }  
  13.               catch (NumberFormatException e)// 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。  
  14.               {  
  15.               System.out.println(" 输入的不是数字 ");  
  16.               }  

InputStreamReader(InputStream) 用缺省的字符编码方式,创建一个 InputStreamReader 。

InputStreamReader(InputStream, String) 用已命名的字符编码方式,创建一个 InputStreamReader 。

 

OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。

每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。

 

(三)Java IO 的一般使用原则 :  

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

1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )

5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三、按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )

四、按数据格式分:

1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类

五、按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

首先,考虑最原始的数据格式是什么: 原则四

第二,是输入还是输出:原则五

第三,是否需要转换流:原则六第 1 点

第四,数据来源(去向)是什么:原则一

第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出:原则二


本文转自:http://blog.csdn.net/ilibaba/article/details/3955799

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java IO学习笔记 的相关文章

  • 初始向量(IV)的CTR模式使用

    据我所知 CTR 模式不使用初始向量 它只需要一个计数器 用给定的密钥对其进行加密 然后将结果与明文进行异或以获得密文 其他分组密码模式 例如 CBC 在进行加密之前 会使用初始向量对明文进行异或 所以这是我的问题 我在 Java 中有以下
  • 如何调试使用maven构建的android应用程序

    我目前正在尝试从 Eclipse 调试我的设备上的 Android 应用程序 设备已添加 我可以在控制台和 Eclipse 中看到它 控制台 Windows adb devices List of devices attached 0019
  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • Junit Mockito 测试一切

    我现在正在寻找更多时间但没有结果 请帮忙 这是我要测试的课程 public class DBSelectSchema extends Database private static final Logger LOG Logger getLo
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 向 JList 添加滚动条? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将 JList 添加到 JScrollPane 把你的JList in a JScrollPane JScrollPane scrol
  • Java 中支持多少维数组,例如 a[1][1][1][1]....[1]? [复制]

    这个问题在这里已经有答案了 Java支持多少维数组a 1 1 1 1 1 我可以为数组声明无限数量的维度吗 数组维数限制为 255 有趣的是 JLS定义的Java编程语言没有这样的限制 但是你可以在JVM规范 http docs oracl
  • 在 SWT 中单击鼠标触发事件?

    在SWT中 对于MouseListener接口 可用的方法有mouseUp mouseDown and mouseDoubleClick 如何根据用户点击触发事件 我们可以通过结合来做到这一点mouseUp and mouseDown 但没
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • 如何知道 glassfish 是什么 - 完整平台或网络配置文件?

    我已经安装了glassfish 我可以跑 asadmin version 它显示了它是什么版本 但如何知道它是 完整平台 还是 Web 配置文件 你可以使用 glassfish4 bin gt asadmin list containers
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • 经典面试题 之 哨兵(Sentinel)模式

    1 什么是哨兵模式 反客为主的自动版 能够自动监控master是否发生故障 如果故障了会根据投票数从slave中挑选一个作为master 其他的slave会自动转向同步新的master 实现故障自动转义 2 原理 sentinel会按照指定
  • 刺激战场怎么战斗服务器响应超时,绝地求生刺激战场网络延迟高怎么办 网络延迟解决方法...

    类型 动作射击大小 669 2M语言 中文 评分 4 0 标签 立即下载 绝地求生刺激战场这款射击游戏很受玩家的喜欢 玩家在游戏中可以随时开局吃鸡 不过这款游戏的网络要求会比较高 不然很然后被杀死 那绝地求生刺激战场网络延迟高怎么办 西西小
  • 【美赛】2023年MCM问题Y:理解二手帆船价格(代码&思路)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 数据与术语表 2 1 数据 2 2 术语表 3 超级软件分享与资源下载 3 1 软件分享 3 2 资源
  • 归并排序 mergeSort

    归并排序 mergeSort 基本概念 归并排序的实现 时间复杂度 和 空间复杂度 稳定性 基本概念 将一个数组不断的二分 直到不能分为止 然后将不断对比合并 归并排序适用于链表 不需要额外的储存空间 但是对于数组 需要额外的储存空间 归并
  • push本地代码到gitlab出错

    push本地代码到gitlab出错 刚创建的gitlab版本库 在push代码时出错 git push u origin master To git github com Demo git rejected master gt master
  • getaddrinfo函数解析

    IPv4中使用gethostbyname 函数完成主机名到地址解析 这个函数仅仅支持IPv4 且不允许调用者指定所需地址类型的任何信息 返回的结构只包含了用于存储IPv4地址的空间 IPv6中引入了getaddrinfo 的新API 它是协
  • mysql jdbc 连接串_Mysql JDBC 连接串参数说明

    MySQL的 JDBC URL 格式 for Connector J 如下例 jdbc mysql host port host port database 参数名1 参数值1 参数名2 参数值2 现只列举几个重要的参数 如下表所示 参数说
  • python函数装饰器

    文章目录 一 简单了解装饰器 二 装饰器练习 三 多个装饰器 四 装饰器拓展 1 基础版 无参数的装饰器 2 升级版 有参数的装饰器 一 简单了解装饰器 装饰器 Decorators 是 Python 的一个重要部分 简单地说 他们是修改其
  • Lua基础之coroutine(协程)

    概括 1 创建协程2 coroutine的函数3 coroutine的基本流程4 yield对coroutine流程的干预5 resume function 以及yield之间的参数传递和返回值传递 原文地址 http blog csdn
  • 一文看懂Python系列之装饰器(decorator)(工作面试必读)

    Python的装饰器 decorator 可以说是Python的一个神器 它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能 Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识 小编我当初学习Py
  • 单纯性法解有约束的线性规划问题

    程序功能 1 单纯性法解有约束的线性规划问题 2 标准形式的约束问题 目标函数求最小值 约束化为等式 引入松弛变量 变量全为非负 3 目标函数Z行系数全为非正数 则停止计算 RHS列对应系数为目标值x 化为标准形式之后 形参的意义 4 A是
  • 如何冻结模型,避免 model.train() 改变模型部分模块

    如何永久冻结参数 for name param in self llm model named parameters param requires grad False 虽然以上代码可以冻结模型参数 但无法保证冻结整个模型 model tr
  • gdb 调试子进程

    调试指令如下 gdb fork set follow fork mode child set detach on fork off b fork cpp 13 r 打断点可以打到fork的位置 这样就可以进入到子进程调试 follow fo
  • kali linux调整分区,kali linux 手动分区,不要再盲目的选自动  格式化自己的电脑...

    1 制作一个kali linux启动盘 2 将启动盘插入电脑选择 Grapical install 图形界面安装 附 Install 顾名思义那就是安装了 这是纯字符化界面的安装 Graphical install 这个是图形化界面的安装方
  • IDEA2020-Tomcat热部署两种方法(修改class后不用重启tomcat)

    第一种 第一种也是最常见的 修改为Update classes and resources 不过我的有Update classes and resources这个选项 设置之后 依旧没用 大家可以先康康这个 1 如图 选择Edit Conf
  • 遗传算法简介

    遗传算法简介1 美国Michigan大学的Holland教授及其学生收到生物模拟技术的启发 创造出了一种基于生物遗传和进化机制的适合与复杂系统优化的自适应概率优化技术 遗传算法 1967年 Holland的学生Bagley在其博士论文中首次
  • ESP32-CAM接收串口消息在串口输出

    static String comdata 串口接受数据 while Serial available gt 0 串口收到字符数大于零 comdata char Serial read if comdata 如果接受到数据 Serial p
  • linux调用海康.so

    1 下载SDK 2 把 so包放到一个目录 然后 pro包含 3 把头文件放进去 然后包含 4 上面做的qtcreato可以调用编辑了 如果在源目录下运行需要把库放到 usr lib 5 如果用gnome seiion开机启动还要把hc的文
  • 拉链表...

    目录 什么是拉链表 拉链表的作用 拉链表的形成 什么是拉链表 一张表存储的每一条信息就是一条记录的一个生命周期 这样的表格即为拉链表 拉链表的作用 用于记录一些 会发生变化但是变换频率不高的数据 比如某人的某个手机号使用情概况 通过对于日期
  • java IO学习笔记

    Java 流在处理上分为字符流和字节流 字符流处理的单元为 2 个字节的 Unicode 字符 分别操作字符 字符数组或字符串 而字节流处理单元为 1 个字节 操作字节和字节数组 Java 内用 Unicode 编码存储字符 字符流处理类负