黑马程序员_Java中的I/O流

--------- android培训java培训、期待与您交流! ----------

Java中的I/O


<1>Java中的流实际是数据(字节序列)流,使数据像流水一样通过用户规定的管道流淌汇聚。

<2>IO包中的File类负责操作文件的属性信息,流负责操作数据。

<3>Java中的流类型可以根据不同的角度进行分类。例如按数据流的方向分类,按处理数据的单位分类,按功能分类等等。

注意:Java中的IO包是按照装饰设计模式的思想来设计的。理解了这一点,可以更加容易掌握IO技术。

<4>按数据流的方向不同分为输入流和输出流。输入流就是把外部数据读到程序中来,输出流就是把程序中的数据写出去。

字节流的抽象基类:InputStream OutputStream (二进制数据)

字符流的抽象基类:Reader Writer           (字符数据)

<5>按处理数据的单位不同分为字节流和字符流。字节流就是以字节为最小的传输单位,字符流就是以字符为数据的最小传输单位。

<6>按功能的不同分为节点流和包装流。节点流是底层流,对应着数据的来源和目的地的对象,节点流也是最终调用操作系统资源的流,包装流是对底层流做包装的上层流,也叫装饰流。


<7>字节流中派生出的节点流子类和对应的目标类型:

          FileInputStream FileOutputStream:磁盘文件的输入,输出

          ByteArrayInputStream ByteArrayOutputStream:内存数组的输入,输出

          PipedInputStream PipedOutputStream:管道的输入,输出,用在多线程


<8>字符流中派生出的节点流子类和对应的目标类型:

         FileReader FileWriter:磁盘文件的输入,输出

         CharArrayReader CharArrayWriter:内存数组的输入,输出

         StringReader StringWriter:内存字符串的输入,输出

         PipedReader PipedWriter:管道输入,输出,用在多线程


<9>包装流也叫装饰流,可以将节点流封装在装饰流中使用,使其具有更加强大的数据读写功能和其他附加功能,相当于在节点流的外面又进行了包装。包括缓冲流,转换流,基本数据流,打印流,序列化流等等。


<10>当你想要玩字符编码时,应该使用可以加入编码表的流对象,转换流:

         InputStreamReader 字节到字符的桥梁

         OutputStreamWriter 字符到字节的桥梁

<11>RandomAccessFile类的对象支持对文件的随机读取和写入,这个类也支持直接输入,输出各种数据类型。(RandomAccessFile类实现了DataInputDataOutput接口,可以访问在DataInputStreamDataOutputString中所有的read() 和 write()方法)

RandomAccessFile类的行为类似存储在文件系统中的一个大型byte数组,存在着指向该隐含数组的光标或索引,称为文件指针。你可以通过seek()方法调整文件指针的位置来实现随机读写。通过getFilePointer()来获取文件指针的位置。


一个文本复制程序:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyText
{
	/**
	 * @param args
	 * @throws Exception
	 */
	// 将一个盘中的文本文件复制到另一个盘中
	public static void main(String[] args) throws Exception
	{
		copy_2();
	}
	
	public static void copy_2()
	{
		// 第二种使用先读到数组里,再一次性写出来的方式 , 效率高很多 ,建议使用 异常处理
		FileReader fr = null;
		FileWriter fw = null;
		try
		{
			fr = new FileReader("FileReaderDemo.java");
			fw = new FileWriter("FileReaderDemo_COPY2.java");
			char[] buffer = new char[1024];
			int length = 0;
			while ((length = fr.read(buffer)) != -1)
			{
				fw.write(buffer, 0, length);
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("读写失败");
		}
		finally
		{
			try
			{
				if (fr != null)
					fr.close();
			}
			catch (IOException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try
			{
				if (fw != null)
					fw.close();
			}
			catch (IOException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void copy_1() throws Exception
	{
		// 第一种采取度一个字符,写一个字符的方式,效率极低,不建议使用
		FileReader fr = new FileReader("FileReaderDemo.java");
		FileWriter fw = new FileWriter("FileReaderDemo_COPY.java");
		int ch = 0;
		while ((ch = fr.read()) != -1)
		{
			fw.write(ch);
		}
		fr.close();
		fw.close();
	}
}


--------- android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值