nio.2 nio 和传统io

java nio.2  主要提供了PathsFiles这两个队文件的访问类。

Files提供了操作文件的便捷方式:

1.   复制文件 copy

 

//传统io
try
(
	FileInputStream fis = new FileInputStream(new File("d:/1.jpg"));
	FileOutputStream fos = new FileOutputStream(new File("d:/2.jpg"));)
	{
		int length = 0;
		byte[] buffer = new byte[1024];		
		while(-1 != (length = fis.read(buffer, 0, buffer.length)))
		{
			fos.write(buffer, 0, length);
		}
	}
	catch (Exception e)
	{
		e.printStackTrace();
		}
//nio
try
(	
FileChannel in = new FileInputStream(new File("d:/1.jpg")).getChannel();
FileChannel out = new FileOutputStream(new File("d:/2.jpg")).getChannel();)
{
	ByteBuffer buffer = ByteBuffer.allocate(32);
	while(-1 != (in.read(buffer)))
	{
				buffer.flip();
				out.write(buffer);
				buffer.clear();
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
//java7 中的Files操作
Files.copy(Paths.get("d:/1.jpg"), new FileOutputStream(new File("d:/2.jpg")));


 

总结:

传统ionio最大的不同就是是按“水滴”取水,还是按“竹筒”取水,一个按字节,一个按块(buffer,而Files类提供的静态方法就是进行了一次封装而已。

 

2.   从文件中读:

文本文件获得List<String>readAllLine

二进制文件获得字节数组(注意不适合大文件) readAllByte

//传统io
	try
	(
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("d:/poem.txt")));)
{
	String temp = null;
	while(null != (temp = reader.readLine()))
	{
		System.out.println(temp);
	}
}
//nio
try
(
	FileChannel in = new FileInputStream(new File("d:/poem.txt")).getChannel();)
{
MappedByteBuffer buffer = in.map(FileChannel.MapMode.READ_ONLY, 0, new File("d:/poem.txt").length());
	Charset charset = Charset.forName("GBK");
	CharBuffer cb = charset.decode(buffer);
	System.out.println(cb);
		}
//java7 nio.2
List<String> list = Files.readAllLines(Paths.get("d:/poem.txt"), Charset.forName("GBK"));
for(String s: list)
{
	System.out.println(s);
	}


 

3.   写入文件

	//传统io
		try
		(
				BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/poem_bak.txt")));)
		{
			writer.write("闲居少邻并, 草径入荒园。\r\n");
			writer.write("鸟宿池边树, 僧敲月下门。");
		}
		
		//nio
		try
		(
				FileChannel out = new FileOutputStream("d:/poem_bak2.txt").getChannel();)
		{
			//发现channel读写只能针对bytebuffer,不知是不是???
			CharBuffer cb = CharBuffer.wrap("闲居少邻并, 草径入荒园。\r\n" + "鸟宿池边树, 僧敲月下门。");
			ByteBuffer bb = Charset.forName("GBK").encode(cb);
			out.write(bb);
		}
		
		//java7 nio.2
		List<String> list = new ArrayList<>();
		list.add("闲居少邻并, 草径入荒园。");
		list.add("鸟宿池边树, 僧敲月下门。");
		Path p = Paths.get("d:/poem_bak3.txt");
		if(!Files.exists(p))
		{
			Files.createFile(p);
		}
		//最后一个参数是打开模式,append为追加
		Files.write(p, list, Charset.forName("GBK"),StandardOpenOption.APPEND

4.   获得一些基本熟悉

Files.exists()

Files.isHidden()

Files.isWritable()

5.   遍历文件

Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor<Path>()
		{
			@Override
			public FileVisitResult visitFile(Path file,
					BasicFileAttributes attrs) throws IOException
			{
				// TODO Auto-generated method stub
				return super.visitFile(file, attrs);
			}
			
			//一共可以重写四个方法
		});
	


 

6.   监听文件

7.   获得属性 attribute

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值