我们都知道在电脑上对数据的存储有三种方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。那又怎样把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?在Java中提供了输入输出相关的类,这些类在java.io包中,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。在次以文件输入流和文件输出流为例说明数据的读取和写入的操作。
查阅API文档可知,文件输入流FileInputStream只有一个构造器FilterInputStream(InputStream in),它传入一个InputStream类型的参数。知道了构造方法,就可以实例化一个FileInputStream类的对象。要将数据从硬盘上读取到内存中,首先要定义一个FileTest类,再定义一个方法readFile(),给该方法传入一个要读取某个文件路径的字符串形参,最后返回一个字符串值。在方法中首先需要一个FileInputStream类的对象,所以要实例化一个FileInputStream类的对象:java.io.FileInputStream fis = new java.io.FileInputStream(path);在实例化对象时会提示有异常错误,这里先不讨论异常机制,就按固定的格式:try{ }catch(Exception ct){ct.printStackTrace();}处理就行了。创建对象之后就可以用该类的方法对数据读取了。首先要读取文件的长度,可以用方法available(),然后读取文件中的数据,可以用read()读取,该方法只能一个字节一个字节的读取数据。最后要实例化一个byte数组,它的作用是将读取到的数据保存到数组中,还需要一个whlie循环将所有数据读取到数组中,还需要注意的是read()方法当读取完最后一个字节,在读取一遍时,这时返回的结果是-1。最后读取完之后别忘了用close()方法将输入流关闭。具体代码如下:
/**
* 读入给定路径文件的数据
* @param path:给定的路径
* @return:返回字符串类型的数据
*/
public String readFile(String path){
try{
//创建文件输入流对象
java.io.FileInputStream fis = new java.io.FileInputStream(path);
//获取文件的长度
int len = fis.available();
//根据文件的长度创建一个字节数组,保存从文件读取到的数据
byte[] bt = new byte[len];
//读入一个字节
int bj = fis.read();
int i=0;
while (bj!=-1){
//将读取的字节放入到数组中
bt[i]=(byte)bj;
//继续读取下一个字节
bj = fis.read();
i++;
}
要把数据从内存中写入到外存中的指定的文件里的方法和上面的方法差不多。与之对应的有一个FileOutputStream类,该类有五个构造方法,这里使用FileOutputStream(String name)这个构造方法实例化一个对象。首先要定义一个writeFile()方法,再给该方法传入指定的文件路径和要写出的数据的两个字符串形参。然后实例化一个java.io.FileOutputStream fs = new java.io.FileOutputStream(path);跟上面一样也会报出异常错误,处理方法和上面是一样的。再将要写出的字符串前要先把字符串转化为字节数组,在String类中有一个方法getBytes()
可以将字符串转化为字节数组。然后要遍历得到的字节数组,将字节数组中的每个元素依次写出。最后别忘了要用fs.flush();和fs.close()两个方法分别将输出流中的字节强制输出和关闭输出流。具体代码如下:
/**
* 将数据写入指定文件
* @param path:指定的文件
* @param content:写入的数据
*/
public void writeFile(String path,String content){
try{
//创建输出流对象
java.io.FileOutputStream fs = new java.io.FileOutputStream(path);
//将字符串转成字节数组
byte[] b = content.getBytes();
//遍历数组
for (int i=0;i<b.length;i++){
//写入数据
fs.write(b[i]);
}
//强制写出输出流中所有字节
fs.flush();
//关闭流
fs.close();
}catch(Exception et){
et.printStackTrace();
}
}
上面两个方法写完之后,先调用第一个方法在调用第二个方法就可以完成文件的复制。但是这种复制存在两个问题,第一是复制的速度太慢,第二是有些文件复制之后是乱码,不能查看。要解决这两个问题,首先要分析上面两个方法的执行过程,看到第一个方法用到了数组,第二个方法要把字符串转化为字节数组。所以可以考虑不要用数组,并且不要把字符串转化为字节数组。所以要一边读入数据一边写出数据,这样不仅把前面的两个问题解决了,而且代码还简洁了不少,具体代码如下所示:
/**
* 文件复制的方法
* @param srcPath
* @param destPath
* @return
*/
public boolean copyFile(String srcPath, String destPath) {
try{
//创建输入流对象
java.io.FileInputStream fis = new java.io.FileInputStream(srcPath);
//创建输出流对象
java.io.FileOutputStream fos = new java.io.FileOutputStream(destPath);
//读入一个字节的数据
int rd = fis.read();
while (rd!=-1){
//将内存中的数据写到硬盘的文件
fos.write(rd);
//继续读入数据
rd = fis.read();
}
//关闭输入流
fis.close();
//强制写出输出流中剩余数据
fos.flush();
//关闭输出流
fos.close();
return true;
}catch(Exception ct){
ct.printStackTrace();
}
return false;
}
经过上面的代码的修改之后,复制文件基本没有问题,但是当复制比较大的文件时速度还是很慢,这时就需要输入输出缓冲流,他们分别是BufferedInputStream和BufferedOutputStream。
他们的使用入一下代码所示:
/**
* 文件复制的方法
*
* @param srcPath
* @param destPath
* @return
*/
public boolean copyFile(String srcPath, String destPath) {
try{
//创建输入流对象
java.io.FileInputStream fis = new java.io.FileInputStream(srcPath);
//创建输出流对象
java.io.FileOutputStream fos = new java.io.FileOutputStream(destPath);
//创建输入缓冲流
java.io.BufferedInputStream bis = new java.io.BufferedInputStream(fis);
//创建输出缓冲流
java.io.BufferedOutputStream bos = new java.io.BufferedOutputStream(fos);
//读入一个字节的数据
int rd = bis.read();
while (rd!=-1){
//将内存中的数据写到硬盘的文件
bos.write(rd);
//继续读入数据
rd = bis.read();
}
//关闭输入流
fis.close();
//强制写出输出流中剩余数据
fos.flush();
//关闭输出流
fos.close();
return true;
}catch(Exception ct){
ct.printStackTrace();
}
return false;
}
分享到:
相关推荐
Java 输入输出流是Java IO API的核心部分,用于在程序与外部资源之间传输数据。这篇文档主要涵盖了Java输入输出流的基本概念、数据流分类、标准数据流、Java.io包中的数据流和文件类以及文件操作类的方法。 1. 数据...
Java 输入输出流是Java编程语言中用于处理数据输入和输出的核心机制。在Java中,输入输出流被设计成一种抽象的概念,允许程序处理各种不同类型的输入源和输出目标,包括文件、网络连接、内存缓冲等。Java.io 包提供...
Java输入输出流是Java编程中一个非常重要的概念,主要用于数据的读取和写入操作,包括文本文件和二进制文件。在实验9中,主要目的是理解和掌握I/O流的分类,以及如何进行文本和二进制文件的读写。 I/O流在Java中被...
Java中的输入输出流是程序与外部数据交互的重要方式,它允许我们读取和写入数据到各种来源,如键盘、文件、网络等。在Java中,输入输出流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。本次实验...
### Java中的标准输入输出流知识点详解 #### 一、Java标准I/O介绍 Java提供了丰富的I/O处理机制,包括标准输入输出流、字节流、字符流等多种方式来处理数据的读取和写入。标准输入输出流是Java中非常基础且重要的...
### Java输入输出流与文件处理 #### 重要概念与基础知识 **输入输出流与文件处理**在编程领域占据着核心地位,特别是在Java中,通过`java.io`包提供了丰富的类和接口来支持输入输出操作。这包括从键盘读取用户输入...
### 浅谈Java输入输出流 #### 一、引言 Java作为一种广泛应用的编程语言,在处理数据时提供了非常强大且灵活的输入输出功能。然而,Java的输入输出操作可能看起来较为复杂,因为开发者通常需要处理多种不同的对象...
### 输入输出流介绍 #### 6.1 为何选择输入输出流 在深入探讨C++中的输入输出流之前,我们先来理解为什么要在C++中引入这种机制。本章节将详细解析传统C语言中标准I/O库的局限性,并阐述输入输出流如何提供一种...
Java 输入输出流实验 本实验主要介绍了 Java 中的输入输出流,包括 ...本实验总结了 Java 中的输入输出流、对象的序列化和反序列化、文件流和对象的串行化等知识点,并提供了一个完整的实验过程和代码实现。
总结,Java的输入输出流系统是一个灵活且强大的工具,涵盖了多种类型的流,可以处理不同数据类型和来源的数据,同时通过缓冲和过滤等功能,优化了数据的读写效率。理解并熟练运用Java的I/O流,对于开发涉及数据交换...
总结,C++的输入输出流系统是其强大功能的一部分,它使得程序能够灵活、高效地处理数据的输入和输出。理解并熟练运用这些流类和对象,是掌握C++编程的关键步骤。通过学习如何创建、管理和格式化流,开发者能够编写出...
C++输入输出流是C++编程中的核心概念,它提供了数据在程序与外部世界之间传输的机制。在C++中,输入输出流主要是通过iostream库实现的,包括`<iostream>`头文件,其中定义了cin(标准输入流)和cout(标准输出流)等...
在C++编程语言中,输入输出流(I/O流)是用于...通过以上知识点的总结,可以看出C++输入输出流以及运算符重载是高级编程技术的重要组成部分,它们极大地增强了语言的表达能力和灵活性,使得程序设计更加直观和高效。
根据提供的文档信息,本文将对Java中的输入输出流(I/O)进行详细的总结与解析,主要涵盖以下几个方面: 1. **文件操作与File类的基本使用**; 2. **输入输出流的基本概念及其分类**; 3. **字节流的具体实现与应用...
基于Java文件输入输出流实现文件上传下载功能 本文将详细介绍基于Java文件输入输出流实现文件上传下载功能的相关知识点,包括文件上传和下载的实现原理、Java文件输入输出流的基础操作、Servlet的使用等。 文件...
字符串和输入输出流的实验报告 本实验报告的目的是通过实验四,字符串和输入输出流的实验,来理解流的概念分类、掌握字符串常用操作方法、掌握流的构造、套接在编程中的应用,理解和掌握文件流以及对象的串行化。 ...
### Java输入输出流基础知识 #### 一、引言 Java作为一种广泛应用的编程语言,其强大的输入输出(IO)处理能力是其重要的特性之一。通过Java IO库,开发者能够轻松地处理各种类型的输入输出操作,包括但不限于文件...