这里我们是简单的去熟悉一下字节/字符流对于文件操作,那些网络,其他的子类后面遇见了再说!
这里以文件流的方式去写的,这样比较好方便理解
字节流
字节输出流:InputStream
InutStream是一个抽象类,其他的也是。
public abstract int read() throws IOException;很重要的方法
去读取文件里面的字节,如果读到最后面就返回-1代表读完了。
返回的int的值是(0~255)这里的一个数字代表是一个字节
//把文件里面的东西输出到工作台,这里用了JDK7的特性会自动关闭流的。
//这里方法是需要抛出异常的
public void readFile() throws IOException {
try(InputStream in = new FileInputStream("文件的路径")){
//循环去读,一直到返回值是-1退出
while(true){
in.read().sout;
if(in.read()==-1)
break;
}
}
}
/*
这里有一个严重的错误他的read方法是每次读的数据流的下一个字节,你没有用变量去保存字节导致每次都的都是下下个字节
所以这里要拿一个变量去接收他 用图表示比较形象一点
上面不修改了!
*/
read的方法是有重载的,上面的方法是一个一个去读的遇见大的文件是比较慢的。
这里是可以按一个byte数组去读的,一次性可以读多个
int read(byte[] b):一次性读取一个数组的数据
int read(byte[] b, int off, int len):这个数组,oof从哪里开始读,len最读取几个
public static void readFile() throws IOException {
try(InputStream in = new FileInputStream("D:/a.txt")){
byte[] bytes = new byte[13];
int n;
//循环去读,一直到返回值是-1退出
while (( n = in.read(bytes) ) != -1){
System.out.println("read " + n + " bytes.");
}
}
}
//这里的n代表的是每次读取的字节个数,最多读取去13个
这里可以模拟一个数据去测试,不用真实存在的数据。
好像是自己模拟了一个内存空间,让我们的IO去读那个
ByteArrayInputStream可以在内存中模拟一个InputStream:
字节输入流:OutputStream
基本上同上
public abstract void write(int b) throws IOException;
是写数据到内存里面去的哦。这里的int b 是一个一个去写的。
//写一个,hello,world到D:/a.txt盘下面去。
public static void writeFile() throws IOException {
try(OutputStream out = new FileOutputStream("D:/a.txt")){
//这里注意一下,参数是数字的要转换一下
out.write("hello,world!".getBytes());
}
}
flush()方法,在调用close方法的时候会自动调用这个方法。
当我们写网络里面写数据的时候,系统不可能是这边输出一个网络发送一个。
是先输出到一个缓存里面去,然后等缓存满了在发送到网络。
相当于推动这个管道,当你的马桶堵住了就用flush()通他
字符流
字符读:Reader
这里去读的文件是字符的。
public int read() throws IOException;
这个方法读取字符流的下一个字符,并返回字符表示的int,范围是0~65535。如果已读到末尾,返回-1。
//读name.txt里面的名字打印到控制台
public static void readerFile() throws IOException {
int n;
try(FileReader red = new FileReader("D:/name.txt")){
while((n = red.read()) != -1){
//这里的n读到的是一个字符代表的数字
(char)n.sout;
}
}
}
字符写:Writer
这里就是写的,同上
Writer是所有字符输出流的超类,它提供的方法主要有:写入一个字符(0~65535):void write(int c);
写入字符数组的所有字符:void write(char[] c);
写入String表示的所有字符:void write(String s)。这里就是一个一个字符的去写
//把小明,写到name.txt文件里面
public static void readerFile() throws IOException {
try(FileWriter writ = new FileWriter("D:/name.txt")){
writ.write("小明");
}
}
//这里有一个问题,会覆盖掉前面的内容
//new FileOutputStream(writ,true); 这样就不会覆盖掉之前的数据
任务:
文件的复制
//特别简单。