【JAVA】IO详解

综合各种网文得出此文

引用

[1]http://blog.csdn.net/yczz/article/details/38761237

[2]http://www.cnblogs.com/pepcod/archive/2013/01/20/2913435.html

[3]http://blog.csdn.net/zhangerqing/article/details/8466532

首先 先挂一图,这个图是java中类的层次结构 引用自[1] 。

Java的IO是基于流的。

流是什么:

  流相当于一个连续不间断的信息,中间不加某些分隔符,信息从源端传到目的端后不改变,传什么就拿到什么

  比如TCP就是面向流的,也就是从Client传到Server端,传的是什么就是什么 不会给第一次第二次send之间加上某些分隔符。

  而UDP是面向报文的,也就是第一次传会在前面加上报头,用来区分每一次传输的信息。

  举个例子:

    流就是 要传输 hello world   收到的就是 hello world

    非流的 就是传输hello world  可能收到的是 $hello $world 单词之间加上用于分割的信息。

  你可以想像

    面向流的相当于从你家到自来水公司连一个水管,自来水公司给你的就是你在家获得的

    而面向报文的(非流)的相当于自来水公司向你家里送水,一桶一桶的送。你获得的可能不只是水,还有水桶。

输入流和输出流:

  流的方向分为输入和输出

  计算机存储有内存和外存,也就是内存和硬盘

  硬盘可以看做是个仓库,内存才是工厂。你要进行工作要在工厂里做,要把原料从仓库拿到工厂里

  也就是从硬盘把文件送到内存里面,这叫输入。对于你的程序来说,这就是输入。因为关键的地点在内存

  而你处理之后的数据要把它保存到仓库中,就是输出,也就是从内存到硬盘

  从此,流根据方向的不同分成了两种

  输入流  从硬盘输入到内存  Input

  输出流 从内存输出到内存  Output

字节流和字符流:

  根据流中信息的基本单位的不同,流分为字节流和字符流,也就是字节流由一个一个字节组成,而字符流由一个一个字符组成,每个字符在java中由两个字节组成 Unicode16

  在硬盘中,所有文件都是由字节存储的,包括文本文件,但是实际中,很多文件都是文本文件,也就有了字符流的产生,

  从字面上就可以看出,字符流适合于对字符文件的输入输出操作,也就是文本文件。因为是以字符为单位处理的。

  字节流适用于没有不包含字符的文件,比如 音频 视频 图片等。

JavaIO操作的对象:

  字节数组,String,文件,管道,流,网络资源

  每个对象都有一个对应的类用来针对他们来操作。

JavaIO的基类:

  Java中根据字节流和字符流 输出和输入分成了四个类

      字节流         字符流

  输入  InputStream    Reader

  输出  OutputStream  Writer

