黑马程序员---IO流

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

IO流

源和目的:
控制台 文件 内存 网络

一开始很不理解ByteArrayStream
后来才把他联系到源和目的里的内存
就很好理解了

毕老师总强调的
BufferedReader=new BufferedReader(new InputStreamReader(xxx));
BufferedWriter=new BufferedWriter(new OutputStreamReader(xxx));
印象很深刻了,对字符流的操作基本都是用上面这2个

然后写了一个小应用:拷贝文件夹
调试了很久
因为有个小地方一直没注意
记下来:
File对象的
getAbsolutePath
如果是文件 只获得前面路径 如"F:\\123\\1.txt"-->"F:\\123"
如果是目录 获得全称 如"F:\\123"-->"F:\\123"
getName
文件和目录都获得最后的名称


import java.io.*;


public class CopyFold {
	public static long getSize(File f){				//递归获得文件或文件夹大小
		if(f.exists()){
			if(f.isDirectory()){
				long size=0;
				String[] paths=f.list();
				for(String path:paths){
					size+=getSize(new File(f.getAbsolutePath()+"\\"+path));
				}
				return size;
			}else{
				return f.length();
			}
		}else{
			return 0;
		}
	}
	public static void Copy0(File src,File dir)throws Exception{
		if(src.exists()){
			if(!dir.exists()){
				dir.mkdirs();
			}
			if(src.isDirectory()){			//目录,创建后递归
				File fold=new File(dir.getAbsolutePath()+"\\"+src.getName());
				fold.mkdir();
				String[] srcFile=src.list();
				for(String srcPath:srcFile){
					srcPath=src.getAbsolutePath()+"\\"+srcPath;
					Copy0(new File(srcPath),fold);
				}
			}else{							//文件,拷贝
				File copyFile=new File(dir.getAbsolutePath()+"\\"+src.getName());
				if(copyFile.exists()){
					System.out.println(copyFile.getAbsolutePath()+"已经存在");
				}else{
					FileInputStream fis=new FileInputStream(src);
					FileOutputStream fos=new FileOutputStream(copyFile);
					byte[] buf=new byte[1024*8];
					int length=0;
					while((length=fis.read(buf))!=-1){
						fos.write(buf,0,length);
						finishedSize+=length;
					}
					fis.close();
					fos.close();
				}
			}
		}else{
			System.out.println("源文件或目录不存在");
			return;
		}
	}
	public static long finishedSize=0;
	public static long totalSize=0;
	public static void Copy(File src,File dir)throws Exception{
		finishedSize=0;
		totalSize=getSize(src);
		new Thread(new Runnable(){				//开一个新线程显示已完成百分比
			public void run() {
				while(finishedSize<totalSize){
					int i=(int)((double)finishedSize/(double)totalSize*100.0);
					System.out.println("复制中...."+i+"%");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println("复制完成");
			}
		}).start();
		Copy0(src,dir);
	}
	public static void main(String[] args)throws Exception{
		String srcPath=args[0];
		String dirPath=args[1];
		File src=new File(srcPath);
		File dir=new File(dirPath);
		Copy(src,dir);
	}
}


---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看: http://edu.youkuaiyun.com/heima
### 黑马程序员 IO 练习题及实例代码 #### 关于 I/O 的概念 I/O 用于表示输入和输出的数据序列,在 Java 中,所有的 I/O 都位于 `java.io` 包下。通过这些类可以实现程序与外部资源之间的数据传输[^1]。 #### 文件加密解密案例分析 考虑一个简单的文件加解密例子来展示如何利用字节完成特定功能: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileEncryptDecrypt { public static void main(String[] args) { String srcFile = "source.txt"; String destFile = "encrypted.txt"; FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(srcFile); fos = new FileOutputStream(destFile); byte[] buffer = new byte[20]; int len; while ((len = fis.read(buffer)) != -1) { for (int i = 0; i < len; i++) { buffer[i] = (byte) (buffer[i] ^ 5); // 使用异或运算进行简单加密/解密 } fos.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 此段代码展示了如何读取源文件并将其内容写入目标文件的同时执行简单的加密操作。这里采用的是 XOR 操作作为基础的加密手段;同样的逻辑也可以用来做解密工作[^3]。 #### 缓冲区的应用说明 当调用 `InputStream` 的 `read(byte[])` 方法时,该方法尝试一次性填充整个传递过来的缓冲数组。如果当前可用的数据量不足以填满整个缓冲,则返回实际已读取的数量,并等待后续更多数据到来继续读取直到结束标志 `-1` 出现为止[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值