Java面向对象  IO  (三)



知识概要:

                   (1)IO 流的操作规律

                   (2)异常日志信息IO处理

                   (3)系统信息IO处理

                   (4)File类描述

                   (5)Properties与流的结合



IO流的操作规律

1,   需求:将键盘录入的东东打印在控制台上

源:键盘录入。

目的:控制台。

2,需求:想把键盘录入的数据存储到一个文件中。

源:键盘。

      目的:文件。

3,需求:想要将一个文件的数据打印在控制台上。

源:文件。

      目的:控制台。

流操作的基本规律:

通过三个明确来完成。

1,明确源和目的。

      源:输入流。InputStream  Reader

      目的:输出流。OutputStream  Writer。

2,操作的数据是否是纯文本。

     是:字符流。

     不是:字节流。

3,当体系明确后,在明确要使用哪个具体的对象。

     通过设备来进行区分:

     源设备:内存,硬盘。键盘

     目的设备:内存,硬盘,控制台。

1,将一个文本文件中数据存储到另一个文件中。复制文件。

 源:因为是源,所以使用读取流。InputStream Reader

是不是操作文本文件。是!这时就可以选择Reader  。这样体系就明确了。

接下来明确要使用该体系中的哪个对象。

明确设备:硬盘。上一个文件。

 Reader体系中可以操作文件的对象是 FileReader 。是否需要提高效率:是!加入Reader体系中缓冲区

BufferedReader.

FileReader fr = new FileReader("a.txt");

 BufferedReader bufr = new BufferedReader(fr);

目的:OutputStream Writer

 是否是纯文本。

 是!Writer。

 设备:硬盘,一个文件。

 Writer体系中可以操作文件的对象FileWriter。

 是否需要提高效率:是!。加入Writer体系中缓冲区 BufferedWriter

 

 FileWriter fw = new FileWriter("b.txt");

 BufferedWriter bufw = new BufferedWriter(fw);

练习:将一个图片文件中数据存储到另一个文件中。复制文件。要按照以上格式自己完成三个明确。

2,需求:将键盘录入的数据保存到一个文件中。

 这个需求中有源和目的都存在。那么分别分析

源:InputStream Reader

 是不是纯文本?是!Reader

 

 设备:键盘。对应的对象是System.in.

 不是选择Reader吗?System.in对应的不是字节流吗?

 为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。

 所以既然明确了Reader,那么就将System.in转换成Reader。

 用了Reader体系中转换流,InputStreamReader

InputStreamReader isr = new InputStreamReader(System.in);

需要提高效率吗?

需要!BufferedReader

 BufferedReader bufr = new BufferedReader(isr);

目的:OutputStream  Writer

 是否是存文本?是!Writer。

 设备:硬盘。一个文件。使用 FileWriter。

 FileWriter fw = new FileWriter("c.txt");

 需要提高效率吗?需要。

 BufferedWriter bufw = new BufferedWriter(fw);

 字符编码输出

目的:OutputStream  Writer

 是否是存文本?是!Writer。

 设备:硬盘。一个文件。使用 FileWriter。

 但是FileWriter是使用的默认编码表。GBK.

 

 但是存储时,需要加入指定编码表utf-8。而指定的编码表只有转换流可以指定。

 所以要使用的对象是OutputStreamWriter。

 而该转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流。FileOutputStream

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");//转换流

需要高效吗?需要。

 BufferedWriter bufw = new BufferedWriter(osw);

所以,记住。转换流什么使用。字符和字节之间的桥梁,通常,涉及到字符编码转换时,

 需要用到转换流。

class  TransStreamDemo2
{
public static void main(String[] args) throws IOException
{
System.setIn(new FileInputStream("PersonDemo.java")); System.setOut(new PrintStream("zzz.txt")); //键盘的最常见写法。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out)); String line = null; while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
} bufr.close(); }
}

异常日志信息IO处理

import java.io.*;
import java.util.*;
import java.text.*;
class ExceptionInfo
{
public static void main(String[] args)throws IOException
{
try
{
int[] arr = new int[2];
System.out.println(arr[3]);
}
catch (Exception e)
{ try
{
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(d); PrintStream ps = new PrintStream("exeception.log");
ps.println(s);
System.setOut(ps); }
catch (IOException ex)
{
throw new RuntimeException("日志文件创建失败");
}
e.printStackTrace(System.out);
}
}
}



系统信息处理

import java.util.*;
import java.io.*;
class SystemInfo
{
public static void main(String[] args) throws IOException
{
Properties prop = System.getProperties(); //System.out.println(prop);
prop.list(new PrintStream("sysinfo.txt"));
}
}

File类描述

用来将文件或者文件夹封装成对象   方便对文件与文件夹的属性信息进行操作 。

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

 

了解File类中的常用方法。

File类常见方法:

      1,创建。

boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。

      和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

boolean mkdir():创建文件夹。

boolean mkdirs():创建多级文件夹。

2,删除。

boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。

     void deleteOnExit();在程序退出时删除指定文件。

3,判断。

boolean exists() :文件是否存在.

     isFile():

     isDirectory();

     isHidden();

     isAbsolute();