File类:

  File从字面上来讲是文件,在Linux等系统文件分为两种,一种是普通文件,一种是目录文件

  File主要是为了进行磁盘操作,比如文件的创建,文件夹的创建等等。

  1.构造 File f=new File("C:/1.txt);  File就表示一个路径所表示的东西。

  2.如果是一个目录 那么可以调用list方法 f.list()来获得目录中的文件名返回的是String[]

  3.还有很多其他的功能,查看API即可

InputStream:

  抽象类,所有输入字节流的基类,主要操作就是read()

  对应的各种对象的子类:

  ByteArrayInputStream:处理字节数组的类,允许将内存的缓冲区当做InputStream使用。

  StringBufferInputStream:将String转换成InputStream,内部实现用的是StringBuffer。

  FileInputStream:从文件中读取数据。

  PipedInputStream:用于从管道中读取数据。

  SequenceInputStream:将多个流对象转化成一个InputStream。

  FilterInputStream:装饰器类,为其它InputStream类提供功能。

Reader

  抽象类,所有输入字符流的基类 只要也是read()

  对应各种对象的子类:

引用[3]中的javaio经典例子:

BufferedReader的使用:

  1.缓冲输入文件 用BufferedReader

    

 1 public static String read(String filename) throws Exception {
 2
 3            BufferedReader br = new BufferedReader(new FileReader(filename));
 4
 5            String s;
 6
 7            StringBuffer sb = new StringBuffer();       while ((s = br.readLine()) != null) {
 8
 9                 sb.append(s + "\n");
10
11            }
12
13            br.close();
14
15       return sb.toString();
16
17        } 

    BufferedReader是一个包装器类,用来包装一个普通的Reader。让普通的Reader有更好的使用方式及性能

    一般来说用一个Reader或者Writer或者InputStream或者OutputStream都要仿佛Buffered里面进行提高性能操作

StringReader的使用:

  数据源是字符串String对象,

  相当于从内存读入。

  也可以按行读等。

 1 import java.io.*;
 2 public class SRDemo
 3 {
 4   public static void main(String args[]) throws IOException
 5   {
 6     String s1 = "For outsiders\nthe Software engineer\nlooks housed\nin a golden cage";
 7     StringReader sreader = new StringReader(s1);
 8     BufferedReader breader = new BufferedReader(sreader);
 9
10     String s2;
11     while( ( s2 = breader.readLine() ) != null)
12     {
13       System.out.println(s2);
14     }
15     breader.close();  sreader.close();
16   }
17 }

引用[3]:

  标准文件读写类的写法

  

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;

/**
 * 一个非常实用的文件操作类 . 2012-12-19
 *
 * @author Bruce Eckel , edited by erqing
 *
 */
public class TextFile extends ArrayList<String> {

    private static final long serialVersionUID = -1942855619975438512L;

    // Read a file as a String
    public static String read(String filename) {
        StringBuilder sb = new StringBuilder();
        try {
            BufferedReader in = new BufferedReader(new FileReader(new File(
                    filename).getAbsoluteFile()));
            String s;
            try {
                while ((s = in.readLine()) != null) {
                    sb.append(s);
                    sb.append("\n");
                }
            } finally {
                in.close();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return sb.toString();
    }

    // Write a single file in one method call
    public static void write(String fileName, String text) {
        try {
            PrintWriter out = new PrintWriter(
                    new File(fileName).getAbsoluteFile());
            try {
                out.print(text);
            } finally {
                out.close();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // Read a file,spilt by any regular expression
    public TextFile(String fileName, String splitter) {
        super(Arrays.asList(read(fileName).split(splitter)));
        if (get(0).equals(""))
            remove(0);
    }

    // Normally read by lines
    public TextFile(String fileName) {
        this(fileName, "\n");
    }

    public void write(String fileName) {
        try {
            PrintWriter out = new PrintWriter(
                    new File(fileName).getAbsoluteFile());
            try {
                for (String item : this)
                    out.println(item);
            } finally {
                out.close();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    // test,I have generated a file named data.d at the root
    public static void main(String[] args) {

        /* read() test */
        System.out.println(read("data.d")); // testing is OK!

        /* write() test */
        write("out.d", "helloworld\negg"); // testing is OK!

        /* constractor test */
        TextFile tf = new TextFile("data.d"); // testing is OK!

    }

}

标准二进制文件操作类

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * to read the binary file
 *
 * @author erqing
 *
 */
public class BinaryFile {

    /* the parametre is a file */
    public static byte[] read(File file) throws IOException {
        BufferedInputStream bf = new BufferedInputStream(new FileInputStream(
                file));
        try {
            byte[] data = new byte[bf.available()];
            bf.read(data);
            return data;
        } finally {
            bf.close();
        }
    }

    /* the param is the path of a file */
    public static byte[] read(String file) throws IOException {
        return read(new File(file).getAbsoluteFile());
    }
}
时间: 2025-01-02 09:09:17

【JAVA】IO详解的相关文章

Java IO 详解

Java IO 详解 初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接

Java IO详解(转)

IO是Java及众多编程语言很重要的一块,同时很多程序的瓶颈和耗时操作也都在IO这块. 一.简介 IO操作面临很多问题,信息量的巨大,网络的环境等等,因为IO不仅仅是对本地文件.目录的操作,有时对二进制流.还有一部分是网络方面的资源,所以多种原因直接造成IO操作无疑是耗时且复杂多变的.Java对IO的支持是个不断的演变过程,经过了很多的优化,直到JDK1.4以后,才趋于稳定,在JDK1.4中,加入了nio类,解决了很多性能问题,虽然我们有足够的理由不去了解关于Java IO以前的情况,但是为了学

Java IO详解

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:618528494  我们一起学Java! 初学Java,一直搞不懂Java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是Java io 比较基本的一些处理流

Java IO详解(三)------字节输入输出流

File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocean/p/6854098.html 那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)  1.字节输出流:OutputStream public abstrac

Java IO详解(六)------序列化与反序列化(对象流)

File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocean/p/6854098.html Java IO 字节输入输出流:http://www.cnblogs.com/ysocean/p/6854541.html Java IO 字符输入输出流:https://i.cnblogs.com/EditPosts.aspx?postid=6859242 Jav

java io详解及各输入输出类介绍

首先要记住Java有一个非常强大的 文件及目录类 File, 这里面你想要的功能都有. 下面进入正题. 由于JavaIO根据装饰器设计模式设计, 设计思想是先给出基本IO类,其他功能如缓存,格式化,再嵌套其他类实现. 在我看来实际上是个失败的设计,不仅没有使类变得简单,由于各种IO类必须组合起来才能发挥作用,反而增大了类的复杂度,写起来也冗余不已. 所以JavaIO类看起来会有些(非常)臃肿. 对于IO根据面向字符还是面向字节可分为两大类. 1. 面向字节的IO都是从InputStream和Ou

Java IO详解(一)------File 类

File 类:文件和目录路径名的抽象表示. 注意:File 类只能操作文件的属性,文件的内容是不能操作的. 1.File 类的字段 我们知道,各个平台之间的路径分隔符是不一样的. ①.对于UNIX平台,绝对路径名的前缀始终为"/" . 相对路径名没有前缀. 表示根目录的抽象路径名具有前缀"/"和空名称序列. ②.对于Microsoft Windows平台,包含驱动器说明符的路径名的前缀由后面跟着":"的驱动器号组成,如果路径名是绝对的,则可能后跟

Java网络详解

Java网络详解 Java网络基本概念 网络基础知识 1.计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议 2.网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上

JAVA: httpclient 详解;

相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者: httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等... 下面是测试代码(全部总结来自官方文档,以及翻译) 须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache

java反射详解 (转至 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html)

本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象获得完整的包名和类名 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package Reflect; /**  * 通过一个对象获得完整的包名和类名  * */ class Demo{     //other codes... } class hello{     pu