黑马程序员_IO流

—————————— ASP.Net+Android+IOS开发.Net培训、期待与您交流!——————————

IO流的概念:通过数据流、序列化和文件系统提供系统输入和输出。

IO流 提供的Api包在java.io包内。


                                           流类图结构


java IO的一般使用原则:
一、按数据来源(去向)分类:
  1、是文件: FileInputStream,   FileOutputStream,   FileReader,   FileWriter
  2、是byte[]:ByteArrayInputStream,   ByteArrayOutputStream
  3、是Char[]: CharArrayReader,   CharArrayWriter
  4、是String: StringBufferInputStream,   StringReader,   StringWriter
  5、网络数据流:InputStream,   OutputStream,   Reader,   Writer

二、按是否格式化输出分:
  要格式化输出:PrintStream,   PrintWriter

三、按是否要缓冲分:
  要缓冲:BufferedInputStream,   BufferedOutputStream,   BufferedReader,   BufferedWriter

四、按数据格式分:
  1、二进制格式(只要不能确定是纯文本的): InputStream,   OutputStream及其所有带Stream结束的子类
  2、纯文本格式(含纯英文与汉字或其他编码方式);Reader,   Writer及其所有带Reader, Writer的子类

五、按输入输出分:
  1、输入:Reader,   InputStream类型的子类
  2、输出:Writer,   OutputStream类型的子类

六、特殊需要:
  1、从Stream到Reader,Writer的转换类:InputStreamReader,   OutputStreamWriter
  2、对象输入输出:ObjectInputStream,   ObjectOutputStream
  3、进程间通信:PipeInputStream,   PipeOutputStream,   PipeReader,   PipeWriter
  4、合并输入:SequenceInputStream
  5、更特殊的需要:PushbackInputStream,   PushbackReader,   LineNumberInputStream,   LineNumberReader

总结:
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
  第一,考虑最原始的数据格式是什么:是否为文本?   是:字符流。  不是:字节流。
  第二,是输入还是输出?    输入流:InputStream  Reader。输出流:OutputStream  Writer。
  第三,是否需要转换流:InputStreamReader, OutputStreamWriter?
  第四,数据来源(去向)是什么:文件?内存?网络?
  第五,是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
  第六,是否要格式化输出:print?

File类常见方法

  1,创建。  boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。      

     和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

     boolean mkdir():创建文件夹。

     boolean mkdirs():创建多级文件夹。

  2,删除。  boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。  

    void deleteOnExit();在程序退出时删除指定文件。

  3,判断。  boolean exists() :文件是否存在.

        isFile():

        isDirectory();

        isHidden();  

        isAbsolute();

  4,获取信息。  getName():  

          getPath():

          getParent():

            getAbsolutePath()

            long lastModified()

            long length()

  列出指定目录下文件或者文件夹,包含子目录中的内容。因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。 在列出过程中出现的还是目录的话,还可以再次调用本功能。 也就是函数自身调用自身。 这种表现形式,或者编程手法,称为递归

递归要注意:

  1,限定条件。

  2,要注意递归的次数。尽量避免内存溢出。

  删除一个带内容的目录。 原理: 在window中,删除目录从里面往外删除的。既然是从里往外删除。就需要用到递归。

编码:字符串——>字节数组。

解码:字节数组——>字符串。

 

常见的编码表

ASCII:美国标准信息交换码。

   用一个字节的7位可以表示。

ISO8859—1:拉丁码表。欧洲码表

   用一个字节的8位表示。

GB2312:中国的中文编码表。

GBK:中国的中文编码表升级,融合了更多的中文文字符号。

Unicode:国际标准码,融合了多种文字。

  所有文字都用两个字节来表示,Java语言使用的就是unicode

UTF—8:最多用三个字节来表示一个字符。
......


mp3文件复制:

import java.io.*;

public class CopyFile {
	public static void main(String args[]) throws Exception {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\java\\老男孩.mp3"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\java\\复制之后.mp3"));
		byte b[] = new byte[1024];
		int len;
		while ((len = bis.read(b)) != -1){
			bos.write(b, 0, len);
		}
		bos.flush();
		bos.close();
		bis.close();
	}	
}




文本文件复制:

import java.io.*;
public class TestInputStream {
	public static void main(String args[]) {
			testBufferedStream();
	}


	static void testBufferedStream() {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			bis = new BufferedInputStream(new FileInputStream("D:\\java\\Test.java"));
			bos = new BufferedOutputStream(new FileOutputStream("D:\\java\\Test.txt"));
		} catch (FileNotFoundException e) {
			System.out.println("系统找不到该文件");
			e.printStackTrace();
		}
		
		byte bts[] = new byte[1024];
		try {
			while ((bis.read(bts))!=-1)
			{
				bos.write(bts);
			}
			bos.flush();
			bis.close();
			bos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}




—————————— ASP.Net+Android+IOS开发.Net培训、期待与您交流!——————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值