Java基础-18-常用API及IO流

Java基础-常用API介绍及IO流API

常用API简介及IO流API

1、其他对象(System)

java.lang.System

System 类包含一些有用的类字段和方法。它不能被实例化。 System:类中的方法和属性都是静态的。 out:System类中的字段,返回的类型是static PrintStream,是“标准”输出流,默认是控制台。 in:System类中的字段,返回的类型是static InputStream,是“标准”输入流,默认是键盘。

获取系统属性信息:

static Properties getProperties();//确定当前的系统属性。
  • 可不可以在jvm启动时,动态加载一些属性信息呢?

测试代码:

import java.util.*;
class SystemDemo
{
    public static void main(String [] args)
    {
        Properties prop = System.getProperties();
        //因为Properties是HashTable的子类,也就是Map集
        //合的一个子类对象,那么可以通过Map方法取出该集合中的元素
        //该集合中存储都是字符串,没有泛型定义。

        //如何在系统中自定义一些特有信息呢?
        System.setProperty("mykey","myvalue");

        //获取指定属性信息
        String value = (String)System.getProperty("os.name");
        System.out.println("value="+value);

        //读取之前在jvm启动时动态加载的属性信息。
        String v = System.getProperty("haha");
        System.out.println("v="+v);

        //获取所有系统属性信息
        for(Object obj : prop.keySet())
        {
            String value_me = (String )prop.get(obj);
            System.out.println(obj+"::"+value_me);
        }
    }

}

输出:

2、其他对象(Runtime)

java.lang.Runtime

Runtime类:该类中并没有提供构造函数,说明不可以new对象,那么会直接想到该类中的方法都是静态的,发现该类中还有被静态方法。说明该类肯定会提供了方法获取本类对象。而且该方法是静态的,并返回值类型是本类类型。获取本类对象方法是

static Runtime getRuntime();// 返回与当前 Java 应用程序相关的运行时对象。

由这个特点可以看出该类使用了单例设计模式来完成。

java.lang.Process

ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。

测试代码:

import java.util.*;
class RuntimeDemo
{
    public static void main(String [] args)throws Exception
    {
        Runtime r = Runtime.getRuntime();//获取Runtime对象。
        //Process p = r.exec("winmine.exe");//打开程序。

        //打开写字本,并让写字本打开一个SystemDemo.java文件
        Process z = r.exec("notepad.exe SystemDemo.java");

        Thread.sleep(4000);//主线程睡眠4秒
        z.destroy();//杀掉一个子线程。

    }
}

3、其他对象(Date)

java.util.Date

Date类:表示特定的瞬间,精确到毫秒。

Date();// 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。

java.text.SimpleDateFormat SimpleDateFormat类:SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

SimpleDateFormat(String pattern);//用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
String format(Date d);//调用format方法让模式格式化指定Date对象

测试代码:

import java.util.*;
import java.text.*;
class DateDemo
{
    public static void main(String [] args)throws Exception
    {
        Date d = new Date();

        System.out.println(d);
        //打印的时间看不懂,希望有些格式。
        //将模式封装到SimpleDateFormat对象中。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");

        //调用format方法让模式格式化指定Date对象
        String time = sdf.format(d);
        System.out.println("time:"+time);
    }
}

输出:

4、其他对象(Calendar)

java.util.Calendar Calendar 类:是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAYOFMONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

DEMO

import java.util.*;
import java.text.*;
class CalendarDemo
{
    public static void main(String[]args)
    {
        Calendar c = Calendar.getInstance();
        //打印对象里所有的信息
        System.out.println(c);

        String[] mons = {"一月","二月","三月","四月",
                        "五月","六月","七月","八月",
                        "九月","十月","十一月","十二月"};
        String [] weeks = {"","星期日","星期一","星期二",
                            "星期三","星期四","星期五","星期六"};
        int index = c.get(Calendar.MONTH);
        int index1 = c.get(Calendar.DAY_OF_WEEK);

        System.out.println(c.get(Calendar.YEAR)+"年");

        //System.out.println(c.get((Calendar.MONTH+1)+"月");
        System.out.println(mons[index]);

        System.out.println(c.get(Calendar.DAY_OF_MONTH)+"日");

        //System.out.println("星期"+c.get(Calendar.DAY_OF_WEEK));
        System.out.println(weeks[index1]);

        Calendar c1 = Calendar.getInstance();

        //设置系统时间
        c1.add(Calendar.YEAR,-1);

        System.out.println(c1.get(Calendar.YEAR)+"年");
    }
}

