java笔记-File和字符流

IO:就是数据的输入输出。对于输入输出问题,java将其抽象为流对象来解决。

对于不同的输入输出问题,会有相应的流对象提供解决方案。

IO流用来处理不同设备间的数据传输。(意义在于结合网络一起用)

java中用于操作流的类都封装在IO包中。

IO流分类:

A:按操作数据不同:字节流和字符流(1字符=2字节)文件存储的基本单位是字节。

B:按数据的流向不同:输入流和输出流

用window记事本打开能读懂的就用字符流(如.TXT文件)。其他的用字节流(如图像、音频文件)


File类

File既可以表示文件也可以表示文件夹。
构造方法
File(String pathname) 根据指定的路径创建File对象( 常用
          通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

File(String parent,String child) 根据指定的父文件夹和子文件或文件夹创建File对象。
          根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

File(File parent,String child)根据指定的父文件夹对象和子文件或文件夹创建File对象
          根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。


创建功能:

创建文件:

	public boolean createNewFile()		
			throws IOException
	
 
 
如果指定的文件不存在,则创建,如果存在,则不创建
返回值:如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false

创建文件夹:

     1、创建单级目录
     public boolean mkdir();创建此抽象路径名指定的目录。
	返回:当且仅当已创建目录时,返回 true;否则返回 false 
抛出: SecurityException - 如果存在安全管理器,且其 SecurityManager.checkWrite(java.lang.String) 方法不允许创建指定的目录 2、创建多级目录
public boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。

返回:
当且仅当已创建目录以及所有必需的父目录时,返回 true;否则返回 false
抛出:
SecurityException - 如果存在安全管理器,且其 SecurityManager.checkRead(java.lang.String) 方法不允许验证指定目录和所有必需的父目录是否存在;或者 SecurityManager.checkWrite(java.lang.String) 方法不允许创建指定的目录和所有必需的父目录

创建文件不写路径名称,则以当前项目目录为路径。

绝对路径:以盘符开始的路径

相对路径:不以盘符开始的路径


删除功能:

	public boolean delete()   既可以删除文件也可以删除文件夹
删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该 目录必须为空才能删除。
java语言的删除不走回收站。
返回:
当且仅当成功删除文件或目录时,返回 true;否则返回 false
抛出:
SecurityException - 如果存在安全管理器,且其 SecurityManager.checkDelete(java.lang.String) 方法拒绝对文件进行删除访问

判断功能:

public boolean exists():判断File对象是否存在
public boolean isDirectory():判断File对象是否是文件夹
public boolean isFile():判断File对象是否是文件
public boolean isHidden():判断File对象是否隐藏
public boolean canRead():判断File对象是否可读
public boolean canWrite():判断File对象是否可写

获取功能:

public String getAbsolutePath():获取File对象的绝对路径
public String getPath():获取File对象的相对路径
public String getName():文件名称
public long length():文件大小,单位是字节
public long lastModified():返回File对象最后一次被修改的时间。 
获取的时间是long型,转换成时间的表示形式
Data d=new Data(1388307134000L);
SimpleDataFormat sdf=new SimpleDataFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(d));
public static File[] listRoots():列出可用的文件系统根目录。 
public String[] list():返回一个字符串数组,返回指定目录下的所有目录和文件的名称。 
public File[] listFiles():返回一个File对象数组,这返回指定目录下的所有目录和文件的对象。 

文件名过滤器
  
  
public interface FilenameFilter

实现此接口的类实例可用于过滤器文件名。Abstract Window Toolkit 的文件对话框组件使用这些实例过滤 File 类的 list 方法中的目录清单。 

public String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的字符串必须满足过滤器外,此方法的行为与 list() 方法相同。如果给定 filternull,则接受所有名称。否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该名称才满足过滤器。 
/*
 * 获取指定目录下指定后缀的文件名称:
 * A:先获取指定目录下所有文件或者文件夹的File数组,然后再遍历的时候进行判断。满足条件的就输出该File的名称。
 * B:直接获取指定目录下满足条件的String(File)数组。然后遍历数组即可。
 * 
 * 文件名称过滤器:FilenameFilter
 * 		public String[] list(FilenameFilter filter)
 */
