Java IO流 讲解,javaio流讲解
Java IO流 讲解,javaio流讲解
对于一些初学Java的人来说 io关系不太好理解 但你明白了 代码敲多了 就会慢慢理解了
下面这个图就很好诠释了Java IO流的关系
我们先讲讲最基础的!
IO流的分类
按流向分类:
输入流 读取数据
输出流 写出数据
按数据类型分类:
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
注意:一般我们在探讨IO流的时候,如果没有明确说明按哪种分类来说,默认情况下是按照数据类型来分的。
字节输入流
对于字节输入流InputStream 类是Java所有输入流类的父类 该类为抽象类 实现如下
public abstract class InputStream extends Object implements Closeable
常用方法:
- read():从输入类读取数据 逐字节读取输入数据
- skip(long n):将指针从当前位置向后跳动n个字节
- mark():在指针位置做一个标记
- Reset():将指针移动到标记位置
- close():关闭输入流
读取数据1:
public void fun(){
FileInputStream fis=null;
InputStream is=null;
try {
fis=new FileInputStream("a.txt");
int len;
while((len=fis.read())!=-1){
System.out.print((char)len);
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("读取文件异常");
}finally{
if(is!=null)
try {
is.close();
} catch (IOException e) {
System.out.println("关闭输入流异常");
}
if(fis!=null)
try {
fis.close();
} catch (IOException e) {
System.out.println("关闭文件输入流异常");
}
}
}
不过上面这种方式属于逐字节读取数据 效率低 我们可以一个字节数组一个字节数组读取 下面我们来改下
读取数据2:
public void fun(){
FileInputStream fis=null;
InputStream is=null;
byte [] bys=new byte[1024];//数组的长度一般是1024或者1024的整数倍
try {
fis=new FileInputStream("a.txt");
int len;
while((len=fis.read(bys))!=-1){
System.out.print(new String(bys,0,len));
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("读取文件异常");
}finally{
if(is!=null)
try {
is.close();
} catch (IOException e) {
System.out.println("关闭输入流异常");
}
if(fis!=null)
try {
fis.close();
} catch (IOException e) {
System.out.println("关闭文件输入流异常");
}
}
}
虽然这样效果提高了 但还有一个问题 一般情况下 对于文本文件的处理 我们都会采用字符流来解决
字节输出流
对于字节输入流OutputStream 类是Java所有输出流类的父类 该类为抽象类 实现如下
public abstract class OutputStream extends Object implements Closeable
常用方法:
- write();向输出流写入数据 只能逐字节输出数据
- flush();在具有缓冲功能的子类对象中 强制清空缓
- close():关闭输出流
write:
public void write(int b):写一个字节
public void write(byte[] b):写一个字节数组
public void write(byte[] b,int off,int len):写一个字节数组的一部分
写入数据1:写一个字节数组
public void fun(){
FileOutputStream fos=null;
OutputStream os=null;
try {
fos=new FileOutputStream("d.txt");
fos.write("hello world".getBytes());
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("写入文件失败");
}finally{
if(os!=null)
try {
os.close();
} catch (IOException e) {
System.out.println("关闭输出流失败");
}
if(fos!=null)
try {
fos.close();
} catch (IOException e) {
System.out.println("关闭文件输出流失败");
}
}
}
写入数据2:写一个字节数组的一部分
public void fun6(){
FileOutputStream fos=null;
OutputStream os=null;
byte [] bys={97,98,99,100,101};
try {
fos=new FileOutputStream("d.txt");
fos.write(bys,0,3);
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("写入文件失败");
}finally{
if(os!=null)
try {
os.close();
} catch (IOException e) {
System.out.println("关闭输出流失败");
}
if(fos!=null)
try {
fos.close();
} catch (IOException e) {
System.out.println("关闭文件输出流失败");
}
}
}
如果你想写入换行,那么怎么办?不同的系统针对不同的换行符号识别是不一样的
windows:\r\n
linux:\n
Mac:\r
而一些常见的个高级记事本,是可以识别任意换行符号的。
public void fun(){
FileOutputStream fos=null;
OutputStream os=null;
try {
fos=new FileOutputStream("d.txt");
fos.write(("hello"+"\r\n").getBytes());
fos.write(("java"+"\r\n").getBytes());
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("写入文件失败");
}finally{
if(os!=null)
try {
os.close();
} catch (IOException e) {
System.out.println("关闭输出流失败");
}
if(fos!=null)
try {
fos.close();
} catch (IOException e) {
System.out.println("关闭文件输出流失败");
}
}
}
字符输入流
Reader类
用来从输入流中读入数据 该类也是一个抽象类 定义了所有字节输入流,具有流共有的特性 其他具体的字符输入流类继承自Reader类
常用方法:
- read():从输入类读取数据 逐字节读取输入数据
- skip(long n):将指针从当前位置向后跳动n个字节
- mark():在指针位置做一个标记
- Reset():将指针移动到标记位置
- close():关闭输入流
读取数据1:
public void fun(){
FileReader fr=null;
try {
fr=new FileReader("d.txt");
int len;
while((len=fr.read())!=-1){
System.out.print((char)len);
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("读取文件失败");
}finally{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
System.out.println("关闭输入流失败");
}
}
}
读取数据2:
public void fun(){
FileReader fr=null;
char [] ch=new char[1024];
try {
fr=new FileReader("d.txt");
int len;
while((len=fr.read(ch))!=-1){
System.out.print(new String(ch,0,len));
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("读取文件失败");
}finally{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
System.out.println("关闭输入流失败");
}
}
}
字符输出流
Writer类
用来从输出流中写入数据 该类也是一个抽象性 定义了所有字节输出流,具有输出流共有的特性 其他具体的字符输出流类继承自Writer类
常用方法:
- write();向输出流写入数据 只能逐字节输出数据
- flush();在具有缓冲功能的子类对象中 强制清空缓冲区
- close():关闭输出流
写入数据1:
public void fun(){
FileWriter fw=null;
try {
fw=new FileWriter("e.txt");
fw.write("呵呵呵");
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("读取文件失败");
}finally{
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
System.out.println("关闭输入流失败");
}
}
}
写入数据2:
public void fun(){
FileWriter fw=null;
char [] ch={'和','j','1'};
try {
fw=new FileWriter("e.txt");
fw.write(ch);
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("读取文件失败");
}finally{
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
System.out.println("关闭输入流失败");
}
}
相关文章
- 暂无相关文章
用户点评