file和io流

重要方法

1.createNewFile():创建文件 

如果文件不存在,创建文件并返回true

如果文件存在,创建文件失败并返回false

2.mkdir():创建目录

如果目录不存在,创建目录并返回true

如果目录存在,创建目录失败并返回false

3.mkdirs():创建多级目录

4.exists():测试此抽象路径名表示的文件或目录是否存在。

5.isDirectory():判断是否是目录

6.isFile():判断是否是文件

7.getAbsolutePath():获取绝对路径

8.getPath():获取相对路径

9.getName():获取名称

10.delete():删除文件和目录,如果一个目录中有内容(目录,文件),就不能直接删除。
               应该先删除目录中的内容,最后才能删除目录

//查看文件下的所有文件,包括文件子文件的子文件
public static void show(File f) {
	//获取文件下的所有文件
	File [] childs=f.listFiles();
	if(childs!=null) {
		for(int i=1;i<childs.length;i++) {
			System.out.println(childs[i].getName());
			//如果是目录继续往里面走
			if(childs[i].isDirectory()) {
				show(childs[i]);
			}
		}
	}
}
//查看文件下的文件,只查看一级。
public static void showTest(File f) {
	File[] files=f.listFiles();
	if(files!=null) {
		for(int i=1;i<files.length;i++) {
			System.out.println(files[i].getName());
		}
	}
}
public static void main(String[] args) {
	File file=new File("g:/");
	showTest(file);

}

io流

按照类型分:

                          字节流

                          字符流    (字符流数据通过Windows自带的记事本软件打开是可以读懂里面内容的)

按照流向分:

                          输入流    : 用来读取数据的:

                          输出流  : 用来写出数据的

字节流写数据的步骤:

                A:创建字节输出流对象

                B:调用写数据的方法

               C:释放资源

//如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处

FileOutputStreamfos = newFileOutputStream(f,true);

/**
 * 写出数据的三个方法:
 * public void write(int b):一次写一个字节
 * public void write(byte[] b):一次写一个字节数组
 * public void write(byte[] b,int off,int len):一次写一个字节数组的一部分
   String类中的方法
 * byte[] getBytes()  将字符串转换为字节数组
 * @throws IOException 
 * 
 */
public static void main(String[] args) throws IOException {
	//源文件,准备写入数据
	File f=new File("g:/a.txt");
	Scanner sc=new Scanner(System.in);
	StringBuilder sb=new StringBuilder();
	while(true) {
		System.out.println("请输入文件内容");
		String str1=sc.next();
		//追加到StringBuilder里面
		sb.append(str1);
		System.out.println("======输入1继续,输入0结束");
		int i=sc.nextInt();
		if(i==1) {
			continue;
		}else if(i==0) {
			break;
		}
	}
	//转化为string类型
	String str2=sb.toString();
	//将字符串转化为字节数组
	byte[] bt=str2.getBytes();
	FileOutputStream fout=new FileOutputStream(f);
	//写入
	fout.write(bt);
	fout.flush();
	fout.close();
}

1.字符流=字节流+编码表

2.字节流分为:字节输入流InputStream int read();一次读取一个字节

                                                           int read(byte[] byte);一次读取一个字节数组

                     字节输出流OutputStream void write(int by);一次写一个字节

                                                              void write(byte[] byte,int off,int len);一次写入一个字节数组,从数组的off开始,到len结束

3.字符流分为:字符输入流reader     int read();一次读取一个字节

                                                     int read(byte[] byte);一次读取一个字节数组

                    字符输出流write       void write(int by);一次写一个字节

                                                    void write(byte[] byte,int off,int len);一次写入一个字节数组,从数组的off开始,到len结束

4.转换流

    OutputStreamWriter 是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

    5种写入方式:

                        *public void write(int c):写一个字符

                        * public void write(char[] cbuf):写一个字符数组

                        * public void write(char[] cbuf,intoff,int len):写一个字符数组的一部分

                        * public void write(String str):写一个字符串

                        * public void write(String str,intoff,int len):写一个字符串的一部分


    InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

    读数据的两种方式:

                                *public int read():一次读取一个字符

                                * public int read(char[] cbuf):一次读取一个字符数组


5.字节缓冲流

BufferedInputStream继承FilterInputStream    为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

BufferedOutputStream继承FilterOutputStream该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

6. 用记事本打开并能够读懂,就用字符流,否则用字节流。
//文件复制
public static void main(String[] args) throws IOException {
	//源文件
	File oldFile=new File("d:/图片/1.jpg");
	//目标文件
	File newFile=new File("g:/1.txt");
	//创建字节输入流
	FileInputStream fis=new FileInputStream(oldFile);
	//创建字节输入缓冲流
	BufferedInputStream bis=new BufferedInputStream(fis);
	//创建字节输入流
	FileOutputStream fos=new FileOutputStream(newFile);
	//创建字节输出缓冲流
	BufferedOutputStream bos=new BufferedOutputStream(fos);
	int b;
	System.out.println("文件复制中");
	//当read方法返回-1时表示到文件末尾了
	while((b=bis.read())!=-1) {
		bos.write(b);
		System.out.println(b);
	}
       
	fis.close();
	bis.close();
        //先关闭缓冲流在关闭字节流
	bos.flush();
	bos.close();
	fos.flush();
	fos.close();
}

7.字符流:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。

分为FileWriter和FileReader是转换流的子类

8.字符缓冲流

//字符缓冲文件复制
	public static void main(String[] args) throws IOException {
		//目标文件
		File file=new File("g:/1.txt");
		File file1=new File("g:/2.txt");
		//创建字符流
		FileReader fr=new FileReader(file);
		FileWriter fw=new FileWriter(file1);
		//创建缓冲流bufferedReader
		BufferedReader br=new BufferedReader(fr);
		BufferedWriter bw=new BufferedWriter(fw);
		//创建stringbuilder 
		StringBuilder sb=new StringBuilder();
		String str="";
		//读取一行文本,通过换行 ('\n')、回车 ('\r') 或回车后直接跟着换行来判定这一行是否终止
		while((str=br.readLine())!=null) {
			bw.write(str);
			//一行结束写入一个换行(/n)
			bw.newLine();
			bw.flush();
		}
		fr.close();
		br.close();
		fw.close();
		bw.close();
		System.out.println("复制结束");
	}

BufferedWriter

                 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

                 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

                 void newLine():写入一个行分隔符,这个行分隔符是由系统决定的

BufferedReader

                 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

                可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

                String readLine():包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null


猜你喜欢

转载自blog.csdn.net/qq_40529747/article/details/79712412