大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于java.io包中,称为IO(输入输出)流。
IO流有很多种,按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同又可分为输入流和输出流,程序从输入流中读取数据,向输出流中写入数据,具体分类如图所示。
字节流 | 字符流 |
---|---|
输入流、输出流 | 输入流 、输出流 |
java.io.InputStream 、 java.io.OutputStream | java.io.Reader 、java.io.Writer |
字节流可以读取任意数据
字符流是为了更加方便文本的读写
表中列举了InputStream的四个常用方法。前三个read()方法都是用来读数据的,其中,第一个read()方法是从输入流中逐个读入字节,而第二个和第三个read()方法则将若干字节以字节数组的形式一次性读入,从而提高读数据的效率。在进行IO流操作时,当前IO流会占用一定的内存,由于系统资源宝贵,因此,在IO操作结束后,应该调用close()方法关闭流,从而释放当前IO流所占的系统资源。
file对象:java里面关于文件和目录的操作类
package cn.csdn.io;
import java.io.File;
import java.io.IOException;
/**
* 字符流对文件数据的读取
*
* 任务一:在目录中建立目录或者文件=====》映射为一个java的file对象
* @author Administrator
*
*/
public class StreamDemo {
public static void main(String[] args) throws IOException {
//这里实例化一个对象,操作这个就相当于操作目录
File file=new File("MyDir//file.txt");//构造方法
//如果存在就不重新创建
System.out.println("文件存在吗:"+file.exists());
//如果不存在,就开始创建
if(!file.exists())
file.createNewFile();
//对元数据访问
//值得注意的是:file数据只能增加、删除操作以及读取元数据,不能读写数据
System.out.println("文件名字:"+file.getName());
System.out.println("文件路径:"+file.getPath());
System.out.println("文件的最后一次访问时间"+file.lastModified());
//对file操作写的功能
FileWriter fileWriter=new FileWriter(file);
fileWriter.write("aabbcc");
//由于操作系统的原因,我们是要写下缓存里面,写的数据要在关闭后才可以写入
fileWriter.close();
/**
* 读出来
*/
FileReader fileReader=new FileReader(file);
char[] c=new char[20];
fileReader.read(c);
System.out.println(new String (c));
}
为什么数据存储分开在容器里面,但是数据读写要放在流里面:其实就是一种分而治之的思想。存储数据的容器可以有很多,每一种数据都要写一个数据的读写程序不是一个很耗费时间和尽力的事情吗?
下面是字节流的操作
package cn.csdn.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 字节流对文件数据的读取
*
* @author Administrator
*
*/
public class StreamDemo {
public static void main(String[] args) throws Exception {
File file=new File("MyDir//file.txt");//构造方法
//如果存在就不重新创建
System.out.println("文件存在吗:"+file.exists());
//如果不存在,就开始创建
if(!file.exists())
file.createNewFile();
//创建一个文件读写流
FileInputStream in=new FileInputStream("MyDir\\file.txt");
int i=0;//用来记录字节数目
while(true) {
i=in.read();
//如果读到末尾的时候,返回的是-1,就要结束循环
if(i==-1)
break;
//开始打印数据-打印的是数据的ascll码
System.out.println(i);
}
}
}
下面介绍FileInputString和FileOutputString两个实现类
package cn.csdn.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* 字节流对文件数据的读取
*
* @author Administrator
*
*/
public class StreamDemo {
public static void main(String[] args) throws Exception {
File file=new File("MyDir//file.txt");//构造方法
//如果存在就不重新创建
System.out.println("文件存在吗:"+file.exists());
//如果不存在,就开始创建
if(!file.exists())
file.createNewFile();
//创建一个文件输入流-就是把文件里面的字节输入到当前程序
FileInputStream in=new FileInputStream("MyDir\\file.txt");
int i=0;//用来记录字节数目
while(true) {
i=in.read();
//如果读到末尾的时候,返回的是-1,就要结束循环
if(i==-1)
break;
//开始打印数据-打印的是数据的ascll码
System.out.println(i);
}
//创建一个文件输出流-就是把文件缓冲区的字节写入文件里面
/**
* 这样有一个弊端就是:文件的内容只能被覆盖,不能被在原来基础上实现继续写数据
*/
FileOutputStream out =new FileOutputStream("MyDir\\file.txt");
String str="sssssss";
byte [] b=str.getBytes();
for (int j = 0; j < b.length; j++) {
out.write(b[j]);
}
out.close();
/**
* 将数据用追加的形式来写数据
*/
//构造方法的重载
FileOutputStream out1 =new FileOutputStream("MyDir\\file.txt",true);
String str1="eeee";
byte [] b1=str1.getBytes();
for (int k = 0; k < b1.length; k++) {
out1.write(b[k]);
}
out1.close();
}
}