博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础篇---I/O技术(一)
阅读量:7068 次
发布时间:2019-06-28

本文共 7161 字,大约阅读时间需要 23 分钟。

对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的。在java.io.包中提供了相关的API.

java中流的概念划分

流的方向:

    • 输入流:数据源到程序(inputStream,Reader读进来)
    • 输出流:程序到目的地(OutPutStream,Writer写出去)

处理数据单元:

    • 字节流:按照字节读取数据(InputStream,OutputStream)
    • 字符流:按照字符读取数据(Reader,Writer)

功能不同

    • 节点流:直接从数据源或目的地读写数据
    • 处理流:不直接连接到数据源或目的地,是处理流的流,童工对其他流的处理提高程序的性能。

Jdk提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。

以下是java中io中常用的流。

 

InputStream

抽象类java.io.InputStream是所有字节输入流类型的父类,该类中定义了以字节为单位读取数据的基本方法,并在其子类中进行了分化和实现.

三个基本的read方法:

  • int read()
  • int read(byte[] buffer)
  • int read(byte[] buffer,int offset,int length)

其他方法:

  • void close()
  • int available()
  • skip(long n)
  • boolean markSupported()

InputStream类层次

 

import java.io.File ;import java.io.InputStream ;import java.io.FileInputStream ;public class InputStreamDemo{    public static void main(String args[]) throws Exception{    // 异常抛出,不处理        // 第1步、使用File类找到一个文件        File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象        // 第2步、通过子类实例化父类对象        InputStream input = null ;    // 准备好一个输入的对象        input = new FileInputStream(f)  ;    // 通过对象多态性,进行实例化        // 第3步、进行读操作        byte b[] = new byte[1024] ;        // 数组大小由文件决定        int len = 0 ;         int temp = 0 ;            // 接收每一个读取进来的数据        while((temp=input.read())!=-1){            // 表示还有内容,文件没有读完            b[len] = (byte)temp ;            len++ ;        }        // 第4步、关闭输出流        input.close() ;                        // 关闭输出流\        System.out.println("内容为:" + new String(b,0,len)) ;    // 把byte数组变为字符串输出    }};

 

 

OutputStream

java.io.OutputStream与java.io.InputStream对应,是所有字节输出流类型的抽象父类。

三个基本的write方法:

  • void write(int c)
  • void write(byte[] buffer)
  • void write(byte[] buffer,int offset,int length)

其他方法:

  • void close()
  • void flush()

OutputStream类层次

import java.io.File ;import java.io.OutputStream ;import java.io.FileOutputStream ;public class OutputStreamDemo{    public static void main(String args[]) throws Exception{    // 异常抛出,不处理        // 第1步、使用File类找到一个文件        File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象        // 第2步、通过子类实例化父类对象        OutputStream out = null ;    // 准备好一个输出的对象        out = new FileOutputStream(f)  ;    // 实例化        // 第3步、进行写操作        String str = "Hello World!!!" ;        // 准备一个字符串        byte b[] = str.getBytes() ;            // 只能输出byte数组,所以将字符串变为byte数组        out.write(b) ;        // 写入数据        // 第4步、关闭输出流        // out.close() ;                        // 关闭输出流    }};

 

Reader

抽象类java.io.Reader是所有字符输入流类型的父类,其中声明了用于读取字符流的有关方法.

三个基本的read方法:

  • int read()
  • int read(char[] cbuf)
  • int read(char[] cbuf,int offset,int length)

其他方法:

  • void close()
  • boolean ready()
  • skip(long n)
  • boolean markSupported()
  • void mark(int readAheadLimit)
  • void reset()

Reader类层次

import java.io.File ;import java.io.Reader ;import java.io.FileReader ;public class ReaderDemo{    public static void main(String args[]) throws Exception{    // 异常抛出,不处理        // 第1步、使用File类找到一个文件        File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象        // 第2步、通过子类实例化父类对象        Reader input = null ;    // 准备好一个输入的对象        input = new FileReader(f)  ;    // 通过对象多态性,进行实例化        // 第3步、进行读操作        char c[] = new char[1024] ;        // 所有的内容都读到此数组之中        int temp = 0 ;    // 接收每一个内容        int len = 0 ;        // 读取内容        while((temp=input.read())!=-1){            // 如果不是-1就表示还有内容,可以继续读取            c[len] = (char)temp ;            len++ ;        }        // 第4步、关闭输出流        input.close() ;                        // 关闭输出流        System.out.println("内容为:" + new String(c,0,len)) ;    // 把字符数组变为字符串输出    }};

 

 Writer

java.io.Writer与java.io.Reader类对应,是所有字符输出流类型的共同父类.

五个基本的write方法:

  • void write(int c)
  • void write(char[] cbuf)
  • void write(char[] cbuf,int offset,int leng)
  • void write(String string)
  • void write(String string,int offset,int length)

其它方法:

  • void close()
  • void flush()

Writer类层次

import java.io.File ;import java.io.Writer ;import java.io.FileWriter ;public class WriterDemo{    public static void main(String args[]) throws Exception{    // 异常抛出,不处理        // 第1步、使用File类找到一个文件        File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象        // 第2步、通过子类实例化父类对象        Writer out = null ;    // 准备好一个输出的对象        out = new FileWriter(f)  ;    // 通过对象多态性,进行实例化        // 第3步、进行写操作        String str = "Hello World!!!" ;        // 准备一个字符串        out.write(str) ;                        // 将内容输出,保存文件        // 第4步、关闭输出流        out.flush() ;    // 强制性清空缓冲区中的内容        // out.close() ;                        // 此时,没有关闭    }};

拷贝实例:

import java.io.* ;public class Copy{    public static void main(String args[]){        if(args.length!=2){        // 判断是否是两个参数            System.out.println("输入的参数不正确。") ;            System.out.println("例:java Copy 源文件路径 目标文件路径") ;            System.exit(1) ;    // 系统退出        }        File f1 = new File(args[0]) ;    // 源文件的File对象        File f2 = new File(args[1]) ;    // 目标文件的File对象        if(!f1.exists()){            System.out.println("源文件不存在!") ;            System.exit(1) ;        }        InputStream input = null ;        // 准备好输入流对象,读取源文件        OutputStream out = null ;        // 准备好输出流对象,写入目标文件        try{            input = new FileInputStream(f1) ;        }catch(FileNotFoundException e){            e.printStackTrace() ;        }        try{            out = new FileOutputStream(f2) ;        }catch(FileNotFoundException e){            e.printStackTrace() ;        }        if(input!=null && out!=null){    // 判断输入或输出是否准备好            int temp = 0 ;                try{                while((temp=input.read())!=-1){    // 开始拷贝                    out.write(temp) ;    // 边读边写                }                System.out.println("拷贝完成!") ;            }catch(IOException e){                e.printStackTrace() ;                System.out.println("拷贝失败!") ;            }            try{                input.close() ;        // 关闭                out.close() ;        // 关闭            }catch(IOException e){                e.printStackTrace() ;            }        }    }    }

*** 在一般操作输入输出内容就需要使用字节或字符流,但是有些时候需要将字符流变成字节流的形式,或着将字节流变成字符流的形式,所以就需要另外一组转换流操作类

    • OutputStreamWriter:是Writer的子类,将输出的字符流变成字节流。
    • InputStreamReader:是Reader的子类,将输入的字节流变成字符流。

转换步骤:

如果以文件操作为例,则在内存总的字符数据需要通过OutputStreamWriter变成字节流保存在文件中,读取的时候需要将读入的字节流通过InputStreamReader变成字符流

例如,将字节的文件输出流以字符的形式输出

import java.io.* ;public class OutputStreamWriterDemo{    public static void main(String args[]) throws Exception    {    // 所有异常抛出        File f = new File("d:" + File.separator + "test.txt") ;            Writer out = null ;    // 字符输出流        out = new OutputStreamWriter(new FileOutputStream(f)) ;    // 字节流变为字符流        out.write("hello world!!") ;    // 使用字符流输出        out.close() ;    }};

读的时候亦可以使用字符流的形式读取字节流的文件

import java.io.* ;public class InputStreamReaderDemo01{    public static void main(String args[]) throws Exception{        File f = new File("d:" + File.separator + "test.txt") ;            Reader reader = null ;        reader = new InputStreamReader(new FileInputStream(f)) ;    // 将字节流变为字符流        char c[] = new char[1024] ;        int len = reader.read(c) ;    // 读取        reader.close() ;    // 关闭        System.out.println(new String(c,0,len)) ;    }};

转载地址:http://cwhll.baihongyu.com/

你可能感兴趣的文章
Python3 day6面向对象
查看>>
查看Oracle耗时Sql
查看>>
CentOS 添加环境变量
查看>>
Linux目录详细说明大全(推荐)
查看>>
Distinct 实现自定义去重
查看>>
CodeSnippet.info整体技术构架
查看>>
[CodeWars][JS]实现链式加法
查看>>
第六天实验详解——dedecms通过xss漏洞写马
查看>>
EasyUI学习总结(一)——EasyUI入门
查看>>
[设计模式之禅读书笔记]004_设计模式六大原则(四):接口隔离原则
查看>>
[Linux学习]语系查询及设置
查看>>
DOM_01之树及遍历
查看>>
SQL Server 创建链接服务器
查看>>
环境配置
查看>>
vue 组件来回切换时 记住上一个组件滚动位置(keep-alive)
查看>>
<知识库的构建> 4-2 实例提取 Instance Extraction
查看>>
Java Web整合开发(15) -- Struts 1.x 高级应用
查看>>
HTML5 drag & drop 拖拽与拖放
查看>>
beanutil常用的方法
查看>>
-webkit-animation [CSS3]
查看>>