JAVA 基础知识整理-16 递归,IO流,FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream

1. 递归
方法定义中调用方法本身的现象叫递归。

注意:
1)递归一定要有出口,否则就是死递归
2)递归层数不能太深,否则就会内存溢出
3)构造方法中不能使用递归

使用递归获取指定目录下以.jpg和。JPG结尾的文件的绝对路径:

public class GetAbsoPathByRecursion {
	public static void main(String[] args) {
		//获取指定目录下以.jpg和。JPG结尾的文件的绝对路径
		String path = "D:\\2ND SHOW\\1ST\\";
		File f= new File(path);
		getAbsolutePath(f);
	}
	
	public static void getAbsolutePath(File f){
		File[] filelist = f.listFiles(new FilenameFilter (){			
			@Override
			public boolean accept(File dir, String name) {
				File f = new File(dir,name);
				boolean flag1= f.isFile();
				boolean flag2 = f.getName().endsWith(".jpg")||f.getName().endsWith(".JPG");
				return !flag1|flag2;
			}			
		});
		for(File file:filelist ){
			if(file.isFile()==true){
				System.out.println(file.getAbsolutePath());
			}else{
				getAbsolutePath(file);
			}
		}
		
	}

2. IO流
字节流:
输入流(InputStream):将硬盘中的内容读取到java虚拟机中
输出流(OutputStream):向硬盘中写入内容

字符流
输入流(Reader):将硬盘中的内容读取到java虚拟机中
输出流(Writer):向硬盘中写入内容

注:
如果操作的数据是文本数据,就用字符流。
(把要操作的文件用windows记事本打开,打开后如果不是乱码就可以使用字符流)否则就用字节流。如果不能判断也用字节流。

3. 字节输入流FileInputStream
A FileInputStream从文件系统中的文件获取输入字节。 什么文件可用取决于主机环境。
FileInputStream用于读取诸如图像数据的原始字节流。 要阅读字符串,请考虑使用FileReader 。

构造方法:

FileInputStream(File file)

FileInputStream(FileDescriptor fdObj)

FileInputStream(String name)

方法:
int available()
返回从此输入流中可以读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
void close()
关闭此文件输入流并释放与流相关联的任何系统资源。
protected void finalize()
确保当这个文件输入流的 close方法没有更多的引用时被调用。
FileChannel getChannel()
返回与此文件输入流相关联的唯一的FileChannel对象。
FileDescriptor getFD()
返回表示与此 FileInputStream正在使用的文件系统中实际文件的连接的 FileDescriptor对象。
int read()
从该输入流读取一个字节的数据。
int read(byte[] b)
从该输入流读取最多 b.length个字节的数据为字节数组。
int read(byte[] b, int off, int len)
从该输入流读取最多 len字节的数据为字节数组。
long skip(long n)
跳过并从输入流中丢弃 n字节的数据。

public class FileInputOutPutStream {
	public static void main(String[] args) throws IOException {
		File  f= new File("a.txt");
		FileInputStream fis = new FileInputStream("a.txt");
		int by;
		while((by=fis.read())!=-1){//如果文件中没有更多内容就会返回-1
			System.out.print((char)by);//by 对应的是字节编码,要强转为char类型再输出
		}
		fis.close();
	}
}
输出:
sdhgryb
grh
??
?±
·?
thghvh
gff
hfda

a.txt

asadbhegwrhygb
fghrehg
中国
日本
法国
trhegbhbvgh
hgefrfr
hvfgdva

调用过程:
1)创建字节输入流对象
2)读取数据
3)关闭文件输出流并释放与此流有关的所有系统资源。(调用close()让流对象变成垃圾,这样就可以被垃圾回收器回收;通知系统去释放跟该文件相关的资源。)

