1. 编码问题

在介绍输入输出之前我们先介绍下关于编码的一些基本知识点。当一个文件里既有中文字符又有英文字符时。他们在不同的编码方式下会占领不同的内存:

1. ANSI 中文占领 2 个字节的内存空间,英文占领 1 个字节的内存空间。

2. GBK 中文占领 2 个字节的内存空间。英文占领 1 个字节的内存空间。

3. UTF-8 中文占领 3 个字节的内存空间,英文占领 1 个字节的内存空间。

4. UTF-16Be 中文占领 2 个字节的内存空间。英文占领 2 字节的内存空间。

JAVA 内置使用的是双字节编码,也就是 UTF-16BE。

2. File 类

java.io.File 类用于表示文件(或文件夹)

File 类仅仅用于表示文件(或文件夹)的信息(名称、大小等)。不能用于文件内容的訪问。

File 类的构造方法:

  1. File(File parent, String child);//依据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
  2. File(String pathname); //通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  3. File(String parent, String child);//依据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
  4. File(URI uri);//通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

关于 File 类的一些其它方法我们可查阅 API 文档。

3. RandomAccessFile 类

RandomAccessFile 是 java 提供的对文件内容的訪问。既能够读文件,也能够写文件。

RandomAccessFile 类的实例支持对随机訪问文件的读取和写入。能够訪问文件的任何位置。随机訪问文件的行为相似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针。输入操作从文件指针開始读取字节,并随着对字节的读取而前移此文件指针。假设随机訪问文件以读取/写入模式创建。则输出操作也可用;输出操作从文件指针開始写入字节。并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。

该文件指针能够通过 getFilePointer 方法读取,并通过 seek 方法设置。

通常,假设此类中的全部读取例程在读取所需数量的字节之前已到达文件末尾。则抛出 EOFException(是一种 IOException)。假设因为某些原因无法读取不论什么字节。而不是在读取所需数量的字节之前已到达文件末尾。则抛出 IOException。而不是 EOFException。

须要特别指出的是,假设流已被关闭。则可能抛出 IOException。

构造方法:

  1. RandomAccessFile(File file, String mode)。//创建从中读取和向当中写入(可选)的随机訪问文件流。该文件由 File 參数指定。
  2. RandomAccessFile(String name, String mode);//创建从中读取和向当中写入(可选)的随机訪问文件流,该文件具有指定名称。

当中 mode 主要有两种模式,”rw”(读写) 和 “r”(仅仅读)。

该类还分别提供了一个写入方法和读方法:

write(int): 仅仅写一个字节(后8位),同一时候指针指向下一个位置,准备再次写入

raf.read(): 读一个字节

4. 字节流

提供字节流读取方式的类主要有 InputStream 类和 OutputStream 类及其子类。

InputStream 抽象类是表示字节输入流的全部类的超类,OutputStream 抽象类是表示字节输出流的全部类的超类。

InputStream 的子类主要有:

- FileInputStream

- FilterInputStream (其下有 BufferedInputStream、DataInputStream 和 PushbackInputStream 三个子类)

- ObjectInputStream

- PipedInputStream

- SequenceInputStream

- StringBufferInputStream

- ByteArrayInputStream

OutputStream 的子类主要有:

- FileOutputStream

- FilterOutputStream (其下有 BufferedOutputStream、DataOutputStream 和 PrintStream 三个子类)

- ObjectOutputStream

- PipedOutputStream

- ByteArrayOutputStream

主要子类的介绍:

FileInputStream: 详细实现了在文件上读取数据

FileOutputStream: 实现了向文件里写出byte数据的方法

DataOutputStream/DataInputStream: 对”流”功能的扩展,能够更加方面的读取int,long,字符等类型数据

BufferedInputStream/BufferedOutputStream: 这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲。这样的流模式提高了IO的性能

假设从应用程序中把输入放入文件,相当于将一缸水倒入到还有一个缸中,那么:

FileOutputStream —> write() 方法相当于一滴一滴地把水“转移”过去

DataOutputStream –> writeXxx() 方法会方便一些。相当于一瓢一瓢把水“转移”过去

BufferedOutputStream —> write 方法更方便。相当于一飘一瓢先放入桶中,再从桶中倒入到还有一个缸中。性能提高了

