JAVA开发之---IO初识

学习IO的准备工作。
清楚抽象类;
IO的核心组成就是五个类(File、OutputStream、InputStream、Reader、Writer)+一个接口(Serializable)
文件的读写在java中相对其它语言稍微麻烦一些,但是在上边的五个类加一个接口中我们还是能比较容易的实现。
一、File文件操作类

了解几个构造方法
1public File(String pathname)
2、public File(String parent,String child) 设置父路径和子路径
3、public boolean createNewFile() throws IOException
//创建一个文件
4、public boolean exits()   //判断文件是否存在
5、public boolean delete()   //删除文件
6、public String getParent()     //取得父路径
7、public File getParentFile()   //取得父路径的File对象
8、public boolean mkdirs()       //创建目录
9、public boolean isFile()       //判断是否为文件
10、public boolean isDirectory()     //判断是否为目录
11、public long length()         //文件大小
12、public long lastModified()   //最后一次修改日期
这些书与构造方法,已经封装好的,在使用的时候直接调用即可。
public class TestCreat {
    public static void main(String[] args) throws IOException {
        File file = new File("\\D:\\eclipse");
        }
    /**
     * 
     * @param file
     * 判定给定的是否为目录
     * 列出子目录
     * 循环
     */
    private static void listAllFiles(File file) {

        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File file2 : files) {
                    listAllFiles(file2);
                }
            }
        } else {
            System.out.println(file);
        }
    }
}
实现递归打印当前目录下的所有层级的文件信息

二、字节流与字符流

此处为重点,在使用字节流和字符流的操作中,使用的基本流程是一样的:
1、根据文件路径创建File类对象
2、根据字节流或字符流的子类实例化父类对象
3、进行数据的读入或者写入的操作
4、关闭流(close()).
字节和字符流操作的本质区别只有一个:
字节流是原生的操作,而字符流是经过处理后的操作
字节流:InputStreamOutputStream
字符流:Reader、Writer

字节输出流:
OutputStream/Write

OutpuStream类:
1、实现了Closeable,Flushable两个接口:
    Closeable:public void close () throws IOException;
    Flushable:public void flush() throws IOException;
2、OutputStream中的其它方法:
public void write(byte b[])throws IOExpection
//将给定字符串的字节数组内容全部输出
public void write(byte b[],int len)throws IOException
//将部分字节数组内容输出
public abstruct void write(int b)throws IOException
//输出单个字节
3、OutputStream中的构造方法
public FileOutputStream(File file)throws FileNotFoundException
接收File类(覆盖)
public FileOutputStream(File file,boolean append)
接收File类(追加)

实现文件的输出:

    public static void main(String[] args) throws IOException {
        File file = new File(File.separator+ "D" + File.separator 
                + "test" + File.separator +  "test.txt");
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        Writer writer = new FileWriter(file);
        String mString = "hello java";
        writer.write(mString);
        writer.close();

    }
    在文件输出的时候,所有的文件会自动帮助用户创建,不需要调用creatFile()方法手工创建。

了解AutoCloseable接口:

JDK1.7追加的一个接口,实现自动关闭支持。
但是一般的使用过程是要结合try..catch的
而且必须在try中定义对象

字节输入流:
InputStream/Reader:
InputStream的使用和OutputStream在一定程度上相似
1、InputStream 只实现了Closeable接口
2、InputStream提供的方法

1. 读取数据到字节数组中,返回数据的读取个数。如果此时开辟的字节数组大小大于读取的数据大小,则返
回的就是读取个数;如果要读取的数据大于数组的内容,那么这个时候返回的就是数组长度;如果没有
数据了还在读,则返回-1: public int read(byte b[]) throws IOException.最常用方法
2. 读取部分数据到字节数组中,每次只读取传递数组的部分内容,如果读取满了则返回长度(len),如果没有
读取满则返回读取的数据个数,如果读取到最后没有数据了返回-1:public int read(byte b[], int off,
int len) throws IOException
3. 读取单个字节,每次读取一个字节的内容,直到没有数据了返回-1:public abstract int read() throws
IOException;

Writer类停供的write()方法,接收的都是char型:

public void write(String str) throws IOException
同样如果要操作文件使用FileWriter子类

字符输出流:Reader
Reader依然是一个抽象类。如果要进行文件读取,同样的,使用FileReader。

标准输出格式:

int len = 0 ;
byte[] data = new byte[1024];
while(len = inputStream.read(data))!=-1){
    outputStream.write(data,0,len);
}

三、字符编码
常用的几种字符编码
1、GBK、gb2312:描述中文编码,GBK包含繁体中文
2、UNICODE:16进制编码。java默认编码,支持所有语言
缺点:占用空间过大
3、UTF-8:支持所有语言,通用编码
4、ISO-8859-1:国际通用编码,不支持中文
浏览器页面默认此编码
乱码的本质:编码与解码字符编码不一致
四、内存操作流
内存操作流分为两类:
1、字节内存流:ByteArrayInputStream、ByteArrayOutputStream
2、字节内存流:CharArrayReader、CharArrayWrite

构造方法
ByteArrayInputStream、ByteArrayOutputStream
public ByteArrayInputStream(byte buf[])
public ByteArrayOutputStream()


内存流的继承图:
![这里写图片描述](https://img-blog.csdn.net/20180529160434914?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RldmlsX05ldA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

四、打印流
在我们实际的操作中用到的输出流一般都使用打印流。打印流的提出的目的在于解决OutputStream的设计缺陷,属于OutputStream的加强版。如果操作的不是二进制数据,只是想通过程序向终端输出信息的话,OutputStream不是很方便。
其缺陷:
1、所有的数据必须转换为字节数组
2、如果要输出的是int、double等类型就不方便了

构造方法:
PrintStream类:
public PrintStream(OutputStream out)
PrintWrite类:
public PrintWrite(OutputStream out)
public PrintWrite(Write out)

打印流的设计属于装饰设计模式。

格式化输出
publi PrintStream printf(Stringformat,Object…args)
格式化字符串
publi stati String format(String format,Object … args)


五、两种输入流
BufferedReader类;
BufferedReader类属于一个缓冲的输入流,而且是一个字符流的操作对象。在java中对于缓冲流也分为两类:字节缓冲流(BufferedInputStream)、字符缓冲流(BufferedReader)。

读取一行数据:
String readLine() throws IOException

BufferedReader类的定义与构造方法:
public class BufferedReader extends Reader
public BufferedReader(Reader in)

缺点:默认的换行模式是BufferedReader的最大缺点
            被新生Scanner替换
Scanner类:
主要使用的构造方法:
  1. 判断是否有指定类型数据: public boolean hasNextXxx()
  2. 取得指定类型的数据: public 数据类型 nextXxx()
  3. 定义分隔符:public Scanner useDelimiter(Pattern pattern)
  4. 构造方法:public Scanner(InputStream source)
    !!! Scanner可以对接收的数据类型使用正则表达式判断
    “`

汇总:以后除了二进制文件拷贝的处理之外,那么只要是针对程序的信息输出都是用打印流(PrintStream、PrintWriter),信息输出使用Scanner。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值