4,获取信息。

    getName():

    getPath():

getAbsolutePath()

getParent(): 

    long lastModified()

    long length()

class FileDemo
{
public static void main(String[] args) throws IOException
{
method_5();
} public static void method_5()
{
File f1 = new File("c:\\Test.java");
File f2 = new File("d:\\hahah.java"); sop("rename:"+f2.renameTo(f1)); } public static void method_4()
{
File f = new File("file.txt"); sop("path:"+f.getPath());
sop("abspath:"+f.getAbsolutePath());
sop("parent:"+f.getParent());
//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
//如果相对路径中有上一层目录那么该目录就是返回结果。 } public static void method_3()throws IOException
{
File f = new File("d:\\java1223\\day20\\file2.txt"); //f.createNewFile(); //f.mkdir(); //记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
//通过exists判断。
sop("dir:"+f.isDirectory());
sop("file:"+f.isFile()); sop(f.isAbsolute());
} public static void method_2()
{
File f = new File("file.txt"); //sop("exists:"+f.exists()); //sop("execute:"+f.canExecute()); //创建文件夹
File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa"); sop("mkdir:"+dir.mkdirs());
} public static void method_1()throws IOException
{
File f = new File("file.txt");
//sop("create:"+f.createNewFile());
//sop("delete:"+f.delete()); } //创建File对象
public static void consMethod()
{
//将a.txt封装成file对象。可以将已有的和为出现的文件或者文件夹封装成对象。
File f1 = new File("a.txt"); File f2 = new File("c:\\abc","b.txt"); File d = new File("c:\\abc");
File f3 = new File(d,"c.txt"); sop("f1:"+f1);
sop("f2:"+f2);
sop("f3:"+f3); File f4 = new File("c:"+File.separator+"abc"+File.separator+"zzz"+File.separator+"a.txt"); } public static void sop(Object obj)
{
System.out.println(obj);
}
}

递归

 函数自己调用自己。

  注意:递归时一定要明确结束条件。

  应用场景:

      • 当某一功能要重复使用时。

  练习:

      • 列出一个文件夹下所有的子文件夹以及子文件

import java.io.*;

class  FileDemo2
{
public static void main(String[] args)
{
File dir = new File("c:\\");
File[] files = dir.listFiles(); for(File f : files)
{
System.out.println(f.getName()+"::"+f.length());
} } public static void listDemo_2()
{
File dir = new File("d:\\java1223\\day18"); String[] arr = dir.list(new FilenameFilter()
{
public boolean accept(File dir,String name)
{ //System.out.println("dir:"+dir+"....name::"+name); return name.endsWith(".bmp"); }
}); System.out.println("len:"+arr.length); for(String name : arr)
{
System.out.println(name);
}
} public static void listDemo()
{
File f = new File("c:\\abc.txt"); String[] names = f.list();//调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
for(String name : names)
{
System.out.println(name);
}
}
public static void listRootsDemo()
{
File[] files = File.listRoots(); for(File f : files)
{
System.out.println(f);
}
}
}
import java.io.*;

class FileDemo3
{
public static void main(String[] args)
{
File dir = new File("d:\\testdir"); System.out.println(dir.delete());
}
public static String getLevel(int level)
{
StringBuilder sb = new StringBuilder();
sb.append("|--");
for(int x=0; x<level; x++)
{
//sb.append("|--");
sb.insert(0,"| "); }
return sb.toString();
}
public static void showDir(File dir,int level)
{ System.out.println(getLevel(level)+dir.getName()); level++;
File[] files = dir.listFiles();
for(int x=0; x<files.length; x++)
{
if(files[x].isDirectory())
showDir(files[x],level);
else
System.out.println(getLevel(level)+files[x]);
}
} }

思考:

      • 1,删除一个目录的过程是如何进行的?

删除原理:
在window中,删除目录从里面往外删除的。 既然是从里往外删除。就需要用到递归。 */
import java.io.*;
class RemoveDir
{
public static void main(String[] args)
{ File dir = new File("d:\\testdir");
removeDir(dir);
} public static void removeDir(File dir)
{
File[] files = dir.listFiles(); for(int x=0; x<files.length; x++)
{
if(files[x].isDirectory())
removeDir(files[x]);
else
System.out.println(files[x].toString()+":-file-:"+files[x].delete());
} System.out.println(dir+"::dir::"+dir.delete());
} }

Properties与流的结合

     Properties是hashtable的子类。

     也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。

是集合中和IO技术相结合的集合容器。

该对象的特点:可以用于键值对形式的配置文件。

那么在加载数据时,需要数据有固定格式:键=值。

练习:限制程序运行次数。当运行次数到达5次时,给出,请您注册的提示。并不再让该程序执行。

用于记录应用程序运行次数。如果使用次数已到,那么给出注册提示。很容易想到的是:计数器。

          可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。

          可是随着该应用程序的退出,该计数器也在内存中消失了。

下一次在启动该程序,又重新开始从0计数。这样不是我们想要的。程序即使结束,该计数器的值也存在。

         下次程序启动在会先加载该计数器的值并加1后在重新存储起来。

所以要建立一个配置文件。用于记录该软件的使用次数。

该配置文件使用键值对的形式。

         这样便于阅读数据,并操作数据。

键值对数据是map集合。

         数据是以文件形式存储,使用io技术。

         那么map+io -->properties.

配置文件可以实现应用程序数据的共享。

import java.io.*;
import java.util.*;
class RunCount
{
public static void main(String[] args) throws IOException
{
Properties prop = new Properties(); File file = new File("count.ini");
if(!file.exists())
file.createNewFile(); FileInputStream fis = new FileInputStream(file); prop.load(fis); int count = 0;
String value = prop.getProperty("time"); if(value!=null)
{
count = Integer.parseInt(value);
if(count>=5)
{
System.out.println("您好,使用次数已到,拿钱!");
return ;
} } count++; prop.setProperty("time",count+""); FileOutputStream fos = new FileOutputStream(file); prop.store(fos,""); fos.close();
fis.close(); }
}



Java面向对象 IO (三)的更多相关文章

  1. Java面向对象 IO (四)

     Java面向对象  IO  (四) 知识概要:                 (1)打印流 (2)序列流 SequenceInputStream (3)ObjectInputStream与Ob ...

  2. Java面向对象 IO (二)

     Java面向对象  IO   (二) 知识概要:               (1)字节流概述 (2)字节流复制图片 (3)IO流(读取键盘录入) (4)读取转换流,写入转换流 字节流概述   ...

  3. Java面向对象 IO (一)

     Java面向对象  IO  (一) 知识概要:                (1)IO概述 (2)IO流的常用基类 (3)IO程序的书写 (4)字符流  写入  读取  文本文件的两种读取方式 ...

  4. java面向对象(三)

    java面向对象(三) 1.四种权限修饰符 public > protected > (default) > private 注意:(default)并不是关键字default,而是 ...

  5. Java面向对象的三个特征

    首先,Java面向对象的三大特征: 三大特征: ▪ 封装 ▪ 继承 ▪ 多态 首先面向对象的第一个特性 封装 : 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操 ...

  6. java面向对象(三)之抽象类,接口,向上转型

    java类 java类分为普通类和抽象类,接口,上一节我大概讲了java类的一般格式,今天将抽象类和接口.同时讲一下它们是怎样存储的. 最重要的是理解为什么要有抽象和接口,这样学下来你猜不会迷茫,才能 ...

  7. Java之IO(三)ByteArrayInputStream和ByteArrayOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6972297.html 1.前言 这组输入输出流比较特殊,一般的流指定都是磁盘IO和网络IO,从文件中读取数据或者 ...

  8. Java基础---IO(三)--IO包中的其他类

    第一讲     对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...

  9. Java 面向对象(三)

    封装 什么是封装 面向对象三大特征之一 1. 把对象的状态和行为看成一个统一的整体,将字段和方法放到一个类中. 2. 信息隐藏:把不需要让外界知道的信息隐藏起来.尽可能隐藏对象功能实现细节,向外界暴露 ...

随机推荐

  1. Project 6:上楼梯问题

    问题简述:梯有N阶,上楼可以一步上一阶,也可以一步上二阶.编写一个程序,计算共有多少中不同的走法. 样例输入: 5 样例输出: 8 #include <stdio.h> int count ...

  2. 四,ESP8266 TCP服务器

    我要赶时间赶紧写完所有的内容....朋友的东西答应的还没做完呢!!!!!!!没想到又来了新的事情,,....... 配置模块作为TCP服务器然后呢咱们连接服务器发指令控制继电器吸合和断开 控制的指令呢 ...

  3. 我们为什么需要SDN?---致新人

    引言:SDN为什么会出现?是什么原因使得学术界提出SDN?我们为什么需要SDN?如果你刚接触SDN方案时,你一定有这样的疑问.而问题的答案是:我们需要拥有更多可编程能力的网络,来支持快速增长的网络业务 ...

  4. 201521123100《Java程序设计》第八周学习总结

    ---恢复内容开始--- 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 ...

  5. 201521123059 《Java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  6. 201521123071 《JAVA程序设计》第十三周学习总结

    第13周作业-多线程 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 1.常用端口号:Web服务:80 FTP服务:21 Telnet服务:23 2.网络 ...

  7. 201521123085 《Java程序设计》第11周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有 ...

  8. Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解

    快速了解Log4J Log4J的三个组件: Logger:日志记录器,负责收集处理日志记录     (如何处理日志) Appender:日志输出目的地,负责日志的输出  (输出到什么 地方) Layo ...

  9. [07] ServletContext上下文对象

    1.上下文的概念 我们在说到Servlet的继承关系时,提到自定义Servlet实际上间接实现了Servlet和ServletConfig两个接口,其中ServletConfig接口中定义了一个方法叫 ...

  10. DOM【介绍、HTML中的DOM、XML中的DOM】

    什么是DOM? DOM(Document Object Model)文档对象模型,是语言和平台的中立接口. 允许程序和脚本动态地访问和更新文档的内容. 为什么要使用DOM? Dom技术使得用户页面可以 ...