public class FileDemo {
	public static void main(String[] args) {
		// 封装目录
		File file = new File("d:\\");

		// 获取满足条件的数组
		String[] strArray = file.list(new FilenameFilter() {//匿名内部类
			@Override
			public boolean accept(File dir, String name) {//dir  -->new File("d:\\");
				// 判断是否是文件,是否是以.mp4结尾
				// System.out.println(dir + "---" + name);
				File file = new File(dir, name); // d:\我的文档
				boolean flag = file.isFile();
				boolean flag2 = name.endsWith(".mp4");
				return flag && flag2;
			}
		});

		// 遍历字符串数组
		for (String str : strArray) {
			System.out.println(str);
		}
	}
}


IO流:

字节流:

字节流输入  读取数据InputStream

字节流输出  写入数据OutputStream

字符流:

字符流输入  读取数据Reader --- FileReader

字符流输出  写入数据Writer  ---FileReader


FileWriter底层自动创建文件

创建字符输出流对象做了几件事情:

A:调用系统功能创建了文件

B:创建字符输出流对象

C:把字符输出流对象指向创建的文件

字符输出流写入数据步骤:

FileWriter fw=new FileWriter("a.txt");
fw.write("hello,wrold");//写入数据
fw.flush();//刷新缓冲区
fw.close();//释放资源
为什么要close();(先刷新,再关闭,再释放资源)
1、让流对象变成垃圾
2、通知系统去释放和文件相关的资源。系统功能创建的文件,系统就会消耗资源去管理文件。
把字符流写入到文件中的步骤:

1、把字符数据存到缓冲区

2、刷新缓冲区

3、释放资源

字节流是直接写入文件中

为什么FileWriter没有无参构造方法:因为写数据一定要明确写到哪里。

flush()和close()的区别

flush():只刷新缓冲区,流对象还可以继续使用

close():先刷新缓冲区,再关闭流对象,流对象不可以继续被使用


写字符流数据的方法:

public void write(int c)写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
public void write(char[] cbuf)写入字符数组。
public abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分。
public void write(String str)写入字符串。
public void write(String str,int off,int len)写入字符串的某一部分。

写数据如何换行:

不同的操作系统对换行符的要求不一样。

Windows是:\r\n

linux:\n                       mac:\r


数据每次都把以前的数据覆盖了,如何追加写入?

修改构造方法:用FileWriter(String fileName, boolean append) ;追加写入如果文件存在不重写创建,不是追加写入,文件存在也会重新创建

FileWriter(File file)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd)
          构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName)
          根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

close()要放到fanally中。


读文件:FilrReader类

public class FileReader
   
   
    
    extends 
    
    InputStreamReader
   
   
 

用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。

FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。  

字符输入流读取数据步骤:

A:创建字符输入流对象

B:调用读取数据功能,并显示

C:释放资源

读取数据时要保证读取的文件一定存在。

读取数据:

public int read()  读取数据并自动移动到下一位。
         throws IOException
读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

用于支持高效的单字符输入的子类应重写此方法。

返回:
作为整数读取的字符,范围在 0 到 65535 之间 ( 0x00-0xffff),如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误
 read()  读取数据返回int类型,并自动移动到下一个数据位置等待读取。
数据的读取和显示操作是重复的,用循环。控制条件(如果已到达流的末尾,则返回 -1)如果数据没有了,则返回-1.

int ch=0;

while((ch=fr.read())!=-1){

System.out.println((char) ch);

}



public int read(char[] cbuf)一次读取一个字符数组     
char[]数组的长度一般定义为1024的整数倍。
throws IOException
将字符读入数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

参数:
cbuf - 目标缓冲区
返回:
读取的字符数,如果已到达流的末尾, 则返回 -1
抛出:
IOException - 如果发生 I/O 错误
如果实际读取长度是-1,那么说明已经读取到结尾了。

0-len是防止空字符显示。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值