大佬的理解->《Java IO(三) -- 字节流》
| FileInputStream(String name) |
|---|
| FileInputStream(File file) |
//直接通过文件地址初始化FileInputStream fis = new ileInputStream("D:/test/test1.txt");//通过File对象初始化File file = new File("D:/test/test1.txt");FileInputStream fis = new FileInputStream(file)available()
FileInputStream fis = new ileInputStream("D:/test/test1.txt");fis.available(); //文件大小| read() | 读取一个字节(返回对应字节的ascii码值) |
|---|---|
| read(byte b[]) | 根据字节缓冲数组的长度,进行读取(返回读取的字节数) |
read()
//文件 D:/test/test1.txt 内容KH96abcdefghijkFileInputStream fis = new ileInputStream("D:/test/test1.txt"); while (true){ //read() 方法:从输入流对象中,一次读取一个字节(返回的是对应字节的ascii码值,int类型) int hasRead = fis.read(); //当读取到末尾,返回-1,代表文件读取结束 if(hasRead == -1){ break; } System.out.print((char) hasRead); //打印文件中字符的ascii值 //转化为字符:KH96abcdefghijk } //最后一定要关闭资源 fis.close();运行结果:
源文件的大小:15KH96abcdefghijkread(byte b[])
带缓冲字节数,读取文件内容,一次读取就不是一个字节,而是根据字节缓冲数组的长度,进行读取错误案例
读取时通过read()来判断是否继续循环,读取到错误值
FileInputStream fis = new ileInputStream("D:/test/test1.txt");//带缓冲字节数,根据字节缓冲数组的长度,进行读取byte[] bytes = new byte[5];//容易出错的判断方式:read()方式执行一次,就读取一个字节(没有保存,读完就扔,字节丢失),不可以作为判断条件while(fis.read() != -1){ //循环读取内容 //带缓冲数组的读取,方法返回的是读取的字节数,不是读取的内容 //每次读取的数据,是由缓冲字节数组长度决定,每次都是从上一次读取的位置后开始继续读取,每次都是将读取的内容依次放入缓存数组 int hasRead = fis.read(bytes); System.out.println("读取的字节数:"+hasRead); System.out.println(new String(bytes)); System.out.println("读取文件成功");}fis.close();运行结果:
源文件的大小:15读取的字节数:5H96ab //K丢失读取文件成功读取的字节数:5defgh //c丢失读取文件成功读取的字节数:2jkfgh //i丢失,并且还多出了上一次留下 dgh,这是因为没有读满缓冲字节数组,而造成的读取上一次的值读取文件成功正确案例
因为带字节缓冲数组返回的时读取到的长度,所以,用读取到的长度来判断是否要继续读取,和要写入多少个字节
FileInputStream fis = new ileInputStream("D:/test/test1.txt");//带缓冲字节数,根据字节缓冲数组的长度,进行读取byte[] bytes = new byte[5];//正确写法int hasRead = 0;while((hasRead = fis.read(bytes)) > 0){ //每次读取的内容 System.out.println(new String(bytes,0,hasRead));}fis.close();运行结果:
源文件的大小:15KH96abcdefghijk// 没有丢失字节close();
? 在使用流资源的时候一定要关闭资源,否则会造成资源浪费;
放在try( ) 里面
? JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源;
| FileOutputStream(File file) |
|---|
| FileOutputStream(File file, boolean append) |
| FileOutputStream(String name) |
| FileOutputStream(String name, boolean append) |
与FileInputStream类似,不过写入的文件不一定要存在,如果文件不存在,会自动创建一个空的文件;
boolean append 使用否以追加方式方式写入;
false(默认值,覆盖)true(追加)| write(byte b[]) |
|---|
| write(byte b[], int off, int len) |
String string = "KH96班,正在学习文件输出流,输出文件2";//File file = new File("D:/test/test2.txt");//JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源,推荐使用;try(FileOutputStream fos = new FileOutputStream("D:/test/test2.txt",true)){ //将字符串转成字节数组,写入目标文件 fos.write(string.getBytes()); //手动刷新缓冲区 fos.flush(); }catch (IOException e){ e.printStackTrace();}