4. 字节输出流FileOutputStream
文件输出流是用于将数据写入到输出流File或一个FileDescriptor 。 文件是否可用或可能被创建取决于底层平台。 特别是某些平台允许一次只能打开一个文件来写入一个FileOutputStream (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
FileOutputStream用于写入诸如图像数据的原始字节流。 对于写入字符流,请考虑使用FileWriter 。

构造方法:

FileOutputStream(File file)

FileOutputStream(File file, boolean append)

FileOutputStream(FileDescriptor fdObj)

FileOutputStream(String name)

FileOutputStream(String name, boolean append)
设置参数boolean append = true可以选择从文件末尾添加文件。

方法:

void close()
关闭此文件输出流并释放与此流相关联的任何系统资源。
protected void finalize()
清理与文件的连接,并确保当没有更多的引用此流时,将调用此文件输出流的 close方法。
FileChannel getChannel()
返回与此文件输出流相关联的唯一的FileChannel对象。
FileDescriptor getFD()
返回与此流相关联的文件描述符。
void write(byte[] b)
将 b.length个字节从指定的字节数组写入此文件输出流。
void write(byte[] b, int off, int len)
将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。
void write(int b)
将指定的字节写入此文件输出流。

public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("a.txt",true);//设置从文件末尾添加数据
		fos.write("helloword\n".getBytes());
		fos.close();
		
	}
	

a.txt

hellowordhellowordhelloword
helloword
helloword

复制文件案例:

public class FileCopier {
	public static void main(String[] args) {
		try {
			fileCopier("E:\\file\\java files\\testdemo\\src\\testdemo\\ArrayListDemo.java", "a.txt");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void fileCopier(String oldfile, String newfile) throws IOException{
		FileInputStream fis = new FileInputStream(oldfile);
		FileOutputStream fos = new FileOutputStream(newfile,true);
		int oldcontent;
		while((oldcontent = fis.read())!=-1){
			fos.write(oldcontent);//系统自己会做转换(所以加(char)和不加都一样)
		}
		fis.close();
		fos.close();
	}
}

5. 字节缓冲输入流BufferedInputStream

A BufferedInputStream为另一个输入流添加了功能,即缓冲输入和支持mark和reset方法的功能。 当创建BufferedInputStream时,将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节。 mark操作会记住输入流中的一点,并且reset操作会导致从最近的mark操作之后读取的所有字节在从包含的输入流中取出新的字节之前重新读取。

构造方法 :

BufferedInputStream(InputStream in)
创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。
BufferedInputStream(InputStream in, int size)
创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。

方法:
int available()
返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
void close()
关闭此输入流并释放与流相关联的任何系统资源。
void mark(int readlimit)
见的总承包 mark的方法 InputStream 。
boolean markSupported()
测试这个输入流是否支持 mark和 reset方法。
int read()
见 read法 InputStream的一般合同。
int read(byte[] b, int off, int len)
从给定的偏移开始,将字节输入流中的字节读入指定的字节数组。
void reset()
见 reset法 InputStream的一般合同。
long skip(long n)
见 skip法 InputStream的一般合同。

6. 字节缓冲输出流BufferedOutputStream

该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。

构造方法 :

BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。

方法:

void flush()
刷新缓冲输出流。
void write(byte[] b, int off, int len)
从指定的字节数组写入 len个字节,从偏移 off开始到缓冲的输出流。
void write(int b)
将指定的字节写入缓冲的输出流。

复制文件案例:

public static void main(String[] args) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\EX\\JPO118.pdf"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\jpo118.pdf"));
		byte[] bys = new byte[1024];
		int len = 0;
		while((len = bis.read(bys))!=-1){
			bos.write(bys,0,len);
		}
		bis.close();
		bos.close();		
	}
public static void main(String[] args) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\EX\\JPO119.pdf"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\jpo119.pdf"));
		int c = 0;
		while((c = bis.read())!=-1){
			bos.write(c);
		}
		bis.close();
		bos.close();
	}
发布了55 篇原创文章 · 获赞 0 · 访问量 2068

猜你喜欢

转载自blog.csdn.net/KathyLJQ/article/details/105027129