资讯专栏INFORMATION COLUMN

Java I/O流

jerry / 962人阅读

摘要:文件的读写是流常用的也是最基础的操作,然而字节流,字符流,,,等等,各种各样的流操作类傻傻分不清楚,今天我们就对常用的流操作做简单的总结。

文件的读写是java i/o流常用的也是最基础的操作,然而字节流,字符流,InputStream,OutpurStream,Reader,Writer等等,各种各样的流操作类傻傻分不清楚,今天我们就对常用的流操作做简单的总结。本文力求简洁,不至于看到大量的代码觉得困倦。

字节流/字符流表
分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FileInputStream FileOutputStream FileReader FileWriter
访问数组 ByteArrayInputStream BiteArrayOutputStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
访问字符串 StringReader StringWriter
缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
转换流 InputStreamReader OutputStreamWriter
对象流 ObjectInputStream ObjectOutputStream
抽象基类 FilterInputStream FilterOutputStream FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回输入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DataOutputStream

其中基类都是抽象类,不同的子类对应不同的用途
首先我们看一下字节流与字符流的不同之处

字节流是由字节组成的,字符流是由字符组成的. Java里字符由两个字节组成.字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化。

通俗的来讲,字节流就是二进制流,通常的图片,视频,音频文件都可以通过字节流来读写,字符流就是字符串,中文字符,等unicode字符编码后的字符集。字节流可以通过转换流(即InputStreamReaderInputStreamWriter)转换为字符流(转化的过程就是编码的过程),缓冲流是为了提高读写效率提供的类,可以开辟出一个缓冲区用于高速存取数据流(分别对应字节流和字符流)。

字节流读写文件的实例
public class FileCopy {
    public void fileCopy(String sourceFile,String targetFile) throws IOException{
        FileInputStream in=new FileInputStream(sourceFile);
        FileOutputStream out=new FileOutputStream(targetFile);
        byte[] buffer=new byte[2048];//创建2048个字节大小的缓冲区(可根据拷贝文件大小自行定义)
        int value;
        while((value=in.read(buffer))!=-1){//循环读写
            out.write(buffer, 0, value);
        }
                if(in!=null)in.close();//关闭i/o流
                if(out!=null)out.close();
    }
    public static void main(String[] args) throws IOException {
        String in="readFile.txt";
        String out="outFile.txt";
        FileCopy f=new FileCopy();
        f.fileCopy(in, out);
    }
}
字节流转字符流实例

文件拷贝不推荐用这种方法,此方法仅作为字节流转字符流的实例,因为在文件copy中字节流转化为字符流读写的意义不大,而且会降低运行效率

public class FileCopy {
    public void fileCopy(String sourceFile,String targetFile) throws IOException{
        FileInputStream in=new FileInputStream(sourceFile);
        FileOutputStream out=new FileOutputStream(targetFile);
        BufferedReader reader=new BufferedReader(new InputStreamReader(in));
        BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));
        String line="";
        StringBuffer result=new StringBuffer();
        while((line=reader.readLine())!=null){
            writer.write(line);//此处的write是将数据写入缓冲区,并没有写入文件
            writer.flush();//将缓冲区数据写入文件
        }
        if(writer!=null)writer.close();
        if(reader!=null)reader.close();
    }
    public static void main(String[] args) throws IOException {
        String in="readFile.txt";
        String out="outFile.txt";
        FileCopy f=new FileCopy();
        f.fileCopy(in, out);
        System.out.println("hell java");
    }
}

关键在于这两行

BufferedReader reader=new BufferedReader(new InputStreamReader(in));
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));

将FileInputStream作为参数传入InputStreamReader中然后作为参数传给BufferedReader,其中InputStreamReader作为Reader的子类传入

更多关于java的文章请戳这里:(您的留言意见是对我最大的支持)

我的文章列表

Email:sxh13208803520@gmail.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66956.html

相关文章

  • 高薪程序员&面试题精讲系列22之说说JavaIO,常用哪些IO

    摘要:一面试题及剖析今日面试题今天壹哥带各位复习一块可能会令初学者比较头疼的内容,起码当时让我很有些头疼的内容,那就是流。在这里壹哥会从两部分展开介绍流,即与流。除此之外尽量使用字节流。关闭此输入流并释放与流相关联的任何系统资源。 一. 面试题及剖析 1. 今日面试题 今天 壹哥 带各位复习一块可...

    fnngj 评论0 收藏0
  • 如何理解I/O多路复用

    摘要:为了讲清复用的是什么,首先得先说明一下逻辑流的概念。理解了这个,那么所谓的复用,指的就是在一个逻辑流里处理多个事件如何做到利用多路复用器,轮询监听各路,如果一旦有事件发生,那么就去处理,否则程序阻塞。 java nio提供了一套称为I/O多路复用的编程范式,那么什么叫做I/O多路复用呢?所谓的I/O多路复用,从字面意思上来理解,就是:有多个I/O操作(或是写,或是读,或是请求),这多个...

    desdik 评论0 收藏0
  • Java™ 教程(字符

    字符流 Java平台使用Unicode约定存储字符值,字符流I/O自动将此内部格式与本地字符集进行转换,在Western语言环境中,本地字符集通常是ASCII的8位超集。 对于大多数应用程序,具有字符流的I/O并不比具有字节流的I/O复杂,使用流类完成的输入和输出会自动转换为本地字符集和从本地字符集转换,使用字符流代替字节流的程序会自动适应本地字符集并为国际化做了准备 — 所有这些都无需程序员的额...

    mochixuan 评论0 收藏0
  • Java I/O简介

    摘要:如果不指定字符集,则使用系统默认字符编码,系统的默认字符编码一般是。所以更准确的说,是将一个字节输入流按照给定的字符编码来解码,从而得到一个字符输入流。当然,缺点就是不能选择使用的字符编码。 相对于Python和 C来说,Java的I/O操作API比较复杂,因此本文打算做个简单的介绍。 1. I/O分类 总的来说Java的I/O按照处理数据的粒度和方向来划分,一共可以分为4类: 基...

    darkbug 评论0 收藏0
  • Java™ 教程(I/O

    I/O流 I/O流表示输入源或输出目标,流可以表示许多不同类型的源和目标,包括磁盘文件、设备、其他程序和内存数组。 流支持许多不同类型的数据,包括简单字节、原始数据类型、本地化字符和对象,有些流只是传递数据,其他人以有用的方式操纵和转换数据。 无论它们如何在内部工作,所有流都为使用它们的程序提供相同的简单模型:流是一系列数据,程序使用输入流从源读取数据,一次一个条目: showImg(https:...

    JerryWangSAP 评论0 收藏0

发表评论

0条评论

jerry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<