输出:

5、其他对象(Math)

java.lang.Math Math类:Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

Demo

import java.util.*;
import java.text.*;
class MathDemo
{
    public static void main(String[]args)
    {
        double d = Math.ceil(16.34);//ceil返回大于指定数据的最小整数。

        double d1 = Math.floor(12.34);//floor返回小于指定数据的最大整数。

        long l =Math.round(12.54);//四舍五入

        double d2 = Math.pow(2,3);//返回第一个参数的第二个参数次幂的值。

        System.out.println("Math.ceil(16.34):"+d+",Math.floor(12.34):"
        +d1+",Math.round(12.54):"+l+",Math.pow(2,3):"+d2);
    }
}

输出:

如何生成随机数?

在Math类里有random()方法可以生成随机数,除了该方法,Java还有另外一种生成随机数的方式,就是Random类 java.util.Random Random类:此类的实例用于生成伪随机数流。 测试代码:

import java.util.*;
import java.text.*;
class RandomDemo
{
    public static void main(String[]args)
    {
        Random r = new Random();

        //随机1到10的方法1
        for(int x=0;x<10;x++)
        {
            int d = (int )(Math.random()*10+1);
            System.out.print(d+"  ");
        }
        System.out.println();
        for(int x=0;x<10;x++)
        {
            int d = r.nextInt(10)+1;//方法2
            System.out.print(d+"  ");
        }
    }
}

输出:

6、IO流(概述)

IO(Input Output)流

* IO流用来处理设备之间的数据传输
* Java对数据的操作是通过流的方式
* Java用于操作流的对象都在IO包中
* 流按操作数据分为两种:字节流和字符流
* 流按流向分为:输入流和输出流

流常用基类:

*字节流的抽象基类:InputStream、OutputStream
*字符流的抽象基类:Reader、Writer

注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。 如: InputStream的子类FileInputStream Reader的子类FileReader

7、IO流(FileWriter)

IO包

字符流和字节流:

*字节流分为两类:InputStream、OutputStream
*字符流分为两类:Reader、Writer

先学习一下字符流的特点: 既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件。

那么就先以操作文件为主来演示。 需求:在硬盘上,创建一个文件并写入一些文字数据。 我们找到了一个专门用来操作文件的Writer子类对象:FileWriter。后缀名是父类名,前缀名是该流对象的功能。 测试代码:

import java.io.*;

class FileWriterDemo 
{
    public static void main(String[]args)throws IOException
    {
        //创建一个FileWriter对象,该对象一被初始化就必须明确被操作的文件
        //而且该文件会被创建到指定目录下,如果该目录已有同名文件,将被覆盖。
        FileWriter fw = new FileWriter("D:\\JAVADEMO\\day15\\FileWriterNewFile.txt");

        //调用write方法,将字符串写入到流中。
        fw.write("我的文件输出流的例子");

        //刷新流对象中的缓冲中的数据。
        //将数据刷到目的地中
        fw.flush();

        //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据
        //将数据刷到目的地中。
        //和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭

        fw.close();
        //fw.write("haha");
    }
}

输出:

8、IO流(IO异常处理方式)

IO异常的处理方式模板

import java.io.*;

class FileWriterDemo2
{
    public static void main(String[]args)
    {
        FileWriter fw = null;
        try
        {
            fw = new FileWriter("D:\\JAVADEMO\\day15\\FileWriterNewFile_1.txt");
            fw.write("abc");
        }
        catch (IOException e)
        {
            System.out.println("catch:"+e.toString());
        }
        finally
        {
            try
            {   
                if(fw!=null)
                {
                    fw.close();
                }   
            }
            catch (IOException e)
            {
                System.out.println(e.toString());
            }
        }
    }
}

9、IO流(文本文件读取方式一)

import java.io.*;

