JavaIO学习(附实例和详解)
⼀、Java I/O类结构以及流的基本概念
在阅读Java I/O的实例之前我们必须清楚⼀些概念,我们先看看Java I/O的类结构图:
Java I/O主要以流的形式进⾏读写数据。
流是⼀组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,⽅便更直观的进⾏数据操作。
根据处理数据的数据类型的不同可以分为:字符流和字节流。
字符流和字节流的主要区别:
1.字节流读取的时候,读到⼀个字节就返回⼀个字节; 字符流使⽤了字节流读到⼀个或多个字节(中⽂对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图⽚,MP3,AVI视频⽂件,⽽字符流只能处理字符数据。只要是处理纯⽂本数据,就要优先考虑使⽤字符流,除此之外都⽤字节流。
3.实际上字节流在操作时本⾝不会⽤到缓冲区(内存),是⽂件本⾝直接操作的,⽽字符流在操作时使⽤了缓冲区,通过缓冲区再操作⽂件。
学习java的学习方法下⾯我们以⽂件操作作为实例进⼀步了解。
⼆、字符流实例
之前提到过“只要是处理纯⽂本数据,就要优先考虑使⽤字符流,除此之外都⽤字节流”。因此本字符流操作实例是操作txt⽂件。对其进⾏读写操作。
2.1、⼀些概念
此前,我们需要了解⼀些概念。
Java采⽤16位的Unicode来表⽰字符串和字符的。在写⼊字符流时我们都可以指定写⼊的字符串的编码。
这⾥博主贴出字符流类图结构,⽅便猿友阅读:
在⽂件操作的时候我们主要使⽤到FileReader和FileWriter或BufferedReader和BufferedWriter。
从类结构图来看:
FileReader是InputStreamReader的⼦类,⽽InputStreamReader是Reader的⼦类;
FileWriter是OutputStreamWriter的⼦类,⽽OutputStreamWriter则是Writer的⼦类。
2.2、FileReader和BufferedReader的使⽤
FileReader的常⽤构造包括以下两种:
(1)FileReader(String fileName):根据⽂件名创建FileReader对象。
(2)FileReader(File file):根据File对象创建FileReader对象。
FileReader的常⽤⽅法包括以下⼏种:
(1)int read():读取单个字符。返回字符的整数值,如果已经到达⽂件尾,则返回-1.
(2)int read(char[] cbuf):将字符读⼊cbuf字符数组。返回读取到的字符数,如果已经到达⽂件尾,则返回-1.
(3)int read(char[] cbuf,int off,int len):将读取到的字符存放到cbuf字符数组从off标识的偏移位置开始处,最多读取len个字符。
BufferedReader有以下两种构造⽅法:
(1)BufferedReader(Reader in):根据in代表的Reader对象创建BufferReader实例,缓冲区⼤⼩采⽤默认值。
(2)BufferedReader(Reader in,int sz):根据in代表的Reader对象创建BufferedReader实例,缓冲区⼤⼩采⽤指定sz值。
BufferedReader的常⽤⽅法包括以下⼏种:
(1)int read():返回字符的整数值,如果已经到达⽂件尾,则返回-1.
(2)int read(char[], int, int):将读取到的字符存放到cbuf字符数组从off标识的偏移位置开始处,最多读取len个字符。
(3)String readLine():读取⼀⽂本⾏。该⽅法遇到以下字符或者字符串认为当前⾏结束:‘\n’(换⾏符),’\r’(回车符),’\r\n’(回车换⾏)。返回值为该⾏内容的字符串,不包含任何⾏终⽌符,如果已到达流末尾,则返回null。
代码实例:
package java_io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TestReader {
public static void main(String[] args) {
TestReader testReader = new TestReader();
String path = "C:\\Users\\luoguohui\\Desktop\\";
}
public void readFileByFileReader(String path){
FileReader fileReader = null;
try {
fileReader = new FileReader(path);
char[] buf = new char[1024]; //每次读取1024个字符
int temp = 0;
System.out.println("readFileByFileReader执⾏结果:");
while ((temp = ad(buf)) != -1) {
System.out.print(new String(buf, 0, temp));
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
} finally { //像这种i/o操作尽量finally确保关闭
if (fileReader!=null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void readFileByBufferedReader(String path){
File file = new File(path);
if (file.isFile()) {
BufferedReader bufferedReader = null;
FileReader fileReader = null;
try {
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
String line = adLine();
System.out.println("readFileByBufferReader执⾏结果:");
while (line != null) {
System.out.println(line);
line = adLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileReader.close();
bufferedReader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
上⾯代码⽤到finally,关于finally虽然与I/O⽆关,不过这⾥还是说⼀下:
1、不管有⽊有出现异常,finally块中代码都会执⾏;
2、当try和catch中有return时,finally仍然会执⾏;
3、finally是在return后⾯的表达式运算后执⾏的(此时并没有返回运算后的值,⽽是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执⾏前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
<⽂本内容:
执⾏结果:
2.3、FileWriter和BufferWriter的使⽤
FileWriter的常⽤构造有以下四种:
(1)FileWriter(String fileName):根据⽂件名创建FileWriter对象。
(2)FileWriter(String fileName,boolean append):根据⽂件名创建FileWriter对象,append参数⽤来指定是否在原⽂件之后追加内容。
(3)FileWriter(File file):根据File对象创建FileWriter对象。
(4)FileWriter(File file,boolean append):根据File对象创建FileWriter对象,append参数⽤来指定是否在原⽂件之后追加内容。
FileWriter的常⽤⽅法包括以下⼏种:
(1)void writer(int c):向⽂件中写⼊正整数c代表的单个字符。
(2)void writer(char[] cbuf):向⽂件中写⼊字符数组cbuf。
(3)void writer(char[] cbuf,int off, in len):向⽂件中写⼊字符数组cbuf从偏移位置off开始的len个字符。
(4)void writer(String str):向⽂件中写⼊字符串str,注意此⽅法不会在写⼊完毕之后⾃动换⾏。
(5)void writer(String str,int off,int len):向⽂件中写⼊字符串str的从位置off开始、长度为len的⼀部分⼦串。
(6)Writer append(char c):向⽂件中追加单个字符c。
(7)Writer append(CharSequence csq):向⽂件中追加csq代表的⼀个字符序列。CharSequence是
从JDK1.4版本开始引⼊的⼀个接⼝,代表字符值的⼀个可读序列,此接⼝对许多不同种类的字符序列提供统⼀的只读访问。
(8)Writer append(CharSequence csq,int start,int end):向⽂件中追加csq字符序列的从位置start开始、end结束的⼀部分字符。
(9)void flush():刷新字符输出流缓冲区。
(10)void close():关闭字符输出流。
BufferedWriter也拥有如下两种形式的构造⽅法:
(1)BufferedWriter(Writer out): 根据out代表的Writer对象创建BufferedWriter实例,缓冲区⼤⼩采⽤默认值。
(2)BufferedWriter(Writer out,int sz):根据out代表的Writer对象创建BufferedWriter实例,缓冲区⼤⼩采⽤指定的sz值。
BufferedWriter的常⽤⽅法包括以下⼏种:
(1)void close() :关闭字符输出流。
(2)void flush() :刷新字符输出流缓冲区。
(3)void newLine(): 写⼊⽂本⾏。
(4)void write(char[] cbuf, int offset, int count) :向⽂件中写⼊字符数组cbuf从偏移位置off开始的len个字符。
(5)void write(int oneChar) :写⼊单个字符。
(6)void write(String str, int offset, int count) :向⽂件中写⼊字符串str的从位置off开始、长度为len的⼀部分⼦串。
(7)以上的⽅法都是重写了Writer的,还有继承⾃java.io.Writer 的⽅法:Writer append(char c)、Writer append(CharSequence csq)、Writer append(CharSequence csq, int start, int end)、void write(char[] cbuf)、write(String str)等⽅法。
代码实例:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。