JavaIO流(一)

原创 2015年07月10日 12:30:51
1、 File类
       File类是IO包中唯一代表磁盘文件和目录本身信息的类,而不是文件中的内容。
       File类定义了一些方法来操纵文件,例如:创建、删除文件及重命名文件。Java中的目录被当做一种特殊的文件使用,list方法可以返回目录中的所有子目录和文件名。
       (1)File类的构造函数
            File(File parent,String child):使用一个File对象parent与字符串创建一个File对象。
            File(String pathname):使用指定的路径pathname创建一个File对象。
            File(String parent,String child):使用指定的路径与字符串创建一个File对象。
            例如:File f=new File("c:\\abc.txt");     File file=new File("c:\\","abc.txt");    File file=new File("c:\\");
       (2)File类的一些常用方法
            String getPath():返回File代表的路径。
            String getParent():返回上一层路径。
            String getName():返回File所代表的目录或文件名称,即整个路径的最后一段字符串。
            String getAbsolutePath():将File代表的内容转换成绝对路径。
            boolean exists():检查File所代表的路径是否存在。
            long length():返回File代表的路径占了几个字节。
            boolean createNewFile()Throws IOException:以File的内容为文件名建立一个新文件。
       (3)列出目录中的文件
            如果我们对list方法不使用任何参数,将可以取得File对象所包含的完整列表。如果想设定某些筛选条件,可以使用目录过滤器listFiles()方法。例如:得到某个File对象的所有文件,并过滤出后缀是.txt的文件如下面代码所示:
		File file=new File("E:\\");
		File[] fs=file.listFiles();//若当前对象代表目录,则将此目录内所有文件转换为File对象,返回File数组,若当前对象非目录,则返回null
		if(null==fs){
		   System.out.println("目录不存在或者为空");
		}else{	
			for(File f:fs){
				if(f.isDirectory()){
					System.out.print("目录:");
				}else{
					System.out.print("文件:");
				}
				System.out.println(f);
				if(f.getName().toLowerCase().endsWith(".txt")){
					System.out.println("txt file:"+f);
				}
			}
		}
