一、IO体系结构,InputStream /OutputStream 继承树
InputStream /OutputStream 输入/输出流 文件读写 抽象类
二、主要的几种重要的方法
InputStream 几个重要的方法
int available() 流中的可读取的有效字节长度
void close() 使用流对象后关闭
int read() 这个方法调用会返回流中的下一个字节作为byte值, 文件末尾返回-1
int read(byte[]) 从流中读到的byte
使用FileInputStream 从文件中读取数据
FileInputStream 构造器
FileInputStream (File file) 通过一个文件对象做参数构造输入流对象
FileInputStream (String name) 传入一个字符串(文件路径名)构造连接到指定文件的输入流
OutputStream 几个重要的方法
void close() 使用流对象后关闭
void flush() 将输出流有可还保存在(JVM)内存中的数据强制输出到目标上(文件或者网络上)
void write(int b) 向流中写入一个byte值,此处虽定义为int,但写入的却作为一个byte
void write(byte[]) 将byte数组中的内容输出到流中
void write(byte[] int off, int len) 将byte数组中一部分的内容输出到流中
使用OutputStream 从文件中读取数据
OutputStream 构造器
OutputStream (File file) 构造输出到指定文件file对象的输出流
OutputStream (File file, boolean append)
append 表示输出到文件中的数据是否接在文件中已有数据后面
构造输出到指定文件file对象的输出流
OutputStream (String name) 构造输出到一个字符串(文件路径名)对象的输出流
三、几种不同的文件读写的代码示例
整个字符串的读取和复制
使用FileInputStream/FileOutputStream
package com.yangkang20130719; import java.io.IOException; /** * 输入输出流测试 <方法>文件的读取 , 整个文件的复制 * 使用FileInputStream/FileOutputStream * @author YangKang 2013.07.19 * */ public class BaseIO{ // 定义程序入口主函数 public static void main(String[] args) throws Exception{ BaseIO bio = new BaseIO(); //读取我们当前正在编写的这个java源文件 //String fileName = "E:/HelloJava/GreatJava/src/com/yangkang20130719/BaseIO.java"; String srcFileName = "src/com/yangkang20130719/BaseIO.java"; String srcString = bio.readFile2String(srcFileName); System.out.println(srcString); String bakFileName = "src/com/yangkang20130719/BaseIO.txt"; Boolean result = bio.copyFile(srcFileName,bakFileName); System.out.println("复制结果:"+result); } /** * 读取指定文件名的内容,作为字符串返回 * @param fileName 文件名 * @return 读到的内容作为字符串返回 * @throws IOException 可能会抛出IO异常 */ private String readFile2String(String fileName) throws IOException { //构造输入流对象,作为一个InputStream对象使用 //因为创建的对象是InputStream的子类的对象,我们用父类型变量引用,方便统一使用 //创建从文件读取的输入流对象 long startTime = System.currentTimeMillis(); java.io.InputStream ins = new java.io.FileInputStream(fileName); //根据流中的字节长度,创建一个byte数组,保存读到的数据 byte[] contentByte = new byte[ins.available()]; //将流中的数据读到数组中 ins.read(contentByte); //将byte数组转换为字符串 String s = new String(contentByte); long endTime = System.currentTimeMillis(); System.out.println("用字符数组一次性读取整个文件所需时间为:"+(endTime -startTime)); return s; } /** * 简单文件复制方法,使用FileInputStream/FileOutputStream * @param srcFile 源文件名 * @param destFile 目标文件名 * @return 可能抛出IO异常 * @throws IOException 是否COPY成功 */ private Boolean copyFile(String srcFile, String destFile) throws IOException { //创建从源文件来的输入流对象 java.io.InputStream ins = new java.io.FileInputStream(srcFile); //创建输出流对象:默认写入方式(如果文件中已有内容则覆盖原来内容) java.io.OutputStream ous = new java.io.FileOutputStream(destFile); //获取复制前的时刻 long startTime = System.currentTimeMillis(); int i = 0; //每次从输入流中读取一个字节,直到读取到文件末尾 while((i=ins.read()) != -1){ //将该字节写入到输出流中 ous.write(i); } ins.close(); //清空输出流的缓存并关闭 ous.flush(); ous.close(); //获取复制后的时刻 long endTime = System.currentTimeMillis(); //输出整个复制过程所用的时间 System.out.println("复制文件所用时间为:"+(endTime - startTime)); return true; } }
依次按顺序每个字符的读取和文件复制
使用FileInputStream/FileOutputStream
package com.yangkang20130719; import java.io.File; import java.io.IOException; /** * 输入输出流测试 <方法>文件的读取 , 整个文件OneByOne的复制 * @author YangKang 2013.07.19 * */ public class FileIO { public static void main(String[] args) throws IOException { FileIO fio = new FileIO(); String srcFileName = "src/com/yangkang20130719/FileIO.java"; String srcString = fio.readFileOneByOne(srcFileName); System.out.println(srcString); //在给定路径下新建一个文件 File file = new File("src/com/yangkang20130719/text.bak"); String bakFileName = ("src/com/yangkang20130719/text.bak"); fio.copyFile(srcFileName,bakFileName); System.out.println(bakFileName+" 复制成功"); } /** * 读取指定文件名的内容,作为字符串返回 * @param fileName 文件名 * @return 读到的内容作为字符串返回 * @throws IOException 可能会抛出IO异常 */ private String readFileOneByOne(String fileName) throws IOException { //创建从已有文件来的输入流对象 java.io.InputStream ins = new java.io.FileInputStream(fileName); long startTime = System.currentTimeMillis(); int i = -1; //根据流中的字节长度,创建一个byte型数组,保存读取到的数据 int size = ins.available(); byte[] contentByte = new byte[size]; int count = 0; //从输入流中读取一个字节,直到文件末尾 while((i=ins.read()) != -1){ contentByte[count++] = (byte) i; } //System.out.println(size); //System.out.println(count); //将byte数组转换为字符串 String s = new String(contentByte); long endTime = System.currentTimeMillis(); //输出整个读取过程所用的时间 System.out.println("用字节数组一个一个读取文件的没一个字节所用时间为:"+(endTime - startTime)); return s; } /** * 简单文件复制方法 * @param srcFile 源文件名 * @param destFile 目标文件名 * @throws IOException 可能抛出IO异常 */ public void copyFile(String srcFile,String destFile) throws IOException{ //创建从源文件来的输入流对象 java.io.InputStream ins = new java.io.FileInputStream(srcFile); //获取复制前的时刻 long startTime = System.currentTimeMillis(); //创建输出流对象:默认写入方式(如果文件中已有内容则覆盖原来内容) java.io.OutputStream ous = new java.io.FileOutputStream(destFile); int i = 0; //每次从输入流中读取一个字节,直到读取到文件末尾 while((i=ins.read()) != -1){ //将该字节写入到输出流中 ous.write(i); } ins.close(); //清空输出流的缓存并关闭 ous.flush(); ous.close(); //获取复制后的时刻 long endTime = System.currentTimeMillis(); //输出整个复制过程所用的时间 System.out.println("复制文件所用时间为:"+(endTime - startTime)); } }
使用 BufferedOutputStream/BufferedOutputStream类 对文件的读取和文件的复制
package com.yangkang20130719; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 输入输出流测试 ,使用 BufferedOutputStream/BufferedOutputStream类 对文件的读取和文件的复制 * BufferedStream特点:读取写入速度比FileStream要快,默认缓冲区大小8192K * @author YangKang 2013.07.19 * */ public class BufferedIO{ // 定义程序入口主函数 public static void main(String[] args) throws Exception{ BufferedIO bio = new BufferedIO(); //读取我们当前正在编写的这个java源文件 String srcFileName = "src/com/yangkang20130719/BufferedIO.java"; String srcString = bio.readFile2String(srcFileName); System.out.println(srcString); String bakFileName = "src/com/yangkang20130719/BufferedIO.txt"; Boolean result = bio.copyFile(srcFileName,bakFileName); System.out.println("复制结果:"+result); } /** * 读取指定文件名的内容,作为字符串返回 * 使用BufferedStream类读写文件 * @param fileName 文件名 * @return 读到的内容作为字符串返回 * @throws IOException 可能会抛出IO异常 */ private String readFile2String(String fileName) throws IOException { //构造输入流对象,作为一个InputStream对象使用 //因为创建的对象是InputStream的子类的对象,我们用父类型变量引用,方便统一使用 //创建从文件读取的输入流对象 long startTime = System.currentTimeMillis(); FileInputStream ins = new FileInputStream(fileName); //创建一个缓冲输入流对象,将字节输入流对象转换为缓冲输入流对象 BufferedInputStream bis = new BufferedInputStream(ins); //根据流中的字节长度,创建一个byte数组,保存读到的数据 byte[] contentByte = new byte[ins.available()]; //将流中的数据读到数组中 bis.read(contentByte); ins.close(); //将byte数组转换为字符串 String s = new String(contentByte); long endTime = System.currentTimeMillis(); System.out.println("用字符数组一次性读取整个文件所需时间为:"+(endTime -startTime)); return s; } /** * 使用BufferedStream类复制文件 * @param srcFile 源文件名 * @param destFile 目标文件名 * @return 可能抛出IO异常 * @throws IOException 是否COPY成功 */ private Boolean copyFile(String srcFile, String destFile) throws IOException { //创建从源文件来的输入流对象 java.io.InputStream ins = new java.io.FileInputStream(srcFile); //创建一个缓冲输入流对象,将字节输入流对象转换为缓冲输入流对象 BufferedInputStream bis = new BufferedInputStream(ins); //创建输出流对象:默认写入方式(如果文件中已有内容则覆盖原来内容) FileOutputStream ous = new FileOutputStream(destFile); //创建一个缓冲输出流对象,将字节输出流对象转换为缓冲输出流对象 BufferedOutputStream bos = new BufferedOutputStream(ous); //获取复制前的时刻 long startTime = System.currentTimeMillis(); int i = 0; //每次从输入流中读取一个字节,直到读取到文件末尾 while((i=bis.read()) != -1){ //将该字节写入到输出流中 bos.write(i); } ins.close(); //清空输出流的缓存并关闭 ous.flush(); ous.close(); //获取复制后的时刻 long endTime = System.currentTimeMillis(); //输出整个复制过程所用的时间 System.out.println("复制文件所用时间为:"+(endTime - startTime)); return true; } }
相关推荐
#### 四、Java I/O体系结构 Java的I/O系统分为三个层次: 1. **流式部分**:这是Java I/O最核心的部分,包括`InputStream`、`OutputStream`、`Reader`、`Writer`等类。 2. **非流式部分**:包括`File`类、`...
在这一版中,作者深入探讨了Java的输入输出机制,包括流式I/O、数据源、过滤流、压缩流以及JAR归档等内容。读者可以通过本书理解Java I/O体系结构,并学会如何在实际开发中应用这些知识。 ### Java I/O基础 Java I...
流式IO是Java处理输入输出的主要方式,包括读写文件、网络通信等。Java的IO流体系结构复杂但强大,它支持字节流和字符流,以及双向流(如PipedReader/PipedWriter)和转换流(如InputStreamReader/...
- **InputSplit和OutputSplit**:理解MapReduce作业中的输入切片和输出切片的概念。 - **BlockSize配置**:讨论HDFS块大小配置的重要性。 - **最少副本数配置**:探讨HDFS中副本数量的配置及其对系统性能的影响。 - ...
计算机四级嵌入式系统工程师考试涉及的知识点广泛且深入,主要涵盖了操作系统、计算机体系结构、文件系统、并发处理和硬件接口等多个方面。以下是对这些知识点的详细解释: 1. **进程控制块(PCB)**:PCB是操作...
9.3 流式输入输出与文件处理 295 9.3.1 Java输入输出类库继承关系 296 9.3.2基于标准输入输出的IO操作 296 9.3.3文件读写及随机访问 297 9.3.4Java的文件管理 297 9.4 Java网络通信 297 9.4.1网络基础知识及Java网络...
5. 支持流式传输:RXTX允许通过输入/输出流进行串口通信,这与Java的标准IO接口一致,易于使用和理解。 源码的包含意味着用户不仅可以使用RXTX库,还可以查看和修改源代码,以便定制化开发或者修复特定问题。这对于...
6. **IO流**:输入/输出流体系结构、字符流与字节流的区别、缓冲流、转换流、对象流以及NIO(New IO)和NIO.2的区别和应用场景。 7. **网络编程**:Socket编程、HTTP协议、TCP与UDP的区别、网络套接字、服务器端口...
6. 输入输出(I/O):Java提供了丰富的API来处理文件和流式I/O操作,这些API定义在java.io包中。 7. 多线程:Java的多线程编程允许开发者编写并行执行的代码,以执行多任务。涉及到的知识点包括线程的创建、同步、...
- **流的分类**:字符流与字节流,输入流与输出流的区别。 - **文件操作**:如何读写文件,使用File类进行文件的创建、删除和重命名。 - **对象序列化**:理解序列化机制,以及如何实现Serializable接口。 7. **...
以上内容涵盖了Java进阶篇中的几个重要知识点,包括集合框架、异常处理、输入/输出流、多线程编程、泛型与反射以及Lambda表达式与Stream API等。这些知识点不仅能够帮助开发者更加高效地编写Java程序,同时也是深入...
- **IO流**:理解输入/输出流的概念,学习文件操作、网络通信以及对象序列化。 - **多线程**:学习线程的创建、同步、并发控制,理解线程池的概念。 - **反射机制**:掌握动态加载类、获取类信息、创建对象、调用...
`java.io`包提供了流式输入/输出的支持,是进行文件读写和网络通信的基础。 - **流的概念与分类**:介绍流的基本概念,包括输入流和输出流的区别,以及字节流与字符流的不同。 - **常见流类**:如`FileInputStream`...
- **java.io**: 包含输入/输出类。 - **java.sql**: 用于连接和操作数据库。 ##### Get和Post的区别 - **GET**:主要用于获取资源,将数据附在URL之后,安全性较低,但传输速度快。 - **POST**:用于向服务器发送...
- **java.io**:提供用于输入/输出的类,如FileInputStream、OutputStreamWriter等。 - **java.sql**:为SQL数据库访问提供API支持。 ##### Get和Post的区别 - **GET**:数据作为URL的一部分发送,安全性较低,...
- **控制台应用程序开发**:学会使用标准输入输出进行简单的控制台交互。 - **文件操作**:掌握文件读写的基本方法。 - **高级I/O流式编程**:理解NIO与传统IO的区别,掌握NIO编程技巧。 - **图形界面程序设计**...