java IO系统字节流与字符流的各种转换及实例演示
一.IO的概念
即:输入(input)和输出(output).
Java的IO主要包括三个部分:
- 流式部分–IO的主体部分
- 非流式部分–主要包含一些辅助流式部分的类
- 文件读取的部分和安全相关的类以及与本地操作系统相关的文件系统的类
Java的流操作包含两种: - 基于字节流(InputStream读取,OutputStream写入)
- 基于字符流(Reader读取,Writer写入)
二.File类
File类对象表示磁盘上的文件或文档,
1.字符流方法主要有以下几种:
使用File类创建文件文件及文件路径的实例如下:
import java.io.File;
import java.io.IOException;
//File类进行文件和文件夹进行创建
public class FlieDemo {
public static void main(String[] args) {
File f1 = new File("aa.txt");
File f2 = new File("d:/aa.txt");
File f3 = new File("d:/aa");
File f4 = new File("d:/bb/cc");
try {
boolean b1 = f1.createNewFile();
boolean b2 = f2.createNewFile();
boolean b3 = f3.mkdir();
boolean b4 = f4.mkdirs();
if (b1&&b2&&b3&&b4){
System.out.println("创建成功");
}else{
System.out.println("创建失败");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.字节流的方法主要有以下几种:
FileInputStream类数据输入方法:
FileOutputStream类数据输出方法:
部分类方法代码实例:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//通过File类的字节流方法对图片进行复制操作
public class FileInputDemo {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("d:/zc.jpg");
fos = new FileOutputStream("d:/bb/cc/zc1.jpg");
int result = 0;
byte [] b = new byte[1024];
try {
while ((result = fis.read(b))!=-1){
fos.write(b,0,result);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
// 关闭IO流
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
二.Buffered方法
使用Buffered方法对上面的例子进行优化,以减少对磁盘的I/O操作
import java.io.*;
//通过添加Buffered缓冲区对图片进行复制,以减少对磁盘的I/O操作.
public class BufferedInputDemo {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
fis = new FileInputStream("d:/zc.jpg");
bis = new BufferedInputStream(fis);
fos = new FileOutputStream("d:/bb/zc1.jpg");
bos = new BufferedOutputStream(fos);
int result = 0;
byte [] b = new byte[2048];
try {
while ((result = bis.read(b))!=-1){
bos.write(b,0,result);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
bos.close();
bis.close();
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
BufferedReader与BufferedWriter实现了自带缓冲区的字符流高效读写,其最小操作单元为一个字符(16位),同时,我们也可以自己指定缓冲区的大小,默认的缓冲区有8192个字符.
readLine()和ready(),readLine()方法用于从缓冲区,每次读取一行,ready()用于判断文件是否被读取完毕。
flush()方法的作用就是将缓冲区内的数据传递给操作系统,并通过操作系统写入磁盘。在调用close()方法时,会自动调用flush()方法
import java.io.*;
//Bufferread实现自带缓冲区的高效读写
public class BufferreadDemo {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader("d:/bb/cc/abc.txt"));
try {
bw = new BufferedWriter(new FileWriter("d:/abc1.txt"));
String temp = null;
while ((temp=br.readLine())!=null){
bw.write(temp);
bw.newLine();
}
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
bw.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
实现一个在键盘输入数据写入文档的功能:
import java.io.*;
//使用Buffered实现缓冲区的读写功能以减少对磁盘的IO操作
//实现键盘输入更改文档功能
public class BufferedReadDemo {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
br = new BufferedReader(new InputStreamReader(System.in));
try {
bw = new BufferedWriter(new FileWriter("d:/aa.txt"));
String temp = null;
while ((temp = br.readLine())!=null){
if (temp.equals("quit")){
break;
}
bw.write(temp);
bw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bw.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三.Java字符集
在JVM内部,统一使用基于Unicode字符集的字符编码, 对于中文版操作系统来说,系统默认编码为GBK(System.getProperty(“file.encoding”))
//查询字符编码的版本
public class EncodingDemo {
public static void main(String[] args) {
System.out.println(System.getProperty("file.encoding"));
}
}
四.PrinterWriter
PrintWriter类和BufferedWriter一样,也继承自Writer类,它们的大部分功能是一样的。不同的是,BufferedWriter提供了缓冲区,能提供高效的数据写入,而PrintWriter提供了数据的格式化,例如print(boolean b)、print(char c)、print(double d)及支持任意平台的换行方法println()等等,这使得我们的程序更加自由
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
//PrintWriter实现数据的格式化和写入
public class PrintWriterDemo {
public static void main(String[] args) {
PrintWriter pw = null;
try {
pw = new PrintWriter(new BufferedWriter(new FileWriter("d:/a1.txt")));
pw.print("PrintWriter演示");
pw.println();
pw.println(false);
pw.println(3.14);
pw.println(new char[]{'a','o','e','i','u'});
pw.println(new Integer(2009));
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
pw.close();
}
}
}