FileInputStream 和 FileOutputStream 类的主要方法:

  1. //FileInputStream 类
  2. int read() ;// 从此输入流中读取一个数据字节
  3. int read(byte[] b); //从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。返回实际读取的字节的个数
  4. int read(byte[] b, int off, int len); //从此输入流中将最多 len 个字节的数据读入一个 byte 数组中,返回实际读取的字节的个数
  5. long skip(long n); //从输入流中跳过并丢弃 n 个字节的数据
  6. //FileOutputStream 类
  7. void write(byte[] b); //将 b.length 个字节从指定 byte 数组写入此文件输出流中
  8. void write(byte[] b, int off, int len); //将指定 byte 数组中从偏移量 off 開始的 len 个字节写入此文件输出流
  9. void write(int b); //将指定字节写入此文件输出流。

DataInputStream 和 DataOutputStream 类的主要方法:

  1. //DataInputStream 类
  2. int read(byte[] b); //从包括的输入流中读取一定数量的字节。并将它们存储到缓冲区数组 b 中
  3. int read(byte[] b, int off, int len); //从包括的输入流中将最多 len 个字节读入一个 byte 数组中
  4. boolean readBoolean(); //读取一个输入字节,假设该字节不是零,则返回 true,假设是零,则返回 false
  5. char readChar(); //读取两个输入字节并返回一个 char 值
  6. double readDouble(); //读取八个输入字节并返回一个 double 值
  7. void readFully(byte[] b); //从输入流中读取一些字节,并将它们存储在缓冲区数组 b 中
  8. void readFully(byte[] b, int off, int len); //从输入流中读取 len 个字节
  9. //DataOutputStream 类
  10. write(byte[] b, int off, int len); //将指定 byte 数组中从偏移量 off 開始的 len 个字节写入基础输出流
  11. void write(int b); //将指定字节(參数 b 的八个低位)写入基础输出流
  12. void writeBoolean(boolean v); //将一个 boolean 值以 1-byte 值形式写入基础输出流
  13. void writeChars(String s); //将字符串按字符顺序写入基础输出流
  14. void writeDouble(double v); //使用 Double 类中的 doubleToLongBits 方法将 double 參数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入高字节
  15. void writeInt(int v); //将一个 int 值以 4-byte 值形式写入基础输出流中。先写入高字节
  16. void writeUTF(String str); /以与机器无关方式使用 UTF-8 改动版编码将一个字符串写入基础输出流
  17. //很多其它方法可參见API

BufferedInputStream 和 BufferedOutputStream 类的主要方法:

  1. //BufferedInputStream类
  2. void mark(int readlimit); //在此输入流中标记当前的位置
  3. boolean markSupported(); //測试此输入流是否支持 mark 和 reset 方法
  4. int read(byte[] b); //从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
  5. int read(byte[] b, int off, int len); //将输入流中最多 len 个数据字节读入 byte 数组
  6. void reset(); //将此流又一次定位到最后一次对此输入流调用 mark 方法时的位置
  7. long skip(long n); //跳过和丢弃此输入流中数据的 n 个字节
  8. //BufferedOutputStream 类
  9. void flush(); //刷新此缓冲的输出流
  10. void write(byte[] b, int off, int len); //将指定 byte 数组中从偏移量 off 開始的 len 个字节写入此缓冲的输出流
  11. void write(int b); //将指定的字节写入此缓冲的输出流

5. 字符流

字符流(Reader Writer)操作的是文本文本文件,一次处理一个字符。字符的底层任然是主要的字节序列。

提供字符流读取方式的类主要有 Reader 类和 Writer 类及其子类。

Reader 的子类主要有:

- BufferedReader

- InputStreamReader(及其还包括 FileReader 子类)

- StringReader

- PipedReader

- ByteArrayReader

- FilterReader(及其还包括 PushbackReader 子类)

Writer 的子类主要有:

- BufferedWriter

- OutputStreamWriter(及其还包括 FileWriter 子类)

- StringWriter

- PipedWriter

- CharArrayWriter

- FilterWriter

- PrinterWriter

BufferedReader 和 BufferedWriter 类的主要方法:

  1. //BufferedReader
  2. int read(); //读取单个字符
  3. int read(char[] cbuf, int off, int len); //将字符读入数组的某一部分
  4. String readLine(); //读取一个文本行
  5. long skip(long n); //跳过字符
  6. //BufferedWriter
  7. void flush(); //刷新该流的缓冲
  8. void newLine(); //写入一个行分隔符
  9. void write(char[] cbuf, int off, int len); //写入字符数组的某一部分
  10. void write(int c); //写入单个字符
  11. void write(String s, int off, int len); //写入字符串的某一部分

