`
johnnycmj
  • 浏览: 36926 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

11.I/O输入输出流

 
阅读更多

 

11、IO输入输出流

11.1、File类

File类是IO包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操纵文件,通过调用File类提供的各种方法,我们能够创建、删除文件,重命名文件,判断文件的读写权限及是否存在,设置和查询文件的最近修改时间。

 

import java.io.*;
	public class FileTest{
		public static void main(String[] args){
			File f=new File("c:\\1.txt");
			if(f.exists()){
				f.delete();
			}else{
				try{
					f.createNewFile();
				}catch(Exception e){
					System.out.println(e.getMessage());
				}
			}
			System.out.println("File name:"+f.getName());
			System.out.println("File path:"+f.getPath());
			System.out.println("Abs path:"+f.getAbsolutePath());
			System.out.println("Parent:"+f.getParent());
			System.out.println(f.exists()?"exists":"does not exist");
			System.out.println(f.canWrite()?"is writeable":" is not writeable");
			System.out.println(f.canRead()?"is readable":"is not readable");
			System.out.println(f.isDirectory()?"is ":"is not"+" a directory");
			System.out.println(f.isFile()?"is normal file":" might be a named pipe");
			System.out.println(f.isAbsolute()?"is absolute":" is not absolute");
			System.out.println("File last modified:"+f.lastModified());
			System.out.println("File size:"+f.length()+" Bytes");
		}
	}

 

11.2、RandomAccessFile类

 

RandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。RandomAccessFile类支持“随机访问”方式,我们可以跳转到文件的任意位置处读写数据。在你访问一个文件的时候,不想把文件从头读到尾,并希望像访问一个数据库一样的访问一个文本文件,使用RandomAccessFile类就是你的最佳选择。

创建RandomAccessFile类对象的构造方式:

new RandomAccessFile(f,"rw"); //读写方式

new RandomAccessFile(f,"r");  //只读方式

注:当我们的程序需要以读写的方式打开一个文件时,如果这个文件不存在,程序会为你创建它。

11.3、InputStream与OutputStream

程序可以从中连续读取字节的对象叫输入流,用InputStream类完成,程序能向其中连续写入字节的对象叫输出流,用OutputStream类完成。

InputStream定义了Java的输入流模型。该类中的所有方法在遇到错误的时候都会引发IOException异常,下面是InputStream类中方法的一个简要说明:

 

int read()返回下一个输入字节的整型表示,,如果返回-1表示遇到流的末尾,结束。

int read(byte[] b)读入b.length个字节放到b中并返回实际读入的字节数。

int read(byte[] b,int off,int len) 这个方法表示把流中的数据读到,数组b中,第off个开始的len个数组元素中.

long skip(long n) 跳过输入流上的n个字节并返回实际跳过的字节数。

int availabale() 返回当前输入流中可读的字节数。

void mark(int readlimit)在输入流的当前位置处放上一个标志,允许最多再读入readlimit个字节。

void reset() 把输入指针返回到以前所做的标志处。

boolean markSupported() 如果当前流支持mark/reset操作就返回true。

void close()  在操作完一个流后要使用此方法将其关闭, 系统就会释放与这个流相关的资源。

InputStream是一个抽象类,程序中实际使用的是它的各种子类对象。不是所有的子类都会支持InputStream中定义的某些方法的,如skip,mark,reset等,这些方法只对某些子类有用。

 

OutputStream是一个定义了输出流的抽象类,这个类中的所有方法均返回void,并在遇到错误时引发IOException异常。下面是OutputStream的方法:

void write(int b) 将一个字节写到输出流。注意,这里的参数是int型,它允许write使用表达式而不用强制转换成byte型。

void write(byte[] b) 将整个字节数组写到输出流中。

void write(byte [] b,int off,int len) 将字节数组b中的从off开始的len个字节写到输出流。

void flush彻底完成输出并清空缓冲区。

void close关闭输出流。

 

11.4、FileInputStream与FileOutputStream

这两个流节点用来操作磁盘文件,在创建一个FileInputStream对象时通过构造函数指定文件的路径和名字,当然这个文件应当是存在的和可读的。

有两种创建方式:

FileInputStream inOne=new FileInputStream("hello.test");
		File f = new File("hello.test"); 
		FileInputStream inTwo = new FileInputStream(f);

 例如:

import java.io.*;
	public class FileStream{
		public static void main(String[] args){
			File f = new File("hello.txt"); 
			try{
				FileOutputStream out = new FileOutputStream(f);
				byte buf[]="www.it315.org".getBytes();
				out.write(buf);
				out.close();
			}catch(Exception e){
				System.out.println(e.getMessage());
			}
		
			try{
				FileInputStream in = new FileInputStream(f);
				byte [] buf = new byte[1024];
				int len = in.read(buf);
				System.out.println(new String(buf,0,len));
			}catch(Exception e){
				System.out.println(e.getMessage());
			}
		}
	}

 

11.5、Reader与Writer

Java中的字符是unicode编码,是双字节的,而InputStream与OutputStream是用来处理字节的,在处理字符文本时不太方便,需要编写额外的程序代码。Java为字符文本的输入输出专门提供了一套单独的类,Reader、Writer两个抽象类与InputStream、OutputStream两个类相对应,同样,Reader、Writer下面也有许多子类,对具体IO设备进行字符输入输出,如FileReader就是用来读取文件流中的字符。

import java.io.*;
	public class FileStream{
		public static void main(String[] args){
			File f = new File("hello.txt"); 
			try{
				FileWriter out = new FileWriter(f);
				out.write("www.it315.org");
				out.close();
			}catch(Exception e){
				System.out.println(e.getMessage());
			}
		
			try{
				FileReader in = new FileReader(f);
				char [] buf = new char[1024];
				int len = in.read(buf);
				System.out.println(new String(buf,0,len));
			}catch(Exception e){
				System.out.println(e.getMessage());
			}
		}
	}
 

11.6、PipedInputStream与PipedOutputStream

一个PipedInputStream对象必须和一个PipedOutputStream对象进行连接而产生一个通信管道,PipedOutStream可以向管道中写入数据,PipedInputStream可以从管道中读取PipedOutputStream写入的数据。这两个类主要用来完成线程之间的通信,一个线程的PipedInputStream 对象能够从另外一个线程的PipedOutputStream对象中读取数据。

import java.io.*;
	public class PipeStreamTest{
		public static void main(String args[]){
			try{
				Thread t1=new Sender();
				Thread t2=new Receiver();
				PipedOutputStream out = t1.getOutputStream();
				PipedInputStream in = t2.getInputStream();
				out.connect(in);
				t1.start();
				t2.start();
			}catch(IOException e){
				System.out.println(e.getMessage());
			}
		}
	}
	
	class Sender extends Thread{
		private PipedOutputStream out=new PipedOutputStream();
		public PipedOutputStream getOutputStream(){
			return out;
		}
		public void run(){
			String s=new String("hello,receiver ,how are you");
			try{
				out.write(s.getBytes());
				out.close();
			}catch(IOException e){
				System.out.println(e.getMessage());
			}
		}
	}
	
	class Receiver extends Thread{
		private PipedInputStream in=new PipedInputStream();
		public PipedInputStream getInputStream(){
			return in;
		}
		public void run(){
			String s=null;
			byte [] buf = new byte[1024];
			try{
				int len =in.read(buf);
				s = new String(buf,0,len);
				System.out.println("the following message comes from sender:\n"+s);
				in.close();
			}catch(IOException e){
				System.out.println(e.getMessage());
			}
		}
	}

 

11.7、ByteArrayInputStream与ByteArrayOutputStream

ByteArrayInputStream是输入流的一种实现,它有两个构造函数,每个构造函数都需要一个字节数组来作为数据源:

ByteArrayInputStream(byte[] buf) 

ByteArrayInputStream(byte[] buf, int offset, int length)

第二个构造函数指定仅使用数组buf中的从offset开始的length个元素作为数据源。

ByteArrayOutputStream是输出流的一种实现,它也有两个构造函数。

ByteArrayOutputStream()

ByteArrayOutputStream(int)

第一种形式的构造函数创建一个32字节的缓冲区,第二种形式则是根据参数指定的大小创建缓冲区,缓冲区的大小在数据过多时能够自动增长。

11.8、BufferedInputStream与 BufferedOuputStream

对I/O进行缓冲是一种常见的性能优化。缓冲流为I/O流增加了内存缓冲区。增加缓冲区有两个基本目的:

允许Java的I/O一次不只操作一个字节,这样提高了整个系统的性能。

由于有缓冲区,使得在流上执行skip、mark和reset方法都成为可能。

BufferedInputStream

Java的BufferedInputStream类可以对任何的InputStream进行带缓冲区的封装以达到性能的改善。BufferedInputStream有两个构造函数:

BufferedInputStream(InputStream in)

BufferedInputStream(InputStream in,int size)

第一种形式的构造函数创建了一个带有32字节缓冲区的缓冲流,第二种形式的构造函数按指定的大小来创建缓冲区。

BufferedOutputStream

往BufferedOutputStream输出和往OutputStream输出完全一样,只不过BufferedOutputStream有一个flush方法用来将缓冲区的数据强制输出完。与缓冲区输入流不同,缓冲区输出流没有增加额外的功能。在Java中使用输出缓冲也是为了提高性能。它也有两个构造函数:

BufferedOutputStream(OutputStream out)

BufferedOutputStream(OutputStream out,int size)

第一种形式创建一个32字节的缓冲区,第二种形式以指定的大小来创建缓冲区。

11.9、DataInputStream与 DataOutputStream

DataOutputStream类提供了三种写入字符串的方法,分别是

public final void writeBytes(String?s) throws IOException

public final void writeChars(String?s) throws IOException

public final void writeUTF(String?str) throws IOException

11.10、字节流与字符流的转换

InputStreamReader 和 OutputStreamWriter 

这两个类是字节流和字符流之间转换的类,InputStreamReader可以将一个字节流中的字节解码成字符,OuputStreamWriter将写入的字符编码成字节后写入一个字节流。其中InputStreamReader有两个主要的构造函数:

InputStreamReader(InputStream?in) //用默认字符集创建一个InputStreamReader对象

InputStreamReader(InputStream in,String CharsetName) //接受以指定字符集名的字符串,并用//该字符集创建对象

OutputStreamWriter也有对应的两个主要的构造函数:

OutputStreamWriter(OutputStream?in) //用默认字符集创建一个OutputStreamWriter对象

OutputStreamWriter(OutputStream?in,String CharsetName) //接受以指定字符集名的字符串,并用该字符集创建OutputStreamWriter对象

为了达到最好的效率,避免频繁的字符与字节间的相互转换,我们最好不要直接使用这两个类来进行读写,应尽量使用BufferedWriter类包装OutputStreamWriter类,用BufferedReader类包装InputStreamReader。例如:

BufferedWriter out=new BufferedWriter(newOutputStreamWriter(System.out));

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

读取到键盘上输入的一整行字符,只要用下面的两行程序代码就可以解决这个问题:

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

String strLine = in.readLine();

11.11、IO包中的类层次关系图

1. 字节输入流类:



 

2. 字节输出流类:


3. 字符输入流类:


4. 字符输出流类:


  • 大小: 41 KB
  • 大小: 30.1 KB
  • 大小: 14.7 KB
  • 大小: 14.1 KB
分享到:
评论

相关推荐

    怎么使用I/O编程???

    Java中的I/O系统不仅涵盖了文件的读写,还包括网络数据交换、内存数据处理及控制台输入输出等多个方面。 Java通过引入流的概念,将各种不同类型的数据源(如文件、网络、内存)统一抽象为流,简化了程序员对不同...

    java对I/O流的处理

    I/O流是指在计算机系统中输入输出之间传输的数据序列。输入流指从外部源(如键盘、磁盘、网络)流向程序的数据,而输出流则是从程序流向外部设备(如显示器、打印机、磁盘)的数据。流式输入输出的一个特点是数据的...

    关于I/O流读写文件

    I/O流是Java编程语言中的一种基本概念,用于处理输入输出数据的功能。在Java中,I/O流是通过流的概念来实现的,流是一种抽象表示,用于表示输入设备或输出设备。根据不同的功能,I/O流可以分为输入流和输出流两种。 ...

    实验七 C++的I/O流(验证性)

    C++的I/O流实验报告 C++的I/O流是计算机编程中一个非常重要的概念,它涉及到...[2] C++的I/O流.by Microsoft Press,2003 八、实验报告附件 附件 1:实验代码(sy9_2、sy9_3、sy9_4) 附件 2:实验报告 doc 格式

    java基础之I/O流

    I/O流分为两大类:字符流(Character Stream)和字节流(Byte Stream),每类又分为输入流(Input Stream)和输出流(Output Stream)。下面将详细解释这些概念以及它们在Java中的应用。 1. 字节流: - 输入流:...

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

    C++中的I/O流库包括`iostream`,它是处理标准输入输出的基础。`iostream`库定义了几个核心类,例如`istream`用于输入,`ostream`用于输出,`ifstream`和`ofstream`则分别用于文件的读取和写入。这些类提供了操作流的...

    Java I/O 标准输入输出流System.in

    在Java编程语言中,I/O(输入/输出)是程序与外部世界交互的重要部分,而标准输入输出流(System.in, System.out, System.err)是Java内置的预定义流,用于处理程序与操作系统之间的基本输入输出操作。这篇博客将深入...

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

    ### 输入输出流(I/O)概览 #### 一、File 类 **1. File 类简介** - **功能概述**:`File` 类是 Java 中用于处理文件和目录的核心类。它既可以用来表示一个文件也可以表示一个目录。尽管在 Java 中文件和目录都是...

    Java I/O, 2nd Edition

    流是数据传输的核心机制,分为字节流和字符流两大类,包括输入流和输出流。缓冲区则可以提高I/O操作的效率,减少磁盘和内存之间的交互次数。字符编码如UTF-8、GBK等在处理多语言文本时至关重要。 2. **标准I/O库**...

    Java I/O 第二版

    OReilly.Java.I.O.2nd.Edition.May.2006 Java的io包主要包括: 1. 两种流:字节流(byte Stream)和字符流(character stream),这两种流不存在所谓的谁代替谁、谁比谁高级之说,它们互为补充,只是侧重点不同...

    Java I/O 过滤流-带格式的读写操作

    - **FilterOutputStream**:相应地,输出过滤流的基类,它包裹一个OutputStream,并提供了扩展输出流功能的能力。 2. **格式化读写** - **DataInputStream** 和 **DataOutputStream**:这两个类提供了带格式的...

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

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

    深入分析 Java I/O 的工作机制(转载)

    流可以是输入流或输出流,输入流用于从源头获取数据,输出流则用于向目的地发送数据。Java提供了许多预定义的流类,例如FileInputStream和FileOutputStream分别用于读取和写入文件,而SocketInputStream和...

    Java文件输入输出(I/O)流.pdf

    Java文件输入输出(I/O)流是Java编程语言中用于处理数据传输的核心概念,主要涉及对文件的读写操作。Java I/O系统是基于流(Stream)的概念构建的,流可以被视为数据的有序序列,既可以是从内存到硬盘的写入,也...

    Java I/O, NIO and NIO.2

    总的来说,Java I/O、NIO和NIO.2是Java平台中处理输入输出的三个重要阶段,它们各自有其特点和适用范围。学习和运用这些技术,能够帮助开发者更好地处理数据交互,提高程序的性能和可扩展性。通过阅读《Java I:O, ...

    实验9 Java输入输出流.doc

    Java输入输出流是Java编程中一个非常重要的概念,主要用于数据的读取和写入操作,包括文本文件和二进制文件。在实验9中,主要目的是理解和掌握I/O流的分类,以及如何进行文本和二进制文件的读写。 I/O流在Java中被...

    I/O缓冲池演示程序

    在操作系统中,输入/输出(I/O)操作是计算机与外部设备交互的关键环节,例如读取硬盘上的数据或向显示器发送指令。I/O缓冲池是一种优化I/O性能的技术,通过在内存中设置缓冲区来减少直接硬件交互的次数,从而提高...

    浩纳尔OCS SmartStix 现场总线I/O产品说明.pdf

    SmartStix产品具有多种I/O模块型号,包括数字输入输出模块(DI/O和DO)、模拟输入输出模块(AI/O和AO),以及混合I/O模块。这些模块根据输入输出点数的不同而有不同的尺寸和电流规格,例如16点和32点,电流规格可能...

Global site tag (gtag.js) - Google Analytics