您的位置:首页 > 编程语言 > Java开发

JAVA IO总结

2014-07-21 10:13 281 查看
1.    File类

1.1常用方法

Public static final StringpathSeparator

Public static final Stringseparator

Public File(String pathname)

Public Boolean createNewFile()throws IOException//通过给定路径建立文件

Public Boolean delete()

Public boolean isDirectory()

Public booleanexists()

Public longlength()

Public File[]listFiles()

Public String[]list()

Public booleanmkdir()

Public booleanrenameTo(File dest)

示例:File f=new File("D:\\test.txt");
      f.createNewFile();
      Filen=newFile("d:"+File.separator+"1.txt");
    n.delete();

文件操作都差不多,先用路径初始化文件,然后调用方法。

2.  RandomAccessFile类

方法:

Public RandomAccessFile(File file,String mode) throwsFileNotFoundException

Public RandomAccessFile(String path,String mode)

Public void close()

Public int read(byte[] b)

Public final int reading()

Public final byte readByte()

Pbulic void seek(long pos)//设置读指针的位置

Public final void writeBytes(String s)

Public final void writeInt(int v)

Public int skipBytes(int n)

 

 

 

 

RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。

RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。

 

基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer(),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。

只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。

RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的"内存映射文件(memory-mappedfiles)"给取代了,你该考虑一下是不是用"内存映射文件"来代替RandomAccessFile了。

3.  输入流本身单独出来是一个对象,数据向内流动,故方法为read

输出流本身单独出来是一个对象,数据向外流动,故方法为write

 

字节流和字符流

OutputStream类

 

Public void flush()throw IOException 强制清空

Public void write(byte[] b)

Public void write(byte[] b,int off,int len)

Public abstract void write(int b)

代码:String source=”djljljj”;
byte[] b=source.getBytes();
           for(int i=0;i<b.length;i++)
          out.write(b[i]);

InputStream类

 

Public int available() 取得文件的大小

Public abstract int read() 读取内容,以数字的方式读取

Public int read(byte[] b)将内容读取到byte数组中,返回读入的个数

 

 

Writer类

public abstract class writer

Extends Object

Implements Appendable,Closeable,Flushable

 

Public abstract void flush()

Public void write(String str)

Public void write(char[] cbuf)

 

可以使用FileWriter类实现文件的追加功能

Public FileWriter(File file,Boolean append)throws IOException

 

Reader类

Public abstract class Reader

Extends Object

Implements Readable,Closeable

 

Public int read() 读取单个字符

Public int read(char[] cbuf)

 

 

 

 

一个疑问:

D:\\1.txt文件中 是 sdslk中国人

程序:

public
staticvoid
main(String[] args)
throws
Exception {
          Reader r=new FileReader(new File("d:\\1.txt"));
          char[] cbuf=new
char
[1024];
          int temp=0,len=0;
          while((temp=r.read())!=-1){
             cbuf[len]=(char) temp;
             len++;
          }
          System.out.println(new String(cbuf,0,len));
         
       }

 

输出:sdslk乱码

 

 

字节流和字符流的区别

 

字节流操作时不会用到缓冲区,对文件本身直接操作。

字符流需要使用缓冲区,通过缓冲区再操作文件。

所以向文件写入时,Writer如果不关闭的话,文件无内容。(可以用flush()方法刷新)

而程序运行完后OutputStream不关闭,数据也已经写入到了文件中。

 

4.  转换流

OutputStreamWriter:是Writer的子类,将输入(写)的字符流转换为字节流

InputStreamReader:是Reader的子类,将输出(读)的字节流转换为字符流

 

故最终都是以字节的形式对文件进行操作。

 

FileWriter不直接是Writer的子类,而是OutputStreamWriter的子类。同样FileReader不直接是Reader的子类,而是InputStreamReader的子类。

 

 

 

5.  内存操作流

ByteArrayInputStream 从内存中读出

ByteArrayOutputStream 往内存里写入

 

ByteArrayInputStream类

Public ByteArrayInputStream(byte[] buf)//将buf作为流

Public ByteArrayInputStream(byte[] buf,int offset,intlength)//将指定范围的内容作为流

Publicint read()  从此输入流中读取下一个数据字节

Int read(byte[] b, int off, int len) 

          将最多 len 个数据字节从此输入流读入字节数组

ByteArrayOutputStream类

Public ByteArrayOutputStream()

Public void write(int b)//向内存中写入

 

 

此类实现了一个输出流,其中的数据被写入一个 byte
数组。缓冲区会随着数据的不断写入而自动增长。可使用toByteArray()和toString()获取数据

 