FileReader 和 FileWriter 类的主要方法:

  1. //FileReader
  2. int read(); 读取单个字符
  3. int read(char[] cbuf, int offset, int length); 将字符读入数组中的某一部分
  4. //FileWriter
  5. void flush(); //刷新该流的缓冲
  6. String getEncoding(); //返回此流使用的字符编码的名称
  7. void write(char[] cbuf, int off, int len); //写入字符数组的某一部分
  8. void write(int c); //写入单个字符

Java 输入/输出流的更多相关文章

  1. Java输入/输出流体系

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...

  2. 深入理解Java输入输出流

    Java.io包的File类,File类用于目录和文件的创建.删除.遍历等操作,但不能用于文件的读写. Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流.如何理解流的概念呢?可以 ...

  3. Java 输入输出流 转载

    转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ...

  4. Java输入输出流(一)——常用的输入输出流

    1.流的概念:在Java中,流是从源到目的地的字节的有序序列.Java中有两种基本的流--输入流(InputStream)和输出流(OutputStream). 根据流相对于程序的另一个端点的不同,分 ...

  5. java 输入输出流1 FileInputStrem&&FileOutStream

    通过文件输入流读取问价 package unit6; import java.io.FileInputStream; import java.io.FileNotFoundException; imp ...

  6. java输入输出流总结 转载

    一.基本概念 1.1 什么是IO?     IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作.     Java所有的I/O机制都是 ...

  7. java输入输出流(内容练习)

    1,编写一个程序,读取文件test.txt的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.i ...

  8. Java输入输出流(转载)

    转自http://blog.csdn.net/hguisu/article/details/7418161 目录(?)[+] 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作 ...

  9. 转 Java输入输出流详解(非常详尽)

    转  http://blog.csdn.net/zsw12013/article/details/6534619 通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都 ...

  10. java输入输出流(I/O)总结

    io流的 四个基本类 java.io包中包含了流式I/O所需要的所有类.在java.io包中有四个基本类:InputStream.OutputStream及Reader.Writer类,它们分别处理字 ...

随机推荐

  1. QT 5.7.0 移植之 tslib 编译配置

    QT5.7 编译请参考:http://www.cnblogs.com/chenfulin5/p/5798764.html 最新的 tslib 是从他的 github 下载下来的. 地址是:https: ...

  2. EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接

    EAGAIN.EWOULDBLOCK.EINTR与非阻塞 长连接 EWOULDBLOCK用于非阻塞模式,不需要重新读或者写 EINTR指操作被中断唤醒,需要重新读/写 在Linux环境下开发经常会碰到 ...

  3. linux - camera capture

    //cut a picture#include <stdio.h>#include <stdlib.h>#include <string.h>#include &l ...

  4. 一个性能较好的JVM参数配置(转)

    一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...

  5. SQL Server 2012附加数据库报错

    操作系统: win8 数据库:SQL 2012 遇到问题: 以管理员身份登录SQL 2012,附件数据库提示如下错误: 解决办法: 以windows账号登录,附加,成功!

  6. imx6 uboot logo 更改

    最近需要更改im6 uboot的开机logo,使用10.1inch, 1024x600,18bit的LCD,期间遇到了很多的问题,记录于此. 参考链接 https://community.nxp.co ...

  7. Spring Boot简化了基于Spring的应用开发

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的.产品级别的Spring应用. Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可 ...

  8. java---同步与并发概念

    Java中并发的形式无非是多线程和多进程两种形式.这两种形式都是可以利用多核来发挥计算能力的. 先说并发: 多进程意味着同时运行多个JVM,这个代价通常比多线程高,每个JVM都有自己的堆栈.都要分别加 ...

  9. 【BZOJ】1642: [Usaco2007 Nov]Milking Time 挤奶时间(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1642 果然没能仔细思考是不行的.. 以后要静下心来好好想,不要认为不可做..... 看了题解... ...

  10. jconsole监控tomcat

    一.专业术语 GC垃圾回收机制:当需要分配的内存空间不再使用的时候,JVM将调用垃圾回收机制来回收内存空间. JMX(Java Management Extensions,即Java管理扩展)是一个为 ...