Java IO操作
流
分类
-
输入流:将存储设备中的数据写入内存中。
-
输出流:将内存中的数据写入存储设备中。
-
字节流:以字节为单位,可以读写所有文件
-
字符流:以字符为单位,只能读写文本文件。
字节流
-
InputStream:所有输入字节流的超类
主要方法- close();
- mark();在此输入流中标记当前位置
- markSupported();测试此输入流是否支持mark
- read();从输入流中读取下一个字节,该方法还有其他参数
- reset();将此流重新定位到上一次调用mark方法的地方
- skip(long n)跳过或者丢弃此流中的N个字节
-
OutputStream:所有输出字节流的超类
主要方法:- close();
- flush();刷新此输入流并写出缓存中的数据
- write();写入操作
字符流
-
Reader:所有输入字符流的基类
主要方法:- read(),读取一个字符,返回值为读取的字符
- read(char[] a)throws IOException,读取一系列的字符到a中,返回值为读取的字符的数量。
- abstract read(char[] a,int off,int len),读取len个字符,从a的off下标处开始写入
-
Writer:所有输出字符流的基类
主要方法:
- write(),写单个字符
Java的IO流根据是否直接处理数据,又分为节点流和处理流。节点流直接处理数据,处理流是对一个已存在的节点流的连接和封装。
节点流
- 文件流:FieInputStream,FileOutputStream,FileWriter,FileReader. 他们都会直接操作文件,和OS底层互动,在使用完成之后,需要关闭流对象,因为Java垃圾回收机制不会主动回收。
- 数组流:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter,对数组进行处理的节点流。
- 字符串流:StringWriter,StringReader,其中StringReader能够从String字符串中读取字符然后保存在char数组中。
- 管道流:PipedInputStream,PipedOutputStream,PipedReader,PipedWriter,对管道进行处理的管道流。
处理流
处理流的构造方法中总是要带一个节点流的对象作为参数
-
缓冲流:BufferedImputStrean,BufferedOutputStream,BufferedReader ,BufferedWriter,需要父类作为构造参数,增加缓冲功能,避免频繁读写硬盘。可以初始化缓冲数据的大小。另外,BufferedReader提供了一次读一行的方法radeLine(),而FileInputStream和FileReader只能读取一个字符或者一个字。
-
转换流:InputStreamReader,OutputStreamWriter,要inputStream或者OutputStream作为参数,实现从字节流到字符流的转换
-
数据流:DataInputStream,DataOutputStream,提供将基础数据类型写入到文件中,或者读取出来。
常见用法
- 读取键盘输入,打印到控制台
PrintWriter out = null;
BufferedReader br = null;
try{
System.out.println("请输入:");
out = new PrintWriter(System.out, true);
br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if (line.equals("exit")) {
System.exit(1);
}
out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
out.close();
br.close();
}
- 用字节流读写文件
因为是用字节流来读媒介,所以对应的流是 InputStream 和 OutputStream,并且媒介对象是文件,所以用到子类是 FileInputStream 和 FileOutputStream,这里还可以通过 BufferedInputStream 用缓冲流来读取文件。
InputStream is =null;
OutputStream os = null;
try {
// 在try()中打开文件会在结尾自动关闭
is = new FileInputStream("D:/FileInputStreamTest.txt");
os = new FileOutputStream("D:/FileOutputStreamTest.txt");
byte[] buf = new byte[4];
int hasRead = 0;
while ((hasRead = is.read(buf)) > 0) {
os.write(buf, 0, hasRead);
}
System.out.println("write success");
} catch (Exception e) {
e.printStackTrace();
}finally{
os.close();
is.close();
}
- 用字符流读写文件
使用FileReader和FileWriter
// 在try() 中打开的文件, JVM会自动关闭
public static void readAndWriteCharToFile() throws IOException{
Reader reader = null;
Writer writer =null;
try {
File readFile = new File("d:/FileInputStreamTest.txt");
reader = new FileReader(readFile);
File writeFile = new File("d:/FileOutputStreamTest.txt");
writer = new FileWriter(writeFile);
char[] byteArray = new char[(int) readFile.length()];
int size = reader.read(byteArray);
System.out.println("大小:" + size + "个字符;内容:" + new String(byteArray));
writer.write(byteArray);
} catch (Exception e) {
e.printStackTrace();
}finally{
reader.close();
writer.close();
}
}
使用StringReader和StringWriter
StringReader sr =null;
StringWriter sw =null;
try {
String str = "学习不刻苦
" + "不如卖红薯;
";
char[] buf = new char[32];
int hasRead = 0;
// StringReader将以String字符串为节点读取数据
sr = new StringReader(str);
while ((hasRead = sr.read(buf)) > 0) {
System.out.print(new String(buf, 0, hasRead));
}
// 由于String是一个不可变类,因此创建StringWriter时,实际上是以一个StringBuffer作为输出节点
sw = new StringWriter();
sw.write("黑夜给了我黑色的眼睛
");
sw.write("我却用它寻找光明
");
// toString()返回sw节点内的数据
System.out.println(sw.toString());
} catch (Exception e) {
e.printStackTrace();
}finally{
sw.close();
sr.close();
}
- 字节流转化为字符流
在3中使用字符流读文件时打印到控制台会产生乱码,但是使用转化流可以解决这个问题。
InputStream is =null;
Reader reader = null;
try {
File file = new File("d:/FileInputStreamTest.txt");
is = new FileInputStream(file);
reader = new InputStreamReader(is,"gbk");
char[] byteArray = new char[(int) file.length()];
int size = reader.read(byteArray);
System.out.println("大小:" + size + ";内容:" + new String(byteArray));
} catch (Exception e) {
e.printStackTrace();
}finally{
reader.close();
is.close();
}
以上参考自https://www.cnblogs.com/CQqf/p/10795656.html
本文来自博客园,作者:两小无猜,转载请注明原文链接:https://www.cnblogs.com/charlottepl/p/13099022.html