- 浏览: 36802 次
- 性别:
- 来自: 福州
最新评论
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. 字符输出流类:
发表评论
-
14、JDBC数据库编程
2012-07-20 10:03 89214、JDBC数据库编程 14.1、为什么需要JDBC ... -
13、数据库(SQL)
2012-07-20 09:22 48613、数据库(SQL) 13.1、什么是SQL S ... -
12、java集合类
2012-07-12 09:58 86312、java集合类 12.1、Collection框 ... -
10.多线程
2012-06-13 10:29 75810、多线程 10.1、 进程与线程 进程: 简单 ... -
09.面向对象(6)--访问控制
2012-06-12 15:19 9149.类成员的访问控制 9.1、private访问控制 ... -
08.面向对象(5)--this、super、final、static等关键字
2012-06-12 11:02 8938、this、super、final、 ... -
07.面向对象(4)--抽象类和接口
2012-06-12 09:59 7677.接口和抽象类 7.1 ... -
06.面向对象(3)--面向对象3大特性:封装、继承和多态
2012-06-11 11:09 7486、面向对象3大特性:封装、继承和多态 6.1 封装性 ... -
05.面向对象(2)--函数方法
2012-06-11 10:32 7405、函数方法 5.1、方的重载 函数的重载就是在同 ... -
04.面向对象(1)--面向对象的概念
2012-06-09 11:41 7044、面向对象 4.1、面向对象的概念 4.1.1、 面向过 ... -
03.java 运算符、流程控制
2012-06-08 17:25 8143.1 java中的运算符 运算符是一种特殊符号 ... -
02.java 标示符、变量、常量
2012-06-08 14:34 841java 标示符、变量、常量 2.1 java是严格区分大小 ... -
01.java 介绍及环境变量配置
2012-06-08 13:04 7101.1 java 概述 1.1.1、java的历史地位 ...
相关推荐
Java中的I/O系统不仅涵盖了文件的读写,还包括网络数据交换、内存数据处理及控制台输入输出等多个方面。 Java通过引入流的概念,将各种不同类型的数据源(如文件、网络、内存)统一抽象为流,简化了程序员对不同...
I/O流是指在计算机系统中输入输出之间传输的数据序列。输入流指从外部源(如键盘、磁盘、网络)流向程序的数据,而输出流则是从程序流向外部设备(如显示器、打印机、磁盘)的数据。流式输入输出的一个特点是数据的...
I/O流是Java编程语言中的一种基本概念,用于处理输入输出数据的功能。在Java中,I/O流是通过流的概念来实现的,流是一种抽象表示,用于表示输入设备或输出设备。根据不同的功能,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 格式
I/O流分为两大类:字符流(Character Stream)和字节流(Byte Stream),每类又分为输入流(Input Stream)和输出流(Output Stream)。下面将详细解释这些概念以及它们在Java中的应用。 1. 字节流: - 输入流:...
C++中的I/O流库包括`iostream`,它是处理标准输入输出的基础。`iostream`库定义了几个核心类,例如`istream`用于输入,`ostream`用于输出,`ifstream`和`ofstream`则分别用于文件的读取和写入。这些类提供了操作流的...
在Java编程语言中,I/O(输入/输出)是程序与外部世界交互的重要部分,而标准输入输出流(System.in, System.out, System.err)是Java内置的预定义流,用于处理程序与操作系统之间的基本输入输出操作。这篇博客将深入...
### 输入输出流(I/O)概览 #### 一、File 类 **1. File 类简介** - **功能概述**:`File` 类是 Java 中用于处理文件和目录的核心类。它既可以用来表示一个文件也可以表示一个目录。尽管在 Java 中文件和目录都是...
流是数据传输的核心机制,分为字节流和字符流两大类,包括输入流和输出流。缓冲区则可以提高I/O操作的效率,减少磁盘和内存之间的交互次数。字符编码如UTF-8、GBK等在处理多语言文本时至关重要。 2. **标准I/O库**...
OReilly.Java.I.O.2nd.Edition.May.2006 Java的io包主要包括: 1. 两种流:字节流(byte Stream)和字符流(character stream),这两种流不存在所谓的谁代替谁、谁比谁高级之说,它们互为补充,只是侧重点不同...
- **FilterOutputStream**:相应地,输出过滤流的基类,它包裹一个OutputStream,并提供了扩展输出流功能的能力。 2. **格式化读写** - **DataInputStream** 和 **DataOutputStream**:这两个类提供了带格式的...
字节流是Java I/O的基础,分为输入流(InputStream)和输出流(OutputStream)。InputStream处理数据的输入,OutputStream处理数据的输出。它们都定义了读写数据的基本方法,如read()和write()。常用的子类有...
流可以是输入流或输出流,输入流用于从源头获取数据,输出流则用于向目的地发送数据。Java提供了许多预定义的流类,例如FileInputStream和FileOutputStream分别用于读取和写入文件,而SocketInputStream和...
Java文件输入输出(I/O)流是Java编程语言中用于处理数据传输的核心概念,主要涉及对文件的读写操作。Java I/O系统是基于流(Stream)的概念构建的,流可以被视为数据的有序序列,既可以是从内存到硬盘的写入,也...
总的来说,Java I/O、NIO和NIO.2是Java平台中处理输入输出的三个重要阶段,它们各自有其特点和适用范围。学习和运用这些技术,能够帮助开发者更好地处理数据交互,提高程序的性能和可扩展性。通过阅读《Java I:O, ...
Java输入输出流是Java编程中一个非常重要的概念,主要用于数据的读取和写入操作,包括文本文件和二进制文件。在实验9中,主要目的是理解和掌握I/O流的分类,以及如何进行文本和二进制文件的读写。 I/O流在Java中被...
在操作系统中,输入/输出(I/O)操作是计算机与外部设备交互的关键环节,例如读取硬盘上的数据或向显示器发送指令。I/O缓冲池是一种优化I/O性能的技术,通过在内存中设置缓冲区来减少直接硬件交互的次数,从而提高...
SmartStix产品具有多种I/O模块型号,包括数字输入输出模块(DI/O和DO)、模拟输入输出模块(AI/O和AO),以及混合I/O模块。这些模块根据输入输出点数的不同而有不同的尺寸和电流规格,例如16点和32点,电流规格可能...