`

常用I/O流类型

    博客分类:
  • Java
阅读更多

尽管JDK中提供了众多的IO流类型,但是在开发使用的时候,经常用到的也不过是十余个。

在这里,做一下简单介绍。

  • FileInputStream / FileOutputStream

        java.io.FileInputStream用于从本地磁盘文件中读取字节数据。一般用法,先创建一个FileInputStream对象关联到要读取的文件,然后调用read方法读取字节数据到程序中,再进行其他处理。

         FileInputStream的构造方法中允许使用File或String类型的参数指定要读取的文件, 该文件必须存在,否则运行出错。 切记,FileInputStream的功能有其局限性,它并不适合获取文本文件中的字符信息。如:读取显示文件中如果含有双字节字符,则会显示乱码,此时应该选用字符流类型。

           FileOutputStream与FileInputStream相对应,用于将字节数据写出到文件中,两者均为节点流。如果进行写操作的目标文件不存在,则自动创建该文件,但是如果目标文件所在路径也不存在,则运行出错而不会自动创建该目录。

 

public class CopyFile {	
	public static void main(String args[]){
		try {
			FileInputStream fis = new FileInputStream("a.txt");
			FileOutputStream fos = new FileOutputStream("b.txt");
			
			 int b =  fis.read();
			 print("Copy...start:");
			 while(-1 != b){
				 fos.write(b);
				 b = fis.read();
			 }
			 fis.close();
			 fos.close();
			 print("Copy...finished!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public  static void print(Object o){
	System.out.println(o);
	}
}

  程序以字节为单位,读取指定文件中数据并写出到目标文件中,实现文件复制的功能。这种方式可以复制任何格式的 文件(如文本文件,音/视频文件以及可执行文件等其他二进制文件),因为其以字节为单位进行数据复制时并不对文件内容进行解析。

  • FileReader/FileWriter

      java.io.Reader用于以字符为单位读取文本文件,而java.io.Writer类用于将字符数据写出到文本文件中,两者均为节点流,可以在这两个类的构造方法中以String或File类型参数的指定存取文件。

public class Test {
	public static void main(String args[]){
		FileReader reader;
		FileWriter writer = null;
		try {
			reader = new FileReader("a.txt");
			writer = new FileWriter("c.txt");
		int read = reader.read();
		print("Copy... start:");
		while(-1 != read){
			writer.write(read);
			read = reader.read();
		}
		reader.close();
		writer.close();
		print("Copy...finish!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public  static void print(Object o){
		System.out.println(o);
	}
}

 本示例实现了以字符(char)为单位的文件复制功能,其中FileWriter还可以在构造方法中指明是否以追加的方式写文件(默认为覆盖方式),该重载方法的格式如下:

public FileWriter(String fileName,boolean append)

其中,如调用方法时指定boolean类型参数append的值为true,则新写入的内容将不会覆盖目标文件原有内容而是追加到其尾部。

 

  • BufferedReader/BufferedWriter

          java.io.BufferedReader属于处理流,用于从其他的字符输入流读取文本,它将多个字符存入缓存以提供读取字符,字符数组或行的有效方法。采用缓冲处理是为了提高效率,如果没有缓存,如FileReader对象,每次都调用read()方法进行读操作时,都会直接去文件中读取字节,转换为字符并返回,这样频繁的读取文件效率很低。

         BufferedReader所封装的字节输入流对象需要在构造方法中指定。缓冲区的容量也可以在一个构造方法中指定,但一般使用默认值,默认值也足够大能够满足多种用途。

           public BufferedReader(Reader in)

           public BufferedReader(Reader in, int size)

            java.io.BufferedWriter与java.io.BufferedReader相对应,提供字符的缓冲写出功能。当频繁的执行字符写操作时,可使用BufferedWriter对相关的字符输出流(如:FileWriter)进行封装以提高运行效率。

            BufferedWriter类中的newLine()方法写出平台相关的行分隔符来标记一行的终止,此行分隔符由系统属性“line.separator”确定,下面是一个BufferedReader 与 BufferedWriter的示例。

 

public class Test2 {
	public static void main(String[] args) {
		FileReader fs = null;
		FileWriter fw = null;
	try {
		fs = new FileReader("a.txt");
		fw = new FileWriter("d.txt");
		BufferedReader reader = new BufferedReader(fs);
		BufferedWriter writer = new BufferedWriter(fw);
		print("Copy...start:");
		String content = reader.readLine();
		while(null != content){
			writer.write(content);
			writer.newLine();
			content = reader.readLine();
		}
		reader.close();
		writer.close();
		print("Copy...finish!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void print(Object o){
		System.out.println(o);
	}
}
 
  • InputStreamReader/OutputStreamWriter

        java.io.InputStreamReader属于处理流,是从字节流到字符流的转换桥梁,用于封装其他的字节输入流并从中读取字节数据,然后将之按照特定的字符编码规则转换为字符,其所使用的字符编码可以在构造函数中指定,也可以使用平台的默认字符编码。其构造方法格式为:

   public InputStreamReader(InputStream in)

   public InputStreamReader(InputStream,String enc)

       InputStreamReader 对象每次调用read()方法时,都会导致它从所封装的字节输入流中读取一个或多个字节。为提高效率,通常将InputStreamReader与BufferedReader封装在一起使用,如:使用BufferedReader封装InputStreamReader,进而读取InputStream中的数据是很普遍的做法。

        java.io.OutputStreamWriter与InputStreamWriter,可按照特定的字符编码规则把字符转换为字节并写出到它所封装的字节输出流 。为提高效率,通常把OutputStreamWriter封装在BufferedWriter中。

       除了读取键盘输入的传统方法中使用了InputStreamReader外,一般不直接使用这个两个类。

  • DataInputStream/DataOutputStream

          java.io.DataInputStream属于处理流,它能够以一种与机器无关的方式,直接从底层字节输入流中读取Java的基本类型和String类型的数据,而相应的java.io.DataOutputStream则能够则能够直接将Java基本类型数据写出其他的字节输出流,随后可以使用DataInputStream输入流读取这些数据。

         DataInputStream类中定义了多个方法,用以实现读取Java基本数据类型及String类型数据,其中常用的有:

     public DataInputStream(InputStream in)

     public final int read(byte b[])

     public final int read(byte b[],int off,int len)

     public final  boolean readBoollean()

     public final byte readByte()

     public final char readChar()

     public double readDouble()

     public float readFloat()

     public int readInt()

     public final long readLong()

     public final short readShort()

     public final String readUTF()

    从所包含的输入流中读入一个使用UTF-8修改版格式编码的字符串。

public class Test3 {
	public static void main(String[] args) {
		 FileOutputStream fos;
		 DataOutputStream dos;
		 FileInputStream fis;
		 DataInputStream dis;
		 try {
			fos = new FileOutputStream("myfile.data");
			dos = new DataOutputStream(fos);
			dos.writeUTF("休.格兰特");
			dos.writeInt(40);
			dos.close();
			fis = new FileInputStream("myfile.data");
			dis = new DataInputStream(fis);
			print(" name:" + dis.readUTF());
			print("  age:" + dis.readInt());
			dis.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void print(Object o){
		System.out.println(o);
	}
}
 

需要注意的是,程序运行时用于保存数据的文件myfile.data并不是文本文件,其中数据的存储格式与JVM内存中数据的存储格式相同。

可以看出DataInputStream与DataOutputStream传输数据时数据的格式是平台无关的,这一特性用在跨平台的数据通信时是非常有效的,将来我们在基于socket技术实现不同计算机/平台的Java应用程序间的数据传输时就会用到这个两个类。

 

分享到:
评论

相关推荐

    C++ I/O流课件 很不错的哦

    C++中的I/O流是程序与外部世界交互的重要机制,主要涉及输入操作(读操作)和输出操作(写操作)。I/O流的概念来源于数据流,它就像一条河流,允许数据从一个源头流向另一个目的地。在C++中,数据流是以字节序列的...

    java对I/O流的处理

    Java中的I/O流处理是程序与外部设备交互数据的关键机制,包括从文件、网络、内存等数据源读取数据和向这些目标写入数据。I/O流系统在Java的`java.io`包中被实现,提供了丰富的类和接口来支持各种类型的流操作。 **I...

    fio - Flexible I/O tester rev. 3.9

    该作业文件定义了测试的具体参数和设置,如目标文件/设备、I/O类型、块大小等。 #### fio的工作原理 fio通过提交I/O请求来模拟真实的读写操作,并收集有关这些操作的性能数据。它能够同时处理多个线程和进程,从而...

    Java I/O详细笔记

    Java的I/O流体系结构基于一系列抽象基类,通过继承这些基类实现具体的流操作。 **3.1 InputStream类层次** - `InputStream`:所有字节输入流的基类。 - `FileInputStream`:从文件系统中的文件中获取输入。 - `...

    Java使用I/O流读取文件内容的方法详解

    Java使用I/O流读取文件内容的方法是Java编程中常用的文件读取方式。该方法可以将文件内容读取到程序中,并对其进行处理和分析。在Java中,I/O流是指数据流向某个对象的数据序列,并且到达这个对象的过程。输入流是...

    java_I/O流的教程

    Java I/O流是Java编程语言中的一个重要组成部分,用于在程序和外部资源(如磁盘、网络、内存等)之间传输数据。本教程涵盖了从基础到高级的Java流知识,包括文件读写、缓冲流、对象序列化等多个方面。 1. **文件的...

    java中I/O的t经典ppt

    - Java I/O流支持级联,即一个流可以连接到另一个流上,形成流链。这样可以组合不同类型的流以实现复杂的数据处理逻辑。 8. **对象序列化与反序列化**: - Java提供了ObjectOutputStream和ObjectInputStream,...

    一本输入输出流 I/O的书

    #### 补充:各种流的结束情况及其它常用 I/O 流 **1. 流的结束情况** - **结束条件**:在使用 I/O 流时,需要特别注意流的结束情况,例如当 `InputStream` 或 `Reader` 达到文件末尾时会返回 `-1`。 **2. 其它...

    Java I/O流常用类小结

    总的来说,Java I/O流系统提供了一个强大的框架来处理各种数据输入输出,无论是字节流还是字符流,都有丰富的类库供开发者选择。理解这些类的功能和使用场景,可以帮助我们编写出高效、稳定的代码。

    java基础知识I/O流使用详解

    本篇将详细讲解Java中的I/O流系统,帮助你理解其基本概念、分类以及常用类的使用。 首先,"流"是一个抽象的概念,它代表数据的流动,可以是从数据源到接收端,也可以是从接收端到数据源。在Java中,I/O流被分为两类...

    Java输入与输出(I、O).

    字节流是Java I/O的基础,分为输入流(InputStream)和输出流(OutputStream)。InputStream处理数据的输入,OutputStream处理数据的输出。它们都定义了读写数据的基本方法,如read()和write()。常用的子类有...

    Java文件File的使用及I/O的使用

    本文将深入探讨Java中File类的使用以及I/O流的相关知识。 首先,File类是Java.io包中的核心类,它提供了操作文件和目录的功能。但需要注意的是,File类并不能直接读写文件内容,而是用于管理和获取文件的属性。例如...

    IODemo.zip

    Java I/O流是Java平台中的一个重要特性,它允许程序与外部资源进行数据交换,包括读取文件、网络通信、标准输入输出等。I/O流在Java中被设计为一种抽象的概念,将数据的传输视为一个有序的数据流。在这个"IODemo.zip...

    Android IO

    Android提供了多种I/O机制,使得开发者能够有效地读写文件、处理流数据以及与网络通信。以下将详细介绍Android I/O操作的相关知识点。 1. 文件操作: - `File`类:用于创建、读取、写入、删除文件和目录。通过构造...

    Android应用源码之IOStreamSample_Android.zip

    三、常用I/O流类 1. FileInputStream和FileOutputStream:用于文件的读写操作。 2. ByteArrayInputStream和ByteArrayOutputStream:在内存中操作字节数组。 3. InputStreamReader和OutputStreamWriter:将字节流转换...

    java_diary_18.rar_JFC_swing_反射机制_国际化 java

    j2se 18天笔记是根据网络...Day12:线程机制与I/O流的方法 Day13:I/O流的类与编码方式 Day14:优化的I/O流与网络编程 Day15:网络编程与常用类库 Day16:国际化与新特性 Day17:新特性与并发线程 Day18:软件开发流程

    io流的资料

    I/O流提供了在程序与外部资源(如文件、网络连接、硬件设备等)之间传输数据的能力。本资料主要涵盖了Java中的基本IO流概念、分类、常用类以及它们在实际开发中的应用。 1. **I/O流的分类** - 按照数据流向,I/O流...

    .NET网络编程与IO技术实践_源码

    4. **文件流和内存流**:`System.IO`命名空间包含了多种流类型,如`FileStream`、`MemoryStream`、`StreamReader`和`StreamWriter`。它们用于读写文件和内存中的数据,支持字符和字节级别的操作。 5. **网络数据...

Global site tag (gtag.js) - Google Analytics