Java IO深入浅出

1.What is stream?

流失一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或者是网络连接。类似的,当程序需要写入数据的时候,就会开启通向目的地的流。

在Java中,IO的部分很庞大,基本包括两大部分:字节流和字符流。具体结构如下图(图源于网上):

2:什么是字节流?

以字节为单位传输的流。字节流的输入流祖先是:Inputstream(数据单位是byte (8bits))输出的祖先是OutputStream(数据单位是byte(8bits));

【这里有一个规律:不管是子类还是装饰类都是以XXXinputStream和XXXoutputStream的方式出现,最后恒定的putStream决定了它是字节流】

FileInputStream和FileOutStream是节点流,但他们是继承关系,他们的构造方法允许通过文件的路径名来构造响相应的流。

如:FileInputStream infile = new FileInputSream("E:\\mytest");(需要注意的是在用文件输入流的时候,必须存在且可读,而输出流的时候必须文件存在且可覆盖的

);

BufferedInputStream和BufferOutputStream,他们是过滤器流,他们与祖先不是继承关系,而是装饰和被装饰关系(实际用到装饰者模式),作用是提高输入和输出的效率,其提供一个缓冲的方式;

DataInputStream和DataOutputStream 是数据驶入流和数据输出流,他们与祖先也不是继承关系,而是装饰和被装饰关系,这里主要用到(装饰模式)其可以实现程序与机器无关的方式读写Java程序,在网络传输中经常用到。

3:什么是字符流

字符流主要以字符为单位传输的流。字符流输入和输出的祖先分别是Reader和Writer数据单位是字符 (16bits))。

【这里有一个规律:不管是子类还是装饰类都是以XXXReader和XXXWriter的方式出现,最后恒定的Reader或Writer决定了它是字符流】

InputStreamReader和OutputStreamWriter。在构造它使用指定的 charset 读取字节并将其解码为字符。

BufferReaded和BufferWriter 与上面的字节流一样效果,他们与其祖先不是继承关系,而是装饰和被装饰关系(实际用到装饰者模式),使用缓冲大大提高输入输出的效率,在代码读写中以行为单位。

代码:

import java.io.*;
public class TextRead{

public static void main(String[] args){
   File fin,fout;
   BufferedReader bf = null;
   PrintWriter pw = null;
   try{
    fin = new File("zzc.txt"); //注意文件与程序都要在同一个文件夹下。zzc.txt为要被复制的文件。
    fout = new File("copyzzc.txt"); //如果没有会自动创建。
    bf = new BufferedReader(new FileReader(fin));
    pw = new PrintWriter(fout); //PrintWriter为打印流,也可以使用BufferedWriter.
    String line = bf.readLine();
    while(line!=null){
    pw.println(line);
     line = bf.readLine();
    }
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    try{
    //关闭 文件。
     if(bf!=null){
      bf.close();
      bf = null;
     }
     if(pw!=null){
      pw.close();
      pw = null;
     }
    }catch(Exception e){
     e.printStackTrace();
    }
   }
}
}
import java.io.*;
public class TextRead{

public static void main(String[] args){
   BufferedReader bf = null;/*BufferedReader相当于一个大桶,其实就是内存,这里实现了大量大量的读写 ,而不是读一个字节或字符就直接写如硬盘,加强了对硬盘的保护。*/
   try{
    while(true){ // while(true){}循环保证程序不会结束

       bf = new BufferedReader(new InputStreamReader(System.in));
       /*System.in 为标准输入,System.out为标准输出*/
       /*InputStreamReader用语将字节流到字符流的转化,这也就是处理流了
        *在这里相当与2个管道接在System.in与程序之间。
        *readLine()方法功能比较好用,也就通过处理流来实现更好功能。
        **/
     String line = bf.readLine();
     System.out.println(line);
    }
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    //一定要关闭流,用完后。最好放在

filally 里面。
    try{
     if(bf!=null){
      bf.close();
     }
    }catch(Exception e){
       e.printStackTrace();
    }
   }
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 07:37:58

Java IO深入浅出的相关文章

漫谈Java IO之普通IO流与BIO服务器

今天来复习一下基础IO,也就是最普通的IO. 网络IO的基本知识与概念 普通IO以及BIO服务器 NIO的使用与服务器Hello world Netty入门与服务器Hello world Netty深入浅出 输入流与输出流 Java的输入流和输出流,按照输入输出的单元不同,又可以分为字节流和字符流的. JDK提供了很多输入流和输出流,比如: 字节流可以按照不同的变量类型进行读写,而字符流则是基于字符编码的.不同的字符编码包含的字节数是不一样的,因此在使用字符流时,一定要注意编码的问题. 读写 字

漫谈Java IO之 NIO那些事儿

前面一篇中已经介绍了基本IO的使用以及最简单的阻塞服务器的例子,本篇就来介绍下NIO的相关内容,前面的分享可以参考目录: 网络IO的基本知识与概念 普通IO以及BIO服务器 NIO的使用与服务器Hello world Netty入门与服务器Hello world Netty深入浅出 NIO,也叫做new-IO或者non-blocking-IO,就暂且理解为非阻塞IO吧. 为什么选择NIO 那么NIO相对于IO来说,有什么优势呢?总结来说: IO是面向流的,数据只能从一端读取到另一端,不能随意读写

java IO之输入流——InputStream

java的基本输入流是java.io.InputStream,该抽象类定义了输入流的基本输入操作方法,实现自该抽象类的子类都有定义自己的数据源,例如ByteArrayInputStream的构造函数指定了ByteArrayInputStream输入流的数据源必须是一个字符数组.这就可以有多种不同的数据源,包括:字符数组.String对象.文件."管道".一个由其他种类的流组成的序列... 1 public ByteArrayInputStream(byte buf[]) {} 2 3

Hive报错 Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D

报错信息如下 Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D 解决方法: 编辑 hive-site.xml 文件,添加下边的属性 <property> <name>system:java.io.tmpdir<

java.io.IOException: No space left on device 错误

今天碰到比较奇怪的问题: 7/05/14 19:20:24 INFO util.Utils: Fetching http://192.168.31.160:33039/jars/spark_study_java-0.0.1-SNAPSHOT-jar-with-dependencies.jar to /tmp/spark-446068a4-aaa4-4277-b009-908bf0d4ecac/executor-dcc3175b-7d19-4485-81e1-bf31a83a66b4/spark-

【java】io流之字节输入流:java.io.InputStream类及子类java.io.FileInputStream

1 package 文件操作; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8 public class TestInputStream { 9 public static void main(String[] args) throws IOException { 10 File file=new F

java io 学习

1,io 体系 在整个Java.io包中最重要的就是5个类和一个接口.5个类指的是File.OutputStream.InputStream.Writer.Reader:一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了. Java.io包中定义了多个流类型类实现输入输出的功能,从不同的角度可以分为: ~按照数据流方向的不同可以分为输入流和输出流. ~按照按照数据处理单位的不同可以分为字节流和字符流. 如下几张图可以直观的描述io

Java IO流 探险

Java的IO流使用了一种装饰器设计模式,它将IO流分为底层节点流和上层处理流.本篇重点在如何访问文件与目录.如何以二进制格式和文本格式来读写数据.对象序列化机制.还有Java7的"NIO.2". 装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装饰的对象.并基于被装饰的对象的功能,提供更强的功能. IO的方式通常分为:BIO(同步阻塞).NIO(同步非阻塞).AIO

Play生产模式下java.io.FileNotFoundException那点事

之前”用Scala+Play构建地理数据查询接口”那篇文章里,用到的数据是json格式的文本文件area.json,存放在conf/jsons文件夹下.最开始是放在public/文件夹下,在线上准生产模式下运行: activator dist 得到mosquito-1.0.zip压缩包,解压后: 去/bin目录下运行mosquito脚本报错: java.io.FileNotFoundException 然后就去解压的mosquito-1.0/看发现并没有public文件夹,由此可见public文