程序:ByteArrayOutputStreambout=newByteArrayOutputStream();
      Stringstr="llsdfj";
       byte[] buf=str.getBytes();//获取内存缓冲中的数据
       for(inti=0;i<buf.length;i++)
       {
         bout.write(buf[i]);
       }
       System.out.println(bout.toString());
       bout.close();
       bout.write(buf[1]);
     System.out.println(bout.toString());

 

关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。

 

内存操作流一般在生成一些临时信息时使用

 

 

6.    Scanner类 java.util.scanner

Public final class Scanner

Extends Object

Implements Iterator<String>

一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。

专门的输入数据类,不仅可以可以完成输入数据操作,还可以方便的对数据进行验证。

Public Scanner(File file)

Public scanner(InputStream source)

Public Boolean hasNext(Pattern pattern)//判断输入数据是否符合指定正则标准

Public Boolean hasNextInt()//判断输入数据是否是整数

Public Boolean hasNextFloat()

Public String next(Pattern pattern)

Public String next()

Public int nextInt()

Pbulic Scanner useDelimiter(String pattern)

 

7.  管道流

用于进行两个进程间的通信

PipedOutputStream -------------àPipedInputStream

 

Public void connect(PipedInputStream snk)throwsIOException

 

进程通信的内容不一定希望被记录下来,而且使用普通文件,需要频繁的io
管道单向流的方式保证数据只会被管道的另一端读到,不用考虑同步。

 

 

8.  打印流

打印流提供方便的打印功能,可以打印任何数据类型。

public class PrintStream

extends FilterOutputStream

implements Appendable, Closeable

 

public PrintStream(File file)

public PrintStream(OutputStream out)

public PrintStream printf(Locale l,String format,Object…args)

public PrintStream printf(String format,Object…args)//本地环境格式化输出

public void print(Boolean b)//重载许多次,输出任意数据

public void println(Boolean b)//重载许多次,输出任意数据

 

System类对IO的支持

System类的常量

public static final PrintStream out

public static final PrintStream err

public static final InputStream in

 

 

输入输出重定向

 

System类提供的重定向方法

Public static void setout(PrintStream out)

Public static void setErr(PrintStream err)

Public static void setIn(InputStream in)

 

 

例如System.out输出到文件中,System.err输出到内存输出流中或者System.in重定向到从文件中读取

 

 

System.out是PrintStream的对象,PrintStream是OutputStream的子类,可以利用此对象实例化OutputStream的对象,并利用此对象向屏幕上输出。

OutputStream的哪个子类为其实例化,就具备了向哪里输出的能力。

FileOutputStream或System.out

 

例子:
   //System.out实例化OutputStream的对象,并利用此对象向屏幕上输出
 
OutputStreamout=System.out;
    String str="sfjjljj";

out.write(str.getBytes());

 

 

例子:

//System.in重定向到从文件中读取

 

System.setIn(new FileInputStream(newFile("d:\\1.txt")));

InputStreamin=System.in;
      byte[] b=new
byte
[1024];
      int len = 0;
    len =in.read(b);

9.  BufferedReader类

它只能接收字符流的缓冲区

Public BufferedReader(Reader in)

Public String readLine()

 

 

 

 

10. 数据操作流

按照一定的格式将数据输出和输入。

Public class DataOutputStream extendsFilterOutputStream implements DataOutput

在DataOutput接口定义了一系列的写入各种数据的方法

 

 

 

 

注意:以什么样的编码写入数据,才能以什么样的编码读出数据。

要用dis.readFloat()必须先有dos.writeFloat()

要用dis.readUTF()必须先有dos.writeUTF()

 

 

 

11. 合并流

SequenceInputStream

代码:

SequenceInputStream sis=new SequenceInputStream(new FileInputStream(new File("d:\\1.txt")),new
FileInputStream(new File("d:\\2.txt")));
      int temp=0;
      OutputStreamout=newFileOutputStream(newFile("d:\\3.txt"));
      while((temp=sis.read())!=-1){
         out.write(temp);
    }

 

 

 

12. 对象流

序列化接口

 

Public class ObjectOutputStream

Extends OutputStream

Implements ObjectOutput,ObjectStreamConstants

 

 

ObjectInputStream

 

 

 

如果想根据自己需要选择被序列化的属性,可以使用另一种序列化接口————Externalizable接口

 

 

 

如果一个类要使用Externalizable实现序列化,必须要有一个无参构造函数。反序列化时默认调用无参构造实例化对象,否则出现异常。

 

 

 

序列化一组对象

数组属于引用对象类型,可以用Object类型来进行接收。

代码:

Person p[]={new
Person(21,"张二"),new
Person(44,"李四")};
    oos.writeObject(p);

 

Objecta[]=(Object[])ois.readObject();
      for(int i=0;i<a.length;i++)
    System.out.println((Person)a[i]);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息