黑马程序员──IO流(二)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------




File类


文件或者文件夹封装成对象。

方便对文件与文件夹的属性信息进行操作

File对象可以作为参数传递给流的构造函数


常用方法:

exists() 判断文件或者文件夹是否存在。

createNewFile() 创建文件,如果存在不会覆盖。

delete() 删除文件或者文件夹

deleteOnExit()退出时删除

getAbsolutePath()获取绝对路径

getName()获取文件名

isFile()判断是否是文件

isDirectory()判断是否是目录

listFiles()获取目录下所有文件对象。

mkdir()创建文件夹

renameTo(File dest)改名


递归:

列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。

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

递归要注意:
1,限定条件。
2,要注意递归的次数。尽量避免内存溢出。


递归练习:把目录下所有.java 文件拷贝至另一目录下,并改后缀名为 .txt 。

public class Test13true {

	public static void main(String[] args) throws IOException {
		
		File dir = new File("E:\\java2014\\day01");//原目录
		File newdir = new File("E:\\mytest");//新目录
		newdir.mkdir();//创建目录
		
		copyJava(dir,newdir);
		
	}
	
	public static void copyJava(File dir,File newdir) throws IOException
	{
		File[] files = dir.listFiles();//列出目录下所有文件对象。
		
		for(File file : files)//遍历数组
		{
			if(file.isDirectory())//判断是否是目录
				copyJava(file,newdir);//调用自己,递归。
			else
			{
				if(file.getName().endsWith(".java"))//判断后缀名
				{
					File f = new File(newdir,file.getName());
					File newf = new File(newdir,file.getName().replaceAll("\\.java",".txt"));//改后缀名。
					
					copy(file,f);//复制文件。
					
//					boolean b =f.renameTo(newf);//改名。
//					System.out.println(b);//判断是否改名成功。
					
				}
				
			}
			
		}
		
	}
	
	public static void copy(File yuan,File mudi) throws IOException
	{
		
		BufferedReader bffr = new BufferedReader(new FileReader(yuan));//关联原文件
		BufferedWriter bffw = new BufferedWriter(new FileWriter(mudi));//写入新文件
		String line = null;
		while((line=bffr.readLine())!=null)
		{
			bffw.write(line);
			bffw.newLine();
			bffw.flush();
		}
		
		bffr.close();
		bffw.close();
		
	}
	
	
	
	
	
	
}


其他流对象:


SequenceInputStream:合并流   需要枚举作为参数。

class SequenceDemo 
{
	public static void main(String[] args) throws IOException
	{

		Vector<FileInputStream> v = new Vector<FileInputStream>();

		
		v.add(new FileInputStream("c:\\1.txt"));
		v.add(new FileInputStream("c:\\2.txt"));
		v.add(new FileInputStream("c:\\3.txt"));

		Enumeration<FileInputStream> en = v.elements();//获取枚举

		SequenceInputStream sis = new SequenceInputStream(en);//枚举作为参数。

		FileOutputStream fos = new FileOutputStream("c:\\4.txt");

		byte[] buf = new byte[1024];

		int len =0;
		while((len=sis.read(buf))!=-1)
		{
			fos.write(buf,0,len);
		}

		fos.close();
		sis.close();





	}
}


ObjectInputStream与ObjectOutputStream

对象的序列化,持久化。

被操作的对象需要实现Serializable (标记接口);此接口没有定义内容。

类中可以定义UID标识。


RandomAccessFile

内部封装一个大型的字节数组。自身可以读和写(其实内部封装了相应的字节流)。

可以通过seek 设置指针的位置,达到多段读写的目的。

而且它在输出时不会覆盖文件

可以实现多线程多段读写。(分段下载电影就是这个原理。)


管道流:

PipedInputStream和PipedOutputStream

 输入输出可以直接进行连接,通过结合线程使用。


操作基本数据类型:

DataInputStream与DataOutputStream

writeInt( )  readInt( )这样的方法    专门用于操作基本数据类型。


操作字节数组:

ByteArrayInputStream与ByteArrayOutputStream 

以内存为源和目的。

没有涉及到系统资源,所以无需关闭。关闭了还可以使用。


打印流

PrintWriter与PrintStream

该流提供了打印方法,可以将各种数据类型的数据都原样打印。

字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream

字符打印流:
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。

打印流println( )可以实现 输出  换行  刷新的功能,非常实用。


class  PrintStreamDemo
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));//读取键盘录入

		PrintWriter out = new PrintWriter(new FileWriter("a.txt"),<span style="color:#ff0000;">true</span>);//可以设置自动刷新。println具有自动刷新功能。

		String line = null;

		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			out.println(line.toUpperCase());//输出  换行  刷新
			//out.flush();
		}

		out.close();//关闭资源
		bufr.close();//<span style="font-family: Arial, Helvetica, sans-serif;">关闭资源</span>

	}	
}


字符编码:

常见编码表:

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

ISO8859-1:拉丁码表。欧洲码表(tomcat服务器使用的就是此码表)

GBK:中国的中文编码表

Unicode:国际标准码,融合了多种文字。Java语言使用的就是unicode

UTF-8


编码:字符串变成字节数组。
解码:字节数组变成字符串。

String-->byte[];       str.getBytes(charsetName);
byte[ ] -->String:     new String(byte[ ],charsetName);


当我们用GBK编码后,解码却使用的是ISO8859-1。这时候我们可以将字符串再

ISO8859-1编一次码,还原成正确的字节数据,再使用GBK进行解码,这样就OK了。


示例:

public static void main(String[] args)throws Exception 
	{
		String s = "黑马";

		byte[] b1 = s.getBytes("gbk");//gbk编码
		System.out.println(Arrays.toString(b1));
		
		String s1 = new String(b1,"iso8859-1");//iso8859-1解码
		System.out.println("s1="+s1);

		
		byte[] b2 = s1.getBytes("iso8859-1");//再iso8859-1编码
		System.out.println(Arrays.toString(b2));

		String s2 = new String(b2,"gbk");//再gbk解码
		System.out.println("s2="+s2);


	}





以上内容为本人笔记,仅供参考。
















 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值