关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、概述
1、定义
在变量数组中和对象中存放的数据是暂时的,程序结束后就会丢失。为了能够永久的保存数据,需要将其存储在磁盘中。
java中的I/O技术可以将数据保存到本地,以达到永久保存的要求。
2、流
流是一组有序的序列,根据操作的类型,可分为输入流和输出流。
3、IO.体系
字节流的两个顶层父类:
1,InputStream 2,OutputStream.
字符流的两个顶层父类:
1,Reader 2,Writer
这些体系的子类都以父类名作为后缀。
而且子类名的前缀就是该对象的功能。
如图:
二、字符流
1、字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。
在对这个文字进行操作。简单说:字节流+编码表
2、FileReader与FileWriter
a、FileWirter写入文本
<span style="font-size:14px;">FileWriter fw = new FileWriter("d:\\jinfulin.txt"); w.write("dfs"); fw.close();</span>
b、FileReader读取文本
<span style="font-size:14px;">FileReader fr = new FileReader("d:\\jinfulin.txt"); int num1 = fr.read();//读取第一个字符 int num2 = fr.read();//再次调用读取第二个字符(流特性嘛) System.out.println((char)num1);//打印,将数字转成字符 System.out.println((char)num2);</span>
c、字符缓冲区
<span style="font-size:14px;"> FileReader fr = new FileReader("demo.txt"); /* * 使用read(char[])读取文本文件数据。 * * 先创建字符数组。 */ char[] buf = new char[1024]; int len = 0; while((len=fr.read(buf))!=-1){//没有字符了读到数据位-1 System.out.println(new String(buf,0,len)); } <span style="white-space:pre"> </span>fr.close();</span>
d、如何将一些文字存储到硬盘一个文件中?
3、字符流缓冲区对象--BfferedReader与BufferedWriter
BfferedReader与BufferedWriter类就是把缓冲器封装成了对象,原理是一样的。
举例:文本从一个盘复制到另一个盘修改版
三、字节流
字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。
多说就是鄙视大家的智商了,举个例子来看看就好,
例:复制mp3
<span style="font-size:14px;"> private static void myStreamCopy() throws IOException { //定义输入输出流并加缓冲区 BufferedOutputStream buffo = new BufferedOutputStream(new FileOutputStream("f:\\copy.mp3")); BufferedInputStream buffi = new BufferedInputStream(new FileInputStream("f:\\风吹麦浪.mp3")); //开始复制 int ch = 0; while((ch = buffi.read()) != -1) { buffo.write(ch); } //关闭流 buffo.close(); buffi.close(); }</span>
四、转换流
1、 转换流的由来:
a、字符流与字节流之间的桥梁
b、方便了字符流与字节流之间的操作
2、转换流的应用:
字节流中的数据都是字符时,转成字符流操作更高效。
InputStreamReader :字节到字符的桥梁。解码。
OutputStreamWriter:字符到字节的桥梁。编码。
3、举例:将控制台上的文字存储到文件中
<span style="font-size:14px;"><span style="white-space:pre"> </span>/* * 将控制台输入的文字存储到文件中。 */ public static void main(String[] args) throws IOException { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F:\\jinfulin.txt"))); String line = null; while((line = bufr.readLine()) != null) { if("over".equals(line)) break; bufw.write(line); System.out.println(line); } bufr.close(); bufw.close(); } </span>
五、流操作的基本规律
因为流对象太多,开发时不知道用哪个对象合适。弄清规律有助于我们使用。
1,明确源和目的
源:InputStream Reader目的:OutputStream Writer
2,明确数据是否是纯文本数据。
源:是纯文本:Reader---------否:InputStream
目的:是纯文本 Writer
------否:OutputStream
3,明确具体的设备。
源设备:
硬盘:File键盘:System.in
内存:数组
网络:Socket流
目的设备:
硬盘:File控制台:System.out
内存:数组
网络:Socket流
4,是否需要其他额外功能。
1,是否需要高效(缓冲区);2,转换。
六、File类
1、定义:
文件和目录路径名的抽象表现形式
2、特点:
1)用来将文件或文件夹封装成对象
2)方便于对文件与文件夹的属性信息进行操作
3)File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变
4)File对象可以作为参数传递给流的构造函数
3、初始化:
<span style="font-size:14px;">//可以将一个已存在的,或者不存在的文件或者目录封装成file对象。 File f1 = new File("c:\\a.txt"); File f2 = new File("c:\\","a.txt"); File f = new File("c:\\"); File f3 = new File(f,"a.txt"); File f4 = new File("c:"+File.separator+"abc"+File.separator+"a.txt");</span>
4、 File对象的常见方法。
a、获取
<span style="font-size:14px;"><span style="white-space:pre"> </span>File file = new File("a.txt"); String name = file.getName();//获取文件名(a.txt) String absPath = file.getAbsolutePath();//绝对路径。 String path = file.getPath();//相对路径 long len = file.length();//文件长度(大小) long time = file.lastModified();//最后修改时间</span>
b、创建于删除
<span style="font-size:14px;">File dir = new File("f:\\a1\\22\\jin.txt"); boolean b = dir.mkdir();//创建文件 dir.mkdirs();//创建多级目录 System.out.println(dir.delete()); boolean b = file.createNewFile();//如果不存在就创建 </span>
c、判断
<span style="font-size:14px;"> boolean b = f.exists(); // 判断是否存在。 System.out.println(f.isFile());//是否是文件 System.out.println(f.isDirectory());//是否是一个目录</span>
d、重命名
<span style="font-size:14px;"><span style="white-space:pre"> </span>File f1 = new File("c:\\kkk.mp3"); File f2 = new File("d:\\ccc.mp3"); boolean b = f1.renameTo(f2); System.out.println("ccc="+b);</span>
5、 拓展应用
a、 获取当前目录下的文件以及文件夹的名称,包含隐藏文件。
<span style="font-size:14px;"> String[] names = file.list(); <span style="white-space:pre"> </span>if(names == null)//如果为空就返回,避免出现空指针异常 <span style="white-space:pre"> </span>return; System.out.println(names.length); for(String name : names){ System.out.println(name); }</span>
b、过滤所有以某某结尾的文件
c、深度历遍所有文件
d、删掉一个文件夹(从里往外删,递归)
<span style="font-size:14px;">public class DeleteAll { public static void main(String[] args) { File dir = new File("f:\\1234"); // dir.delete();//直接删是删不掉的 dirdelete(dir); } private static void dirdelete(File dir) { File[] files = dir.listFiles(); if (files == null) return; for (File file : files) { if(file.isDirectory()){//如果是目录就递归 dirdelete(file); } //不是目录就删掉 System.out.println(file.getAbsolutePath() + "----"+ file.delete()); } //最后再删掉根目录的文件夹(此时已经空了) System.out.println(dir.getAbsolutePath() + "----"+ dir.delete()); } }</span>
七、Properties类
1、概述
Properties类并不属于IO包中的类,而是属于map集合,在前面map集合章节也有提到,不过由于该集合中数据用到流,在这里说更合适。
2、特点:
1,该集合中的键和值都是字符串类型。
2,集合中的数据可以保存到流中,或者从流获取。 通常该集合用于操作以键值对形式存在的配置文件。
3、举例
定义功能,获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示。并不要在运行程序。
<span style="font-size:14px;">public static void getAppCount() throws IOException{ //将配置文件封装成File对象。 File confile = new File("count.properties"); if(!confile.exists()){//健壮性判断 confile.createNewFile(); } //集合中的数据来自于一个文件。 //注意;必须要保证该文件中的数据是键值对。 //需要使用到读取流。 FileInputStream fis = new FileInputStream(confile); Properties prop = new Properties(); prop.load(fis);//集合中加载一个文件输入流 //从集合中通过键获取次数。 String value = prop.getProperty("time"); //定义计数器。记录获取到的次数。 int count =0; if(value!=null){ count = Integer.parseInt(value); if(count>=5){ throw new RuntimeException("使用次数已到,请注册,给钱!"); } } count++; //将改变后的次数重新存储到集合中。 //将集合中数据存储到文件中,使用store方法。 prop.setProperty("time", count+""); FileOutputStream fos = new FileOutputStream(confile); prop.store(fos, "注释....."); fos.close(); fis.close(); }</span>
八、最后
由于I/O这部分知识比较多,也比较重要,所有我分成两篇博客来写,欢迎大家看下一篇博客。