Java第三阶段学习(二、IO流--------递归,字节流Stream)
一、递归
定义:指方法在方法内调用自己
适用于方法的运算主体不变,但运行的时候,参与运算的方法参数会变化
注意:一定要给递归一个出口,否则内存溢出
练习题1:使用递归打印文件夹中所有的文件,包含子目录中的文件
public static void main(String[] args) {
File f=new File("e:\\java");
getAllFile(f);
}
public static void getAllFile(File f){
File[] file=f.listFiles();
for(File f1:file){
if(f1.isDirectory()){
getAllFile(f1); //如果判断为文件夹,则再次调用方法,一直到没有子目录结束
}else{
System.out.println(f1); //打印就是相当于 这个递归方法的出口
}
}
}
练习题2:使用递归搜索指定目录中的.java文件(包含子目录)
创建一个自定义过滤器类,用来选择.java文件:
import java.io.File;
import java.io.FileFilter; public class MyFileter implements FileFilter { @Override
public boolean accept(File pathname) {
if(pathname.isDirectory()){
return true;
}
//将文件名称全部转小写
return pathname.getName().toLowerCase().endsWith(".java");
} }
在主方法使用递归,并打印:
public static void main(String[] args) {
// TODO Auto-generated method stub
File file=new File("e:\\java");
getFile(file);
}
public static void getFile(File file){
//new MyFileter() 是listFiles调用的
File[] files=file.listFiles(new MyFileter());
for(File f:files){
if(f.isDirectory()){
getFile(f);
}else{
System.out.println(f);
}
}
}
二、字节流Stream
2.1字节输出流 OutputStream
OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。
输出流中定义都是写write方法,如下图:
2.2FileOutputStream类(文件输出流)
OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。
FileOutputStream类,即文件输出流,是用于将数据写入 File
的输出流。
构造方法: FileOutputStream fos=new FileOutputStream("文件的路径");
续写和换行:
续写:因为直接写入的时候会覆盖原有的文件,所以如果想要续写,就需要在路径后面加上true
代码:FileOutputStream fos=new FileOutputStream("文件的路径",true);
换行:"\t\n",在存在续写代码的前提下,加入代码即可实现换行
2.3 IO流异常的处理
代码演示:
package com.oracle.Demo02; import java.io.FileOutputStream;
import java.io.IOException; public class Demo02 {
//续写和换行
//FileOutputStream fos=new FileOutputStream(file,true); 续写加个true
//在字符串后面加上 \r\n 就可以换行了
//处理IO异常
//1.保证你的对象变量作用域足够
//2.catch块里面怎么处理异常
// (IOException一般不能处理)throw new RuntimeException
//3.流对象建立失败,还需要关闭资源吗?
// 不需要,加一个if(fos!=null)的判断close
public static void main(String[] args){
FileOutputStream fos=null;
try{
fos=new FileOutputStream("e:\\java\\output.txt",true);
fos.write("abcd\r\n".getBytes()); //将字符串转为字节数组
}catch(IOException ex){
throw new RuntimeException("文件异常");
}finally{
try{
if(fos!=null){
fos.close();
}
}catch(IOException ex){
throw new RuntimeException("文件关闭异常");
}
}
} }
2.4 字节输入流InputStream
把硬盘中的数据读取到内存中,通过InputStream可以实现,InputStream此抽象类,是表示字节输入流的所有类的超类。定义了字节输入流的基本共性功能方法。
方法:int read():读取一个字节并返回,没有字节返回-1.
int read(byte[]): 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。(字节数组的方式)。
2.5 FileInputStream类(文件输入流)
InputStream有很多子类,其中子类FileInputStream可用来读取文件内容。
FileInputStream 从文件系统中的某个文件中获得输入字节。
构造方法:FileInputStream fis=new FileInputStream("文件的路径");
2.6 FileInputStream类读取数据read方法
在读取文件中的数据时,调用read方法,实现从文件中读取数据
在读取文件中的数据时,调用read方法,每次只能读取一个,太麻烦了,于是我们可以定义数组作为临时的存储容器,这时可以调用重载的read方法,一次可以读取多个字符。
代码演示:
package com.oracle.Demo02; import java.io.FileInputStream;
import java.io.IOException;
//用数组的方式读文件,并且只打印有效的字符
public class Demo05 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis=new FileInputStream("e:\\java\\output.txt");
int len=0;
byte[] bytes=new byte[3];
while((len=fis.read(bytes))!=-1){ //len是有效长度
System.out.print(new String(bytes,0,len)); //只打印有效长度的字符,并转为字符串
}
fis.close(); } }
练习题:
1.用普通方法复制文件:
package com.oracle.Demo02; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; //复制文件的方法 copy
public class Copy { public static void main(String[] args) throws IOException {
long time1=System.currentTimeMillis();
//1.从数据源获取目标文件
FileInputStream fis=new FileInputStream("e:\\study\\eclipse.zip");
//2.确定目的地
FileOutputStream fos=new FileOutputStream("e:\\java\\aaa\\eclipse.zip");
//3.读取后写入
int len=0;
while((len=fis.read())!=-1){
fos.write(len);
}
//释放资源
fis.close();
fos.close();
long time2=System.currentTimeMillis();
System.out.println((time2-time1)/1000+"秒"); } }
2.用缓冲字节数组的方法复制文件:
package com.oracle.Demo02; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; //快速复制文件
public class Copy2 { public static void main(String[] args) throws IOException {
long time1=System.currentTimeMillis();
//1.获取数据源
FileInputStream fis=new FileInputStream("e:\\java\\output.txt");
//2.获取目的地
FileOutputStream fos=new FileOutputStream("e:\\java\\aaa\\output.txt");
//3.读取后写入
byte[] bytes=new byte[1024]; //通过一个字节数组,一次性读,再一次性写
int len=0;
while((len=fis.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
fis.close();
fos.close();
long time2=System.currentTimeMillis();
System.out.println((time2-time1)/1000);
} }
Java第三阶段学习(二、IO流--------递归,字节流Stream)的更多相关文章
- Java第三阶段学习(五、流的操作规律、Properties流、序列化流与反序列化流、打印流、commons-IO jar包)
一.流的操作规律 四个明确: 明确一:明确要操作的数据是数据源还是数据目的地 源:InputStream Reader 目的地:OutputStream Writer 先根据需求明确是要读还是写 ...
- Java第三阶段学习(四、缓冲流)
一.缓冲流: Java中提供了一套缓冲流,它的存在,可提高IO流的读写速度 缓冲流,根据流的分类分为:字节缓冲流与字符缓冲流. 二.字节缓冲流: 字节缓冲流根据流的方向,共有2个: 1.写入数据到流中 ...
- Java第三阶段学习(八:网络通信协议、UDP与TCP协议)
一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...
- java写文件读写操作(IO流,字节流)
package copyfile; import java.io.*; public class copy { public static void main(String[] args) throw ...
- Java第三阶段学习(一、IO流------File类)
一.IO概述: 把内存中的数据存入到硬盘(持久化设备)中叫做:输出(写)Output操作.JAVA软件往电脑硬盘上走叫输出. 把硬盘中的数据读取到到内存里叫做:输入(读)Input操作.电脑硬盘上往J ...
- Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)
一.HttpServletRequest 1.概述: 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...
- Java第三阶段学习(三、字符流、转换流)
一.字节流读取中文时出现的问题: 文件中有中文时,用字节流读取会出现乱码的问题,因为一个中文为两个字节. 二.字符编码表 编码表:其实就是生活中字符和计算机二进制的对应关系表. 1.ascii: 一个 ...
- Java第三阶段学习(九、类加载器、反射)
一.类加载器 1.类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.1 加载: 就是指将class文件读入内存,并为之自动 ...
- Java第三阶段学习(十三、会话技术、Cookie技术与Session技术)
一.会话技术 1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的. 2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
随机推荐
- vue项目post请求405报错解决办法。
步骤一: 确定ajax语法没有错误. 步骤二: 与后台对接确认请求是否打到nginx上? 步骤三: 检查nginx是否配置了事件转发,比如我们的接口是在,当前地址的8100端口上,并且接口地址上有v1 ...
- RabbitMQ基础篇
介绍 RabbitMQ 是一个消息中间件:它接收并转发消息.您可以把它想象为一个邮局:当您把需要寄出的邮件投递到邮箱,邮差最终会把邮件送给您的收件人.在这个比喻中,RabbitMQ 就是一个邮箱,也可 ...
- sparse representation 与sparse coding 的区别的观点
@G_Auss: 一直觉得以稀疏为目标的无监督学习没有道理.稀疏表示是生物神经系统的一个特性,但它究竟只是神经系统完成任务的副产物,还是一个优化目标,没有相关理论,这里有推理漏洞.实际上,稀疏目标只能 ...
- Spyder code editor里的小秘密: 右侧高亮提示
Spyder code editor里的小秘密: 右侧高亮提示 在spyder环境里, 混了那么长时间了. 可是对其代码编辑器右侧紧贴滚动条的高亮指示区, 还没有弄明白. 今天仔细研究和观察了一下, ...
- 【Swift】UILabel的简单操作方法
@IBAction func buttonClick_LabelCtrl(sender: AnyObject) { //定义CGRect来初始化UILable var frame: CGRect = ...
- HDU 2095 find your present (2) 动态链表
解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数. 看起来好像很简单的样子,不过,这题的重点不在这 ...
- Anaconda+django写出第一个web app(四)
前面对Models有了一些了解,今天开始进一步了解Views,了解Views如何和Models交互以及了解模板(templates). 打开main文件夹下的views.py,重新编写homepage ...
- windebug常用命令
使用~查看所有线程 切换到一号线程:~1s 查看所有线程的托管堆栈 ~* e!clrstack 怎么查看,当前线程下,变量的信息? 对于托管代码而言,最核心的命令就是!do(dump object的 ...
- [转]CNN目标检测(一):Faster RCNN详解
https://blog.csdn.net/a8039974/article/details/77592389 Faster RCNN github : https://github.com/rbgi ...
- 20165227 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20165227 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:朱越 学号:20165227 指导教师:娄 ...