黑马程序员_otherAPI和IO(一)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

System:类中的方法和属性都是静态的。常见方法: long currentTimeMillis();获取当前时间的毫秒值。 

其中System.getProperties()的方法,获取系统的属性信息,并存储到了Properties集合中,而properties集合中存储都是String类型的键和值。,最好使用它自己的存储和            取出的方法来完成元素的操作;System.setProperty("myclasspath", "c:\myclass"),是给系统设置一些属性信息,这些信息是全局,其他程序都可以使用。 


Runtime类:  Runtime r = Runtime.getRuntime();没有构造方法摘要,说明该类不可以创建对象。又发现还有非静态的方法,说明该类应该提供静态的返回该类对象的方法,而且 只有一个,说明Runtime类使用了单例设 计模式。它的方法主要是exec(),比方说Process p = r.exec("notepad.exe"),在任务管理器进程中就有了,消除进程为p.destory();

Math类:提供了操作数学运算的方法。都是静态的。 常用的方法:ceil(double a):返回大于参数的最小整数。 floor(double a):返回小于参数的最大整数。 round(double a):返回 四舍五入数。pow(double a, double b):a的b次方。random():返回大于等于0小于1的伪随机数。


Date类的演示:
public class DateDemo {
public static void main(String[] args) throws ParseException {
methodDemo_3();
}

/**
* 将日期格式的字符串-->日期对象。
* 使用的是DateFormat类中的parse()方法。 

 */

public  static void methodDemo_3() throws ParseException {

String str_date = "2012年4月19日";
str_date = "2011---8---17";

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);

dateFormat = new SimpleDateFormat("yyyy---MM---dd");

Date date = dateFormat.parse(str_date);

System.out.println(date);

}

/**
* 对日期对象进行格式化。
* 将日期对象-->日期格式的字符串。
* 使用的是DateFormat类中的format方法。
*/
public static void methodDemo_2() {

Date date = new Date();

//获取日期格式对象。具体着默认的风格。 FULL LONG等可以指定风格。
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);

//如果风格是自定义的如何解决呢?
dateFormat = new SimpleDateFormat("yyyy--MM--dd");

String str_date = dateFormat.format(date);

System.out.println(str_date);
}

/**
* 日期对象和毫秒值之间的转换。

* 毫秒值-->日期对象 : 
* 1,通过Date对象的构造方法  new Date(timeMillis);
*  2,还可以通过setTime设置。 
*  因为可以通过Date对象的方法对该日期中的各个字段(年月日等)进行操作。
* 日期对象-->毫秒值:
* 2,getTime方法。
* 因为可以通过具体的数值进行运算。 
*/
public static void methodDemo_1() {
long time = System.currentTimeMillis();//
// System.out.println(time);//1335671230671

Date date = new Date();//将当前日期和时间封装成Date对象。
System.out.println(date);//Sun Apr 29 11:48:02 CST 2012

Date date2 = new Date(1335664696656l);//将指定毫秒值封装成Date对象。
System.out.println(date2);
}
}

Calendar类的演示:

public class CalendarDemo {
public static void main(String[] args) {

Calendar c = Calendar.getInstance(); //得到Calendar的实例,使用默认时区和语言环境获得一个日历

int year = 2012;
showDays(year);
}

public static void showDays(int year) {

Calendar c = Calendar.getInstance();
c.set(year, 2, 1);   //设置日历字段的值

c.add(Calendar.DAY_OF_MONTH, -1);//根据日历的规则,为给定的日历字段添加或减去指定的时间量

showDate(c);
}

public static void showDate(Calendar c) {
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int day = c.get(Calendar.DAY_OF_MONTH);
int week = c.get(Calendar.DAY_OF_WEEK);

System.out.println(year+"年"+month+"月"+day+"日"+getWeek(week));
}

public static String getWeek(int i) {

String[] weeks = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

return weeks[i];
}
}

————————————————————————————————————————


