每日心得
假终于放完了,不过感冒还没好,班上大部分好了吧,可是我们老师吊了两天水却还加重了,不可思议。。
java.io
I/O(Streams)流
通过数据流、序列化和文件系统提供系统输入和输出,这是文档的解释.这里有一个概念,Stream
-->流,指一种数据运送的方式,流分很多种,有字节流,字符流;这个包主要用于java-->Input&Output
与外面的程序进行输入或输出,输入与输出是相对的概念,当java
是输入方时,被输入方则是输出方,输出同理;这里又有InputStream
,OutputStream
,输入输出流.
但这其中也分同一机器,系统中的不同进程通讯使用FileInputStream
&FileOutputStream
还有不同机器即跨机器的通讯.net
InputStream(输入流抽象类)
.read();//(核心方法)只能一次读一个返回一个int,范围(0-255),如果没有字节读了,到达流的末尾,返回-1;这个方法会阻塞,只能给予三种情况,一返回一个范围内的正整数,二是返回-1,三抛出异常,超出这三种情况则会发生阻塞,代码会一直停在这里不会继续运行下去;
.read(byte b[]);//返回int,总共读到的缓冲中有多少字节数,可以几个字节一起读,缓冲即是b[];
.read(byte b[],//int off ,int len);off偏移量,指定可以在b中哪里存存多少,可能b中前面一些数据会有用,所以避免将内存占了
.skips(long l);//跳过部分不要了,已经读了,但是没有使用而已
.available();//返回int,io流中总共可以读到多少数据byte
.close();//关闭流,释放资源
.mark(int);//标记读到位置,可能需要返回来重新读取
.reset();//重置到mark的位置再往后面读
.markSupported();//返回布尔值,能否使用mark方法,有些数据无法使用mark
OutputStream(输出抽象类)
这里提到一个概念buffer
缓冲器,作一个比较(一个瓶子的数据倒入另一个瓶子,因为瓶口太小,为了方便使用漏斗,当一个瓶子数据倒完时,不一定都在另一个瓶子中,可能有些还在漏斗中,在路上,漏斗类似缓冲;)
.write(int b);//int四个字节32位,一次写一个字节,低八位,高于八位会去掉(向输出流写入一个字节。要写入的字节是参数b的八个低位.b的24个高位将被忽略。)
.write(byte[]b);//将b.length个字节从指定的byte数组写入此输出流.write(b)的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。
.write(byte[]b,int offer,int len);//与输入流概念类似
.flush();//冲刷,将路上的字节数据即缓冲器的东西直接冲入目标瓶子(直接冲到刷新此输出流并强制写出所有缓冲的输出字节)
.close();//与输入流概念一致
File文件类
通过这个类生成的对象-->某个目录或者某个目录下文件信息的封装,并不是直接指向某个文件,路径名称怎么写取决于其操作系统的不同而不同。
在这里还会有一个知识-->文件分隔符:Windows
-->反斜杠,正斜杠也识别;Linux
-->正斜杠,不识别反斜杠;所以我们一般使用正斜杠,在java
中使用反斜杠需要使用两个反斜杠表示,因为其使转义字符的原因,但正斜杠只用写一个。pathname
,路径名称;directory
,目录;file
,文件;
File file=new File("");//里面可以直接传一个路径(pathname),也可以传一个父目录(parent)与一个子目录(child)或者文件,也可以传一个uri(抽象路径名);
.canRead()//can..的各种方法,在windows中基本为true,linux中不,有权限码(可执行,可读,可写等);
.creatNewFile();//返回值为布尔值,创建一个new文件;
.creatTempFile();//返回值为布尔值,生成一个临时文件在系统的临时文件目录下;
.delete();//返回值为布尔值,不能直接删除有文件或者文件夹的文件夹,若某文件的流还未关闭,也无法删除;
相对路径:
.等于(./)表示当前文件夹..表示上一层文件夹,/代表根目录
相对于应用程序所运行的那个目录
get。。Path();//获取各种路径;
getName();//文件名称,文件夹名称;
可以获取父文件(Parent)的名称再获取其绝对路径来使用;
绝对路径:
文件在总盘上的路径;
.is..();//判断是不是路径,目录,文件是否隐藏等;
.lastModified();//返回的毫秒数,最后修改时间可以使用new Date()包装方便查看;
.length();//文件大小;
.list();//返回一个数组,子文件列表;
//文件过滤器(可以在这里面加判断,根据文件类型进行过滤,返回false则不放入ss中)
File file=new File("");
String[] ss=file.list(new FilenameFilter(){
public boolean accept(File dir,String name){
syso("name"+name);
//return false;
return name.endWith(.java);
}
});
syso(ss.length);
.mkdir();//创建当前目录;
.mkdirs();//若父目录不存在,则会一起创建,一般用这个;
.renameTo(File dest);//重新命名此抽象路径名表示的文件;
FileInputStream
File file= new File("");
FileInputSteam fis=new FileInputStream(file);
//while(true){
// int ch=fis.read();//一个一个字节读
// if(-1==ch){
// break;
//}
//syso((char)ch);
//}
byte[]buffer = new byte[1024];
while(true){
int length=fis.read(buffer);//读字节数组
if(-1==length){
break;
}
syso(new String(buffer,0,length));//可能为空,所以对有效字节进行拼接
}
fis.close();
FileOutputStream
File file= new File("");
FileOutputSteam fos=new FileOutputStream(file,true);//后面加一个true表示追加模式,不加为覆盖模式,默认为覆盖模式,写入的数据会覆盖之前写的;
fos.write(97);
fos.write(10);
fos.write(13);
fos.write(98);
fos.write("hello world
".getByes());
fos.close();
写数据时,可能会报thows FileNotFoundException,这个异常意思是下面两种情况
1、当前文件存在,但是无法打开,或者不能写入;
2、当前文件不存在,但是没办法创建;(而并不是找不到文件的异常;它是允许文件不存在,写的时候可以创建;)
作业:实现文件夹的复制,文件夹下要有多个文件夹和文件;(使用递归)
递归:两个条件-->自己调用自己,要有终止条件;
一个简单的递归实现,阶乘
f(x)=x*f(x-1);
x==1 f(1)=1;
public static int ff(int x){
if(x==1){
return 1;
}
return x*ff(x-1);
}
文件夹的复制,我找到了一篇文章十分清晰,"https://www.cnblogs.com/yuhudashen/p/7988831.html"他的代码注释十分明白,很容易看懂,思路是写了两方法一个是复制文件,一个是复制文件夹,在复制文件夹中判断文件夹里需要复制的是文件夹还是文件,再调用相应的方法,我这借用一下。我自己打了一遍:
package task;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class CopyFile {
public static void main(String[] args) throws Exception {
copy("src", "src2");
System.out.println("复制完成");
}
public static void copy(String src,String des) throws Exception{
File file1=new File(src);
File[]fs=file1.listFiles();
File file2=new File(des);
if(!file2.exists()){
file2.mkdirs();
}
for(File f:fs){
if(f.isFile()){
fileCopy(f.getPath(), des+"\"+f.getName());
}else if(f.isDirectory()){
copy(f.getPath(), des+"\"+f.getName());//文件夹复制,递归调用自己
}
}
}
//文件复制
public static void fileCopy(String src,String des) throws Exception{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(des));
int i=-1;
byte[] bt=new byte[2014];
while((i=bis.read(bt))!=-1){
bos.write(bt,0,i);
}
bis.close();
bos.close();
}
}