class FileReaderDemo
{
    public static void main(String [] args)throws IOException
    {
        //创建一个文件读取流对象,和指定名称的文件相关联,
        //要保证该文件时已经存在的,如果不存在,会发生异常FileNotFoundException

        FileReader fr = new FileReader ("D:\\JAVADEMO\\day15\\FileWriterNewFile.txt");

        //调用读取流对象的read方法
        //read();//一次读一个字符,而且会自动往下读。

        int ch = 0;
        while ((ch = fr.read())!=-1)
        {
            System.out.print((char)ch);
        }
    }
}

输出:

10、IO流(文本文件读取方式二)

第二种方式通过字符数组进行读取

测试代码:

import java.io.*;

class FileReaderDemo1
{
    public static void main(String [] args)throws IOException
    {
        FileReader fr = new FileReader ("D:\\JAVADEMO\\day15\\FileWriterNewFile.txt");

        //定义一个字符数组,用于存储读到字符
        //该read(char[])返回的是读到字符个数
        char [] buf = new char[1024];

        int num = 0;

        while ((num=fr.read(buf))!=-1)
        {
            System.out.println(new String(buf,0,num));
            System.out.println('a');
        }
        fr.close();
    }
}

输出:

11、IO流(拷贝文本文件)

将C盘一个文本文件复制到D盘 复制原理: 其实就是将C盘下的文件数据存储到D盘的一个文件中。 步骤:

(1)、在D盘创建一个文件,用于存储C盘文件中的数据。
(2)、定义读取流和C盘文件关联
(3)、通过不断的读写完成数据存储
(4)、关闭资源。

Demo

import java.io.*;

class CopyTest
{
    public static void main(String [] args)throws IOException
    {
        copy_1();
        copy_2();//效率高
    }
    public static void copy_2()
    {
        FileWriter fw = null;
        FileReader fr = null;
        try
        {
            fw = new FileWriter("D:\\JAVADEMO\\day15\\myDoc_copy.txt");
            fr = new FileReader("C:\\myDoc.txt");
            char [] buf = new char[1024];
            int len = 0;
            while ((len=fr.read(buf))!=-1)
            {
                fw.write(buf,0,len);
                System.out.println('a');//证明一次上面语句是只执行一次的标记
            }
        }
        catch (IOException e)
        {
            throw new RuntimeException("读写失败");
        }
        finally
        {
            try
            {
                fr.close();
            }
            catch (IOException e)
            {
            }
            try
            {
                fw.close();
            }
            catch (IOException e)
            {
            }
        }
    }

    //从C盘读一个字符,就往D盘写一个字符
    public static void copy_1()
    {
        FileWriter fw = null;
        FileReader fr = null;
        try
        {
            fw = new FileWriter("D:\\JAVADEMO\\day15\\myDoc_copy1.txt");
            fr = new FileReader("C:\\myDoc.txt");

            int len = 0;
            while ((len=fr.read())!=-1)
            {
                fw.write(len);
                System.out.print('b');//证明一次上面语句是只执行n次的标记
            }
        }
        catch (IOException e)
        {
            throw new RuntimeException("读写失败");
        }
        finally
        {
            try
            {
                fr.close();
            }
            catch (IOException e)
            {
            }
            try
            {
                fw.close();
            }
            catch (IOException e)
            {
            }
        }
    }   
}

输出:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。 该size,isEmpty,get,set,iterator和listIterator操作在固定时间内运行。 add操作以摊余常数运行 ,即添加n个元素需要O(n)个时间。 所有其他操作都以线性时间运行(粗略地说)。 与LinkedList实施相比,常数因子较低。 每个ArrayList实例都有一个容量 。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增长。 没有规定增长政策的细节,除了添加元素具有不变的摊销时间成本。 应用程序可以添加大量使用ensureCapacity操作元件的前增大ArrayList实例的容量。 这可能会减少增量重新分配的数量。 请注意,此实现不同步。 如果多个线程同时访问884457282749实例,并且至少有一个线程在结构上修改列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作,或明确调整后台数组的大小;仅设置元素的值不是结构修改。)这通常是通过在一些自然地封装了列表。 如果没有这样的对象存在,列表应该使用Collections.synchronizedList方法“包装”。 这最好在创建时完成,以防止意外的不同步访问列表: List list = Collections.synchronizedList(new ArrayList(...)); The iterators returned by this class's个 iterator和listIterator方法是快速失败的 :如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身remove种或add方法,迭代器都将抛出一个ConcurrentModificationException 。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。 请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器尽力投入ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值