输入流和输出流相对于内存设备而言,将外设中的数据读取到内存中:输入;将内存的数写入到外设中:输出。
字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。简单说:字节流+编码表 
字节流的两个顶层父类:1,InputStream  2,OutputStream;字符流的两个顶层父类:1,Reader 2,Writer
这些体系的子类都以父类名作为后缀,而且子类名的前缀就是该对象的功能。

BufferedReader ,BufferedWriter:内部将数组进行封装。变成对象后,方便于对缓冲区的操作。提高效率。并提供了对文本便捷操作的方法。readLine,newLine,自定义的字符串缓冲区我还没能真正掌握,需要再去练习。对于Readline实现原理其实就是使用了读取缓冲区的Read方法,将读取到的字符进行缓冲并判断换行标记,将标记的前的缓冲数据变成字符串返回。

装饰设计模式,对一组对象的功能进行增强时,就可以使用该模式进行问题的解决。这里就相对于继承而言也能实现装饰设计模式的功能,但是如果后人想要增加功能,继承会很多导致了继承体系臃肿不灵活,这里就想到可不可以将缓冲进行单独的封装,哪个对象需要缓冲就将哪个对象和缓冲关联。比如下面这样的形式:

class BufferWriter extends Writer{
BufferWriter(Writer w)
{
}
}

————————————————————————————————————————

下面是一段读写的综合代码,这里需要注意下的是异常我们要去处理,这里为了省事没处理。还要注意在书写时流的关闭。

public class CopyMp3Test {

public static void main(String[] args) throws IOException {
copy_4();
}
// 千万不要用,效率没有!
public static void copy_4() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\4.mp3");


int ch = 0;

while((ch =fis.read())!=-1){ //一个字符一个字符的读和写
fos.write(ch);
}

fos.close();
fis.close();
}

//不建议。 
public static void copy_3() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\3.mp3");

byte[] buf = new byte[fis.available()]; 
fis.read(buf);
fos.write(buf);
fos.close();
fis.close();
}

public static void copy_2() throws IOException {

FileInputStream fis = new FileInputStream("c:\\0.mp3");
BufferedInputStream bufis = new BufferedInputStream(fis);

FileOutputStream fos = new FileOutputStream("c:\\2.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(fos);

int ch = 0;

while((ch=bufis.read())!=-1){  //利用缓冲区读写
bufos.write(ch);
}

bufos.close();
bufis.close();
}

public static void copy_1() throws IOException {

FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");

byte[] buf = new byte[1024];

int len = 0;

while((len=fis.read(buf))!=-1){ //利用读入数组的读写
fos.write(buf,0,len);
}

fos.close();
fis.close();
}
}

————————————————————————————————————————

转换流:
InputStreamReader :字节到字符的桥梁。解码。
OutputStreamWriter:字符到字节的桥梁。编码。

流的操作规律:
之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适。

想要知道开发时用到哪些对象。只要通过四个明确即可。
1,明确源和目的(汇)
源:InputStream  Reader
目的:OutputStream  Writer
2,明确数据是否是纯文本数据。
源:是纯文本:Reader
否:InputStream
目的:是纯文本 Writer
否:OutputStream
到这里,就可以明确需求中具体要使用哪个体系。
3,明确具体的设备。
源设备:
硬盘:File
键盘:System.in
内存:数组
网络:Socket流
目的设备:
硬盘:File
控制台:System.out
内存:数组
网络:Socket流
4,是否需要其他额外功能。
1,是否需要高效(缓冲区);
是,就加上buffer.
2,转换。

public class TransStreamDemo2 {
public static void main(String[] args) throws IOException {
/*
* 1,需求:将键盘录入的数据写入到一个文件中。 

* 2,需求:将一个文本文件内容显示在控制台上。

* 3,需求:将一个文件文件中的内容复制到的另一个文件中。
*/

1. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));
2 . BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

3. BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));


String line = null;

while((line=bufr.readLine())!=null){
if("over".equals(line))
break;

bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}


}
}

有2种情况下使用转换流:
1,源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁。
提高对文本操作的便捷。
2,一旦操作文本涉及到具体的指定编码表时,必须使用转换流 。


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值