




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java io 详解 什么是什么是 IO IO Input Output 是计算机输出 输出的接口 Java 的核心库 java io 提供了全面的 IO 接口 包括 文件读写 标准设备输 出等等 Java 中 IO 是以流为基础进行输入输出的 所有数据被串行化写入输出流 或者从输入流读入 此外 Java 也对块传输 提供支持 在核心库 java nio 中采用的便是块 IO 关于 NIO 我们在后面还有专门的讨论 流 IO 的好处是简单易用 缺点是效率较低 块 IO 效率很高 但编程比较复杂 Java IO 模型模型 Java 的 IO 模型设计非常优秀 它使用 Decorator 模式 按功能划分 Stream 您可以动态装配这些 Stream 以便获得您需 要的功能 例如 您需要一个具有缓冲的文件输入流 则应当组合使用 FileInputStream 和 BufferedInputStream Java 的 IO 体系分 Input Output 和 Reader Writer 两类 区别在于 Reader Writer 在读写文本时能自动转换内码 基本上 所 有的 IO 类都是配对的 即有 XxxInput 就有一个对应的 XxxOutput Java IO 教程教程 如果您对 Decorator 模式非常了解 就能轻易地看出 Java 的 IO 类结构 根接口是 InputStream OutputStream 充当数据源 的 IO 类有 FileInputStream FileOutputStream ByteArrayInputStream ByteArrayOutputStream 等 充当装饰功能的 IO 类有 BufferedInputStream BufferedOutputStream DataInputStream DataOutputStream 等 它们都是继承装饰接口 FilterInputStream FilterOutputStream 使用 IO 时 首先创建一个数据源 IO 然后根据需要的功能创建装饰类 IO 其构造函数的 参数为已创建的数据源 IO 我们以创建一个具有缓冲的文件输入流为例 假定需要从磁盘读取文件 C log txt 创建一个 FileInputStream FileInputStream fileInput new FileInputStream C log txt 创建一个 BufferedInputStream BufferedInputStream bufferedInput new BufferedInputStream fileInput 现在得到的 bufferedInput 即是具有缓冲的文件输入流或者进一步简写如下 InputStream input new BufferedInputStream new FileInputStream C log txt 现在得到的 input 即是具有缓冲的文件输入流 在您对 Java 的 IO 有了总体了解后 我们推荐您看看教程 Introduction to Java I O 和 I O Reading and Writing 浅谈浅谈 java 输入输出流输入输出流 一 字符流与字节流的区别 Java 流在处理上分为字符流和字节流 字符流处理的单元为 2 个字节的 Unicode 字符 分别操作字符 字符数组或字符 串 而字节流处理单元为 1 个字节 操作字节和字节数组 Java 内用 Unicode 编码存储字符 字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换 而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换 字符流 一次可以处理一个缓冲区 一次操作比 字节流 一次一个字节 效率高 一一 以字节为导向的以字节为导向的 stream InputStream OutputStream InputStream 和 OutputStream 是两个 abstact 类 对于字节为导向的 stream 都扩展这两个鸡肋 基类 1 InputStream 1 1 ByteArrayInputStream 把内存中的一个缓冲区作为 InputStream 使用 A ByteArrayInputStream byte 创建一个新字节数组输入流 ByteArrayInputStream 它从指定字节数组中读取数 据 使用 byte 作为其缓冲区数组 B ByteArrayInputStream byte int int 创建一个新字节数组输入流 它从指定字节数组中读取数据 注 该字节数组未被复制 1 2 StringBufferInputStream 把一个 String 对象作为 InputStream StringBufferInputStream String 据指定串创建一个读取数据的输入流串 注释 不推荐使用 StringBufferInputStream 方法 此类不能将字符正确的转换为字节 同 JDK 1 1 版中的类似 从一个串创建一个流的最佳方法是采用 StringReader 类 1 3 FileInputStream 把一个文件作为 InputStream 实现对文件的读取操作 A FileInputStream File name 创建一个输入文件流 从指定的 File 对象读取数据 B FileInputStream FileDescriptor 创建一个输入文件流 从指定的文件描述器读取数据 C FileInputStream String name 创建一个输入文件流 从指定名称的文件读取数据 方法 read 从当前输入流中读取一字节数据 read byte 将当前输入流中 b length 个字节数据读到一个字节数组中 read byte int int 将输入流中 len 个字节数据读入一个字节数组中 1 4 PipedInputStream 实现了 pipe 的概念 主要在线程中使用 管道输入流是指一个通讯管道的接收端 一个线程通过管道输出流发送数据 而另一个线程通过管道输入流读取数据 这样可实现两个线程间的通讯 PipedInputStream 创建一个管道输入流 它还未与一个管道输出流连接 PipedInputStream PipedOutputStream 创建一个管道输入流 它已连接到一个管道输出流 1 5 SequenceInputStream 把多个 InputStream 合并为一个 InputStream 序列输入流 类允许应用程序把几个输入流连续地 合并起来 并且使它们像单个输入流一样出现 每个输入流依次被读取 直到到达该流的末尾 然后 序列输入流 类关闭这个流并 自动地切换到下一个输入流 SequenceInputStream Enumeration 创建一个新的序列输入流 并用指定的输入流的枚举值初始化它 SequenceInputStream InputStream InputStream 创建一个新的序列输入流 初始化为首先 读输入流 s1 然后读输入流 s2 2 OutputSteam 2 1 ByteArrayOutputStream 把信息存入内存中的一个缓冲区中 该类实现一个以字节数组形式写入数据的输出流 当数据写入缓冲区时 它自动扩大 用 toByteArray 和 toString 能检索数据 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 输出数据的一个输出流 A FileOutputStream File name 创建一个文件输出流 向指定的 File 对象输出数据 B FileOutputStream FileDescriptor 创建一个文件输出流 向指定的文件描述器输出数据 C FileOutputStream String name 创建一个文件输出流 向指定名称的文件输出数据 D FileOutputStream String boolean 用指定系统的文件名 创建一个输出文件 2 3 PipedOutputStream 管道输出流是指一个通讯管道的发送端 一个线程通过管道输出流发送数据 而另一个线程通过管道输入流读取数据 这样可实现两个线程间的通讯 A PipedOutputStream 创建一个管道输出流 它还未与一个管道输入流连接 B PipedOutputStream PipedInputStream 创建一个管道输出流 它已连接到一个管道输入流 二二 以字符为导向的以字符为导向的 stream Reader Writer 以 Unicode 字符为导向的 stream 表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息 Reader Writer 为 abstact 类 以 Unicode 字符为导向的 stream 包括下面几种类型 1 Reader 1 1 CharArrayReader 与 ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区 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 对应 以字符为导向的 stream 基本上有与之相对应的以字节为导向的 stream 两个对应类实现的功能相同 只是在操作时的导向 不同 如 CharArrayReader 和 ByteArrayInputStream 的作用都是把内存中的一个缓冲区作为 InputStream 使用 所不同的是前 者每次从内存中读取一个字节的信息 而后者每次从内存中读取一个字符 Reader 和 Writer 要解决的 最主要的问题就是国际化 原先的 I O 类库只支持 8 位的字节流 因此不可能很好地处理 16 位 的 Unicode 字符流 Unicode 是国际化的字符集 更何况 Java 内置的 char 就是 16 位的 Unicode 字符 这样加了 Reader 和 Writer 之后 所有的 I O 就都支持 Unicode 了 此外新类库的性能也比旧的好 但是 Read 和 Write 并不是取代 InputStream 和 OutputStream 有时 你还必须同时使用 基于 byte 的类 和 基于字符的类 为此 它还提供了两个 适配器 adapter 类 InputStreamReader 负责将 InputStream 转化成 Reader 而 OutputStreamWriter 则将 OutputStream 转化成 Writer 3 两种不同导向的 stream 之间的转换 3 1 InputStreamReader 和 OutputStreamReader 把一个以字节为导向的 stream 转换成一个以字符为导向的 stream InputStreamReader 类是从字节流到字符流的桥梁 它读入字节 并根据指定的编码方式 将之转换为字符流 使用的编码方式可能由名称指定 或平台可接受的缺省编码方式 InputStreamReader 的 read 方法之一的每次调用 可能促使从基本字节输入流中读取一个或多个字节 为了达到更高效率 考虑用 BufferedReader 封装 InputStreamReader BufferedReader in new BufferedReader new InputStreamReader System in 例如 实现从键盘输入一个整数 view plaincopy to clipboardprint String s null InputStreamReader re new InputStreamReader System in BufferedReader br new BufferedReader re try s br readLine System out println s Integer parseInt s br close catch IOException e e printStackTrace 当应用程序试图将字符串转换成一种数值类型 但该字符串不能转换为适当格式时 抛出该异常 catch NumberFormatException e System out println 输入的不是数字 InputStreamReader InputStream 用缺省的字符编码方式 创建一个 InputStreamReader InputStreamReader InputStream String 用已命名的字符编码方式 创建一个 InputStreamReader OutputStreamWriter 将多个字符写入到一个输出流 根据指定的字符编码将多个字符转换为字节 每个 OutputStreamWriter 合并它自己的 CharToByteConverter 因而是从字符流到字节流的桥梁 2 stream 添加属性 2 1 为 stream 添加属性 的作用 运用上面介绍的 Java 中操作 IO 的 API 我们就可完成我们想完成的任何操作了 但通过 FilterInputStream 和 FilterOutStream 的子类 我们可以为 stream 添加属性 下面以一个例子来说明这种功能的作用 如果我们要往一个文件中写入数据 我们可以这样操作 FileOutStream fs new FileOutStream test txt 然后就可以通过产生的 fs 对象调用 write 函数来往 test txt 文件中写入数据了 但是 如果我们想实现 先把要写入文件的 数据先缓存到内存中 再把缓存中的数据写入文件中 的功能时 上面的 API 就没有一个能满足我们的需求了 但是通过 FilterInputStream 和 FilterOutStream 的子类 为 FileOutStream 添加我们所需要的功能 2 2 FilterInputStream 的各种类型 2 2 1 用于封装以字节为导向的 InputStream 1 DataInputStream 从 stream 中读取基本类型 int char 等 数据 2 BufferedInputStream 使用缓冲区 3 LineNumberInputStream 会记录 input stream 内的行数 然后可以调用 getLineNumber 和 setLineNumber int 4 PushbackInputStream 很少用到 一般用于编译器开发 2 2 2 用于封装以字符为导向的 InputStream 1 没有与 DataInputStream 对应的类 除非在要使用 readLine 时改用 BufferedReader 否则使用 DataInputStream 2 BufferedReader 与 BufferedInputStream 对应 3 LineNumberReader 与 LineNumberInputStream 对应 4 PushBackReader 与 PushbackInputStream 对应 2 3 FilterOutStream 的各种类型 2 2 3 用于封装以字节为导向的 OutputStream 1 DataIOutStream 往 stream 中输出基本类型 int char 等 数据 2 BufferedOutStream 使用缓冲区 3 PrintStream 产生格式化输出 2 2 4 用于封装以字符为导向的 OutputStream 1 BufferedWrite 与对应 2 PrintWrite 与对应 3 RandomAccessFile 1 可通过 RandomAccessFile 对象完成对文件的读写操作 2 在产生一个对象时 可指明要打开的文件的性质 r 只读 w 只写 rw 可读写 3 可以直接跳到文件中指定的位置 二 流的层次结构 定义 1 java 将读取数据对象成为输入流 能向其写入的对象叫输出流 结构图如下 输入流 输出流 三 InputStream 类 inputstream 类和 outputstream 类都为抽象类 不能创建对象 可以通过子类来实例化 InputStream 是输入字节数据用的类 所以 InputStream 类提供了 3 种重载的 read 方法 Inputstream 类中的常用方法 1 public abstract int read 读取一个 byte 的数据 返回值是高位补 0 的 int 类型值 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 我们在使用完后 必须对我们打开的流进行关闭 四 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 上述各方法都有可能引起异常 2 InputStream 和 OutputStream 都是抽象类 不能创建这种类型的对象 五 FileInputStream 类 FileInputStream 类是 InputStream 类的子类 用来处理以文件作为数据输入源的数据流 使用方法 方式 1 File fin new File d abc txt FileInputStream in new FileInputStream fin 方式 2 FileInputStream in new FileInputStream d abc txt 方式 3 构造函数将 FileDescriptor 对象作为其参数 FileDescriptor fd new FileDescriptor FileInputStream f2 new FileInputStream fd 六 FileOutputStream 类 FileOutputStream 类用来处理以文件作为数据输出目的数据流 一个表示文件名的字符串 也可以是 File 或 FileDescriptor 对象 创建一个文件流对象有两种方法 方式 1 File f new File d abc txt FileOutputStream out new FileOutputStream f 方式 2 FileOutputStream out new FileOutputStream d abc txt 方式 3 构造函数将 FileDescriptor 对象作为其参数 FileDescriptor fd new FileDescriptor FileOutputStream f2 new FileOutputStream fd 方式 4 构造函数将文件名作为其第一参数 将布尔值作为第二参数 FileOutputStream f new FileOutputStream d abc txt true 注意 1 文件中写数据时 若文件已经存在 则覆盖存在的文件 2 的读 写操作结束时 应调用 close 方法关闭流 举例 2 1 七 File 类 File 类与 InputStream OutputStream 类同属于一个包 它不允许访问文件内容 File 类主要用于命名文件 查询文件属性和处理文件目录 举例 2 2 八 从一个流构造另一个流 java 的流类提供了结构化方法 如 底层流和高层过滤流 而高层流不是从输入设备读取 而是从其他流读取 同样高层输出流也不是写入输出设备 而是写入其他流 使用 分层对象 layered objects 为单个对象动态地 透明地添加功能的做法 被称为 Decorator Pattern Decorator 模式 要求所有包覆在原始对象之外的对象 都必须具有与之完全相同的接口 这使得 decorator 的用法变得非常的透明 无论对象是否 被 decorate 过 传给它的消息总是相同的 这也是 Java I O 类库要有 filter 过滤器 类的原因 抽象的 filter 类是所有 decorator 的基类 Decorator 模式常用于如下的情形 如果用继承来解决各种需求的话 类的数量会多到不切实际的地步 Java 的 I O 类 库需要提供很多功能的组合 于是 decorator 模式就有了用武之地 为 InputStream 和 OutputStream 定义 decorator 类接口的类 分别是 FilterInputStream 和 FilterOutputStream 8 1 FilterInputStream FilterInputStream 的种类 类 功能 构造函数的参数 用法 DataInputStream 与 DataOutputStream 配合使用 这样你就能以一种 可携带的方式 portable fashion 从流里读取 primitives 了 int char long 等 InputStream 包含了一整套读取 primitive 数据的接口 BufferedInputStream 用这个类来解决 每次要用数据的时候都要进行物理读取 的问题 你的意思是 用缓冲区 InputStream 以及可选的缓冲区的容量它本身并不提供接口 只是提供一个缓冲区 需要连到一个 有接口的对象 interface object LineNumberInputStream 跟踪输入流的行号 有 getLineNumber 和 setLineNumber int 方法 InputStream 只是加一个行号 所以还得连一个 有接口的对象 PushbackInputStream 有一个 弹压单字节 的缓冲区 has a one byte push back buffer 这样你就能把最后读到的那个字节 再压回去了 InputStream 主要用于编译器的扫描程序 可能是为支持 Java 的编译器而设计的 用的机会不多 FilterOutputStream 的种类 类 功能 构造函数的参数 用法 DataOutputStream 与 DataInputStream 配合使用 这样你就可以用一种 可携带的方式 portable fashion 往流里写 primitive 了 int char long 等 OutputStream 包括写入 primitive 数据的全套接口 PrintStream 负责生成带格式的输出 formatted output DataOutputStrem 负责数据的存储 而 PrintStream 负责数据的显示 一个 OutputStream 以及一个可选的 boolean 值 这个 boolean 值表示 要不要清空换行符后面的缓冲区 应该是 OutputStream 对象的最终包覆层 用的机会很多 BufferedOutputStream 用 这个类解决 每次往流里写数据 都要进行物理操作 的问题 也就是说 用缓冲区 用 flush 清 空缓冲区 OutputStream 以及一个可选的缓冲区大小 本身并不提供接口 只是加了一个缓冲区 需要链接一个有接口的对象 DataInputStream 类对象可以读取各种类型的数据 DataOutputStream 类对象可以写各种类型的数据 创建这两类对象时 必须使新建立的对象指向构造函数中的参数对象 例如 FileInputStream in new FileInputStream d abc txt DataInputStream din new DataInputStream in 8 2 BufferInputStream 和 bufferOutputStream 允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据 BufferInputstream 定义了两种构造函数 1 BufferInputStream b new BufferInputstream in 2 BufferInputStream b new BufferInputStream in size 第二个参数表示指定缓冲器的大小 同样 BufferOutputStream 也有两种构造函数 一次一个字节的向流中写数据 8 3 printstream 用于写入文本或基本类型 两种构造函数方法 PrintStream ps new PrintStream out PrintStream ps new PrintStream out autoflush 第二个参数为布尔值 控制每次输出换行符时 java 是否刷新输出流 九 字符流的读取和写入 java io Reader 和 java io InputStream 组成了 Java 输入类 Reader 用于读入 16 位字符 也就是 Unicode 编码的字符 而 InputStream 用于读入 ASCII 字符和二进制数据 Reader 的体系结构 1 FileReader FileReader 主要用来读取字符文件 使用缺省的字符编码 有三种构造函数 将文件名作为字符串 FileReader f new FileReader c temp txt 构造函数将 File 对象作为其参数 File f new file c temp txt FileReader f1 new FileReader f 构造函数将 FileDescriptor 对象作为参数 FileDescriptor fd new FileDescriptor FileReader f2 new FileReader fd 2 charArrayReader 将字符数组作为输入流 构造函数为 public CharArrayReader char ch 3 StringReader 读取字符串 构造函数如下 public StringReader String s 4 InputStreamReader 从输入流读取字节 在将它们转换成字符 Public inputstreamReader inputstream is 5 FilterReader 允许过滤字符流 protected filterReader Reader r 6 BufferReader 接受 Reader 对象作为参数 并对其添加字符缓冲器 使用 readline 方法可以读取一行 Public BufferReader Reader r Writer 类体系结构 1 FileWrite 将字符类型数据写入文件 使用缺省字符编码和缓冲器大小 Public FileWrite file f 2 chararrayWrite 将字符缓冲器用作输出 Public CharArrayWrite 3 PrintWrite 生成格式化输出 public PrintWriter outputstream os 4 filterWriter 用于写入过滤字符流 protected FilterWriter Writer w simple code 13 1 import java io class FileCopy public static void main String args throw Exception File InputStream input new FileInputStream java13 txt 输入当前目录下的 java13 txt 文件 FileOutputStream output new File OutputStream java bak 输出到当前目录下的 java13 bak 文件 int size input available 检查输入字节数 System out println 可输入字节数为 size for int i 0 i size i output write input read 拷贝到另一个文件 input close output close 13 2 import java io class CopyFile public static void main String args throw Exception FileReader fr new FileReader java13 txt 输入当前目录下的 java13 txt 文件 FileWriter fw new File FileWriter java bak 输出到当前目录下的 java13 bak 文件 int ch while ch fr read 1 fw write ch 拷贝 fr close fw close 13 3 import java io import java util class ByteArrayOutputStreamTest public static void main String args throw Exception ByteArrayOutputStream b new ByteArrayOutputStream System out println 请输入七个字符 然后按回车 While b size 7 b write System in read b size 返回 b 里的存有的字节数 System out println b toString 把 b 变成字符串输出 byte arr b toByteArray 把 b 存入字节数组 arr for int i 0 i arr length i System out print char arr i System out println OutputStream f new FileOutputStream test doc b writeTo f 把 b 的内容拷贝到 f 里去 b reset reset 之后 再来输入就从 b 的开始写入 13 4 import java io public class ReaderWriter public static void main String args throw IOException echo new InputStreamReader System in new OutputStreamWriter System out public static void echo InputStreamReader is OutputStreamWriter os throws IOException try while true 在 MS DOS 窗口中运行一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年桂林市第十一中学招聘初中教师考试笔试试题(含答案)
- 3D创新创业项目商业计划书
- 淡水贝类深加工技术创新创业项目商业计划书
- 自动驾驶车辆外观与法规遵从创新创业项目商业计划书
- 智能婴儿监护系统创新创业项目商业计划书
- 汽车沙漠驾驶技巧资讯源创新创业项目商业计划书
- 现场急救知识培训简报课件
- 辐射换热基础知识培训课件
- 2025年工业废气净化处理技术成果绿色环保鉴定报告
- 2025年文化产业园产业集聚与服务体系构建中的区域差异分析报告
- 2024(统编版)语文六年级上册 开学第一课 课件
- 招标代理服务服务方案
- 风力发电技术的发展现状和未来发展趋势
- 财税公司报告
- 脱发患者的头皮及头发护理方法
- 球囊扩张支架植入术
- 小儿推拿手法穴位的全身调理与养生保健
- 警械培训课件
- 人教版七年级英语下册阅读专项训练60篇-含答案
- 人工智能在检验医学中的应用
- 【江苏洋河股份内部控制环境现状、问题及对策12000字(论文)】
评论
0/150
提交评论