`
人生难得糊涂
  • 浏览: 117383 次
社区版块
存档分类
最新评论

JAVA读取文件的几大方法(一)以及如何实现复制文件功能

 
阅读更多

在JAVA中,一个可以读取文件的对象叫做输入流,一个可以写入文件的对象叫输出流。在JAVA中可以字节的形式直接输入输出文件,与之相关的是抽象类InputStream,和OutputStream

下面将介绍上这两个抽象类的常用实现子类

文件输入流:FileInputStream
构造方法
FileInputStream(File file)
FileInputStream(String name)
即用一个文件对象,或者一个保存了文件地址的字符串来进行初始化。

需要注意的是,要读取的文件必须存在,否则会报错

int read() 读取一个字节文件,如果已经是文件末尾,则返回-1

int read(byte[] b)  读取一个字节数组

我们知道read方法是以字节形式读取文件的那

read方法返回一个int型数据而不直接返byte型数据看似不符合逻辑。JAVA开发人员为什么要这样写呢?

因为它要将字节型数据转换为整形数据。为什么要转换成整形数据呢?

因为他要用返回-1来判断是否达到文件末尾。

那-1一定可以表示文件末尾吗,文件中的数据不会出现-1吗?答案是不会出现,因为将byte型数据

转换为int型的时候是将byte数据左边填0,所以一定会得到一个正的整数。

int available() 得到流中剩余的字节数

注意每次调用一个read方法 流中的数据都会减少。
但是如果文件大小超出了 流能读的大小 将流中的数据读完之后会怎样呢
答案: 跟文件格式有关,读GHO文件时每读一个就会从文件中输入到流中一个字节 ,ZIP格式的则不会没读一个输入一个
那么说到这来我们肯定会关心流能存的最大大小是多少呢?其实我们注意观察很容易得到一个最大范围:此方法返回的是int 型数据,那么显然它能存的数据必然小于即int 范围, 既2的31次方 2GB,我们可以大胆猜想它能存的最大数据就是2GB,但是有个看似合理的推论是不够的,那我们要怎样得到切确的数据呢?只有自己测试下了。我测试的结果是它能存的最大数据确实是2的31次方字节即2GB
缓冲字节输入流:BufferedInputStream

将输入流用缓冲字节输入流包装,能够加快读入速度

 

文件输出流:FileOutputStream

write(int b) 写出一个字节 这里为什么参数是int型数据呢,因为其实写出的是一个ASCLL码

例如write(97) 那么用记事本打开文件看到的是一个a

fos.write(-42);
fos.write(-48);

那其实写出的是 “中字”(汉字的ASCLL码是负数,且一个汉字占两字节)

write(byte[] b)  写出一个字节数组

需要注意的是在write方法后一再调用输出流的flush();方法

 因为内存的读写速度远远大于硬盘的读写速度,
 所以可能会有残留在内存缓存中的数据没有写到硬盘中去,
所以要推送缓存数据到硬盘。

缓冲字节输出流
BufferedOutputStream

将输出流用缓冲字节输入流包装,能够加快读入速度

下面贴一个用字节输入输出流实现文件复制的程序

package date0523_文件操作;

/**
 * 该程序用字节输入输出流实现了文字复制功能
 */
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Date;

public class Project {
	public static void main(String[] args) {
		long start=System.currentTimeMillis();
		if(copyFile("abc.txt","bb.txt"))
			System.out.println("复制成功");
		long end=System.currentTimeMillis();
		System.out.println("所用时间:"+(end-start)+"ms");
	}
	/**
	 * 实现文件复制功能
	 * @param sPath 源文件地址
	 * @param dPath 拷贝文件地址
	 * @return 是否复制成功
	 */
	public static boolean copyFile(String sPath,String dPath)
	{
		File sFile=new File(sPath);
		File dFile=new File(dPath);
		FileInputStream fis;
		try {
			fis = new FileInputStream(sFile);
			System.out.println(sFile.length());
			BufferedInputStream bis=new BufferedInputStream(fis);
			FileOutputStream fos=new FileOutputStream(dFile);
			BufferedOutputStream bos=new BufferedOutputStream(fos);
			int t=bis.read();
			while(t!=-1)
			{
				byte b=(byte)t;
				bos.write(b);
				t=bis.read();
			}
			bos.flush();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return false;
	}

}

 

 

0
0
分享到:
评论
4 楼 人生难得糊涂 2014-05-26  
I白I 写道
bis.read(); 这里为什么不读一个字节数组,这样一个一个字节读 效率还不低死

如果是要复制大一点的文件的话,是不能开辟那么大的数组的
3 楼 人生难得糊涂 2014-05-26  
youjianbo_han_87 写道
大文件Copy应该用Nio里面的直接文件读取,这样快很多,你可以试试。

多谢指导
2 楼 I白I 2014-05-26  
bis.read(); 这里为什么不读一个字节数组,这样一个一个字节读 效率还不低死
1 楼 youjianbo_han_87 2014-05-26  
大文件Copy应该用Nio里面的直接文件读取,这样快很多,你可以试试。

相关推荐

    Java实现从jar包中读取指定文件的方法

    如果找到匹配的条目,我们可以调用`JarEntry`对象的`getInputStream()`方法获取一个`InputStream`,这是读取文件内容的入口。 4. **写入目标文件**: 创建一个`FileOutputStream`,目标文件的路径是`toDir`加上`...

    Java 读取PDF文件

    在Java编程环境中,读取PDF文件是一项常见的任务,特别是在开发桌面应用或需要处理PDF文档内容时。本篇文章将深入探讨如何使用Java来读取PDF文件,并将其内容展示在一个由JFrame和JPanel构建的GUI窗口中。 首先,...

    java读取*.mdb文件数据

    1. 添加依赖:将`ucanaccess-2.0.9.2.jar`文件复制到你的项目类路径下,或者如果你使用Maven或Gradle,可以在pom.xml或build.gradle文件中配置相应的依赖。 2. 创建连接:使用JDBC URL和数据库凭据创建数据库连接。...

    Java实现文件复制,File文件读取,写入,IO流的读取写入

    本主题将深入探讨如何使用Java实现文件复制、File类的文件读取和写入,以及I/O流的读取与写入。下面将详细阐述这些知识点。 1. **Java文件复制** 文件复制通常涉及读取源文件内容并将其写入目标文件。在Java中,...

    利用Java实现复制Excel工作表功能

    今天,我们将介绍如何使用Java实现复制Excel工作表功能,包括在同一个工作簿内复制工作表和在不同工作簿间复制工作表两种情况。 复制工作表 在实际应用中,我们经常需要复制工作表以便更好地组织和管理数据。使用...

    java读取超大文本文件

    ### Java读取超大文本文件的关键技术点 在处理大数据量的文本文件时,Java 提供了多种方式来实现高效、低内存占用的文件读取操作。本文将围绕标题“java读取超大文本文件”及其相关描述和部分代码片段进行深入解析...

    java读取大文件大全

    #### 二、Java读取大文件的主要方法 在Java中,读取大文件主要有两种方式:传统IO流(如`FileInputStream`)和NIO(New IO)。 1. **传统IO流**:适用于小文件的读写,但当文件较大时效率较低。 2. **NIO**:通过`...

    java实现一个目录下全部文件复制到另一目录

    总结来说,Java实现一个目录下全部文件复制到另一目录涉及的主要知识点有: 1. `java.io.File`类的使用,包括`listFiles()`方法。 2. 使用`java.nio`包中的`Files`和`Paths`类,特别是`Files.copy()`方法。 3. 文件...

    java io读取文件

    下面我们将深入探讨Java IO读取文件的技术及其在大数据场景下的应用。 1. **基础概念** - **流(Stream)**:Java IO基于流的概念,流是一组有序的数据序列,可以是字节流或字符流。数据从源(如文件)流向目的地...

    java文件复制,实现文件的复制

    在Java编程中,文件复制是一项常用且重要的操作。无论是单一文件还是整个文件夹的复制,都是开发过程中常见的需求之一。本文将深入探讨如何使用Java实现文件及其目录结构的完整复制。 #### 一、基础知识回顾 在...

    java读取项目中的文件(src目录下)

    - 在Java中读取文件时,可以使用相对路径或绝对路径。如果文件在`src`目录下,且你的代码在同一目录层次,可以使用相对路径。否则,可能需要使用绝对路径,或者利用类路径的特性。 5. **使用`ClassLoader`读取资源...

    java文件夹及文件复制

    在实现文件复制时,我们通常会使用`BufferedInputStream`和`BufferedOutputStream`来提高效率,它们可以一次性读写多个字节,减少磁盘I/O操作的次数。 3. **递归复制文件夹**:当需要复制一个文件夹及其所有子...

    java 文本文件 支持新建,打开,复制,剪切...

    复制文件通常涉及使用两个文件流:一个用于读取源文件,另一个用于写入目标文件。可以使用`BufferedInputStream`和`BufferedOutputStream`来提高性能。读取源文件的每一行或每个字符,并将其写入目标文件,直到完成...

    java大文件读取-乔乐共享

    分块读取是指每次仅读取文件的一部分数据,将其存储在缓存中进行处理,然后再读取下一部分数据。这种方法适合任何大小的文件,而且可以灵活调整缓存大小以适应不同场景。 - **优点**: - 不受文件大小限制,适用于...

    java实现文件批处理

    **复制文件方法:** 在Java中,可以使用`java.io`包中的`FileInputStream`和`FileOutputStream`类来实现文件的复制。首先创建一个输入流读取源文件,然后创建一个输出流写入目标文件。通过循环读取源文件的数据并...

    高效率文件复制java版

    在第一个实现方法中,我们使用了Java IO流来实现文件复制。首先,我们需要import相关的包,包括java.io.File、java.io.FileInputStream、java.io.FileOutputStream和java.io.IOException。然后,我们创建了一个名为...

    文件复制(java代码实现)

    在Java编程语言中,文件复制是一项...这样,你就成功地使用Java实现了文件复制功能,并在DOS环境中运行了该程序。注意,为了确保程序正常运行,你需要确保源文件存在,目标文件路径是可写的,且具有适当的文件权限。

    java 文件管理器

    这使得用户可以在进行耗时操作(如大文件复制)时仍可以继续使用其他功能,提高了用户体验。 5. **事件监听**:在GUI应用中,按钮点击、菜单选择等用户行为通常需要监听。Java的`ActionListener`接口和事件类(如`...

    java读取文件大全

    根据给定的文件标题、描述、标签以及部分内容,我们可以总结并深入探讨关于Java读取文件的相关知识点。在Java中,读取文件是一项基础且重要的功能,适用于多种应用场景,包括但不限于数据处理、日志记录、配置读取等...

Global site tag (gtag.js) - Google Analytics