2、 流
       Java中对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称之为流,是因为这个数据列在不同时刻所操作的是源的不同部分。
       流代表任何有能力产生数据的数据源,或是有能力接收数据的接收端,例如键盘就是一个标准的输入流,因为它可以产生数据。前面所说的File类关心的是磁盘上存储的文件,而流类将关心的是文件的内容。
       从流的方向上来看可以分为输入流和输出流。
       从流的类型上来看可以分为字节流和字符流。
       字节流:按字节对文件进行数据读写操作,适合于二进制文件。对于图像音频等人不可读的,也不需要读的,其他程序需要直接处理字节的,这时候用字节流。
       字符流:在字节流的基础上进行编码,也就是需要读其中的内容时,可以用字符流。
       字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符集;字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以;字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过InputStreamReader和OutputStreamWriter来关联,实际上是通过byte[]和String来关联。下面我们用几个常用类型的数据来比较下字节流跟字符流的区别:
                int a=5;
		boolean b=true;
		char c='G';
		String d="你好";		
		try {
			//使用字符流打印数据到文件中,字符流完全保证了和我们输入的字符一致。
			PrintWriter pw=new PrintWriter(new File("e:\\IODemo1.txt"));
			pw.print(b);//true
			pw.print(a);//5
			pw.print(c);//G
			pw.print(d);//你好
			pw.close();
			//再看看字节流
			DataOutputStream dos=new DataOutputStream(new FileOutputStream("e:\\IODemo1.txt"));
			dos.writeInt(a);
			dos.writeBoolean(b);
			dos.writeChar(c);
			dos.writeUTF(d);
			dos.writeChars(d);
			dos.writeBytes(d);
			dos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
       字节流结果是二进制文件,我们用十六进制编辑器打开可以得到下面的结果

       a是00 00 00 05,int是四个字节。b是01,布尔型变量一个字节。c是00 47,char是两个字节。d分别用3个不同的函数写进文件中,第一个是00 06 E4 BD A0 E5 A5 BD,前面的00 06是writeUTF方法加上去的,表示字节的数目,后面六个字节是“你好”的UTF编码,每个汉字3个字节;第二个是4F 60 59 7D,这是“你好”的Unicode编码,每个汉字2个字节;第三个是60 7D,这是从4F 60 59 7D中分别取得两个汉字的低字节。
3、 字节流
        (1)InputStream(所有字节输入流的父类,高级流)与OutputStream(所有字节输出流的父类)
             我们把能够读取一个字节序列的对象称为输入流;我们把能够写入一个字节序列的对象称为输出流。Java中用java.io.InputStream来描述输入流基类,java.io.OutputStream来描述输出流的基类;这两个类都是抽象的,所以Java中让所有和输入相关的类都继承自InputStream,让所有和输出相关的类都继承自OutputStream。
             InputStream一些常用方法:
 int read();//Reads the next byte of data from the input stream,返回值为int,当返回-1时,文件读取完
 int read(byte[] b);//Reads some number of bytes from the input stream and stores them into the buffer array b.返回值为实际读取到的字节数      
 int read(byte[] b,int off,int len); //读取len个字节,放置到下标off开始的字节数组b中,返回值为实际读取的字节数量。
 long skip(long n);//读指针跳过n个字节不读,返回值为实际跳过的字节数量
 close();//流操作完后必须关闭
             OutputStream的一些常用方法:
void write(int b);//往流中写一个字节b
void write(byte[] b);//往流中写一个字节数组b
void write(byte[]b,int off,int len);//把字节数组b从下标off开始,长度为len的字节写入流中
flush();//刷空输出流,并输出所有被缓存的字节,由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
close();//关闭流,流操作完毕后必须关闭。 
       (2)FileInputStream与FileOutputStream
             这两个类负责文件的读写操作,读写的内容都是字节或字节数组,换句话说,这两个类可以处理计算机中任何的数据,因为计算机中数据存储最终都是字节存储的。
             FileInputStream:文件输入字节流,低级流
             File file=new File("D:/aaa.txt");
             FileInputStream fis=new FileInputStream(file);
             fis.close();使用完后将流关闭 在程序中有高级流和低级流时,关闭高级流就好,高级流会自动关闭自己调用的低级流
             FileOutputStream:文件输出字节流,低级流,
             FileOutputStream fos=new FileOutputStream(file);输出时会覆盖原文件内容
             FileOutputStream fos1=new FileOutputStream(file,true);true不会覆盖原文件内容,而是在末尾追加,false会覆盖原内容。
       (3)DataInputStream与DataOutputStream
             DataInputStream与DataOutputStream分别继承自FileInputStream与FileOutputStream,分别实现了DataInput接口与DataOutput接口,这两个类主要提供了对java基本数据类型包括字符串类型进行读写的功能。
             构造函数如下:
              public DataInputStream(InputStream in)
              public DataOutputStream(OutputStream out)
       (4)BufferedInputStream与BufferedOutputStream
             BufferedInputStream与BufferedOutputStream可以为InputStream、OutputStream类的对象增加缓冲区功能。构建BufferedInputStream实例时,需要给定一个InputStream类型的实例,实现BufferedInputStream时,实际上最后是实现InputStream实例。构建BufferedOutputStream实例时,需要给定一个OutputStream类型的实例,实现BufferedOutputStream时,实际上最后是实现OutputStream实例。
             BufferedInputStream的数据成员buf是一个位数组,默认为2048字节。当读取数据来源时,例如文件,会尽量将buf填满。当使用read方法时,实际上是先读取buf中的数据,而不是直接对数据源作读取。
             BufferedOutputStream的数据成员buf是一个位数组,默认为512字节,当使用write方法写入数据时,实际上会先将数据写到buf中,当buf满了才会实现给定的write方法,将buf数据写到目的地,而不是每次都对目的地做写入的动作。为了确保缓冲区中的数据一定被写至目的地,建议最后执行flush()将缓冲区中的数据全部写出目的流中。
       (5)ByteArrayInputStream和ByteArrayOutputStream
             流的来源或目的地不一定是文件,也可以是内存中的一个空间,例如一个位数组。ByteArrayInputStream和ByteArrayOutputStream即是将位数组当做流输入来源、输出目的地的类。


           



JavaIO流分类详解与常用流用法实例

Java流概念:Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO。可以把流想象成水流,里面的水滴有序的朝某一方向流动。水滴就是数据,且代表着最小的数据流动单位...
  • zhangliangzi
  • zhangliangzi
  • 2016年04月23日 17:01
  • 2005

javaIO流、File文件知识总结

JAVA流 流 定义:一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。            本质是数据传输。 作用:数据在设备间进行传递。 分类:按流向不同       ...
  • Yujan_2015
  • Yujan_2015
  • 2017年12月06日 21:48
  • 72

【JAVA开发之IO流1-1】IO流简介及输入流和输出流

I/O流(input/output),简称流,是一种特殊的类。 其中按功能可以分为输入流、输出流: 输入流:程序读取数据源到内存。数据源为外界(硬盘、网络、键盘输入),即是将外部数据读入到程序内存的通...
  • qq_33706077
  • qq_33706077
  • 2016年03月23日 18:19
  • 615

javaIO流之字节流的四种方式复制文件方式总结

/* * 需求:把e:\\a.mp4复制到当前项目目录下的copy.mp4中 * * 字节流四种方式复制文件: * 基本字节流一次读写一个字节: 共耗时:117235毫秒 * 基本字节流一...
  • u012110719
  • u012110719
  • 2015年07月25日 23:43
  • 1086

IO流面试题

1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 答案 Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 Byte是计算机...
  • t0404
  • t0404
  • 2016年07月12日 22:31
  • 11470

黑马程序员_javaIO流(一)

---------------------- android培训、java培训、期待与您交流! ---------------------- 一、io概述 字节流两个基类: InputStr...
  • zwq5337
  • zwq5337
  • 2012年05月29日 21:35
  • 110

java之十 高级IO流

java.io定义的输入/输出类列于下表: ObjectInputStream.GetField和ObjectOutputStream.PutField是Java2新添的内部类。 ...
  • zhangchen124
  • zhangchen124
  • 2016年05月24日 19:20
  • 4496

java中IO流的知识点总结

1.流的概念流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。2.IO流...
  • u011626964
  • u011626964
  • 2015年09月01日 10:39
  • 7263

java设计模式--装饰器设计模式(javaIO设计使用)

装饰器(Decorator)模式            Decorator设计模式是典型的结构型模式(在GOF的那本模式的Bible中将模式分为:1.创建型模式;2.结构型模式;3.行为模式三种)...
  • a151296
  • a151296
  • 2015年02月08日 11:51
  • 345

java要点笔记——IO流

------- android培训、java培训、期待与您交流! ---------- IO流 day2001-IO流(输入流&输出流) 1、IO(Input  Output)流:IO流用来处理设备...
  • u013114489
  • u013114489
  • 2015年07月22日 11:32
  • 496
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaIO流(一)
举报原因:
原因补充:

(最多只允许输入30个字)