关于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
三、字节流
<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、 转换流的由来:
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对象的常见方法。
<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、 拓展应用
<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>
<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这部分知识比较多,也比较重要,所有我分成两篇博客来写,欢迎大家看下一篇博客。