《疯狂Java讲义》学习笔记(十一)输入/输出

1、File类
  • 访问文件名相关的方法
String getName():返回此File对象所表示的文件名或路径名
String getPath():返回此File对象的绝对路径
File getAbsoluteFile():返回此File对象的绝对路径
String getAbsoltePath():返回此File对象所对应的绝对路径名
String getParent():返回此File对象所对应目录的父目录名
boolean renameTo(File newName):重命名此File对象所对应的文件或目录,如果重命名成功返回true,可以用于移动文件
  • 文件检测相关的方法
boolean exists():文件或目录是否存在
boolean canWrite():文件或目录是否可写
boolean canRead():
boolean isFile():是否是文件,不是目录
boolean isDirectory():是否是目录,不是文件
boolean isAbsolute():文件或目录是否是绝对路径,跨平台,UNIX/linux/BSD的绝对路径以“/”开头,windows则以盘符开头
  • 获取常规文件信息
long lastModified():返回文件的最后修改时间
long length():返回文件内容的长度
  • 文件操作相关的方法
boolean createNewFile():当此File对象所对应的文件不存在时,新建一个新文件,成功则返回true
boolean delete():删除File对象所对应的文件或路径
static File createTempFile(Strng prefix,String suffix):
static File createTempFile(String prefix,String suffix,File directory)
void deleteOnExit():注册一个删除钩子,指定当Java虚拟机退出时,删除File对象所对应的文件和目录
  • 目录操作相关的方法
boolean mkdir():创建文件夹,成功则返回true
String[] list():列出所有文件名和路径名
File[] listFiles():列出所有子文件和路径
static File[] listRoots():列出系统所有的根路径
  • 文件过滤器
File file = new File("");
file.list((dir,name)->name.endsWith(".java")||new File(name).isDirectory());
2、流的分类
  • 输入流和输出流
    输入流:只能从中读取数据,不能写入数据
    输出流:只能向其写入数据,不能读取数据
  • 字节流和字符流
    字节流和字符流的用法几乎完全一样,区别在于两者所操作的单元不同,字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符
    字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类
  • 节点流和处理流
    可以从/向一个特定的IO设备读/写数据的流,称为节点流,也叫低级流
    处理流用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能,也叫高级流
3、节点流和处理流(如果要输入/输出二进制内容使用字节流,如果输入/输出文本内容则是用字符流)
  • 字节流(最小数据单元是8位的字节byte)InputStream和OutputStream
int read()读取单个字节
int read(byte[] b)读取最多b.length个字节
int read(byte[] b,int offset,int len)读取最多len个字节,从offset开始
void write(int i)指定字节/字符到输出流
void write(byte[] b)读取最多b.length个字节到输出流
void write(byte[] b,int offset,int len)读取最多len个字节到输出流,从offset开始
  • 字符流(最小数据单元是16位的字符char)Reader和Writer
int read()读取单个字节
int read(char[] c)读取最多b.length个字符输出流
int read(char[] c,int offset,int len)读取最多len个字符,从offset开始
void write(int i)指定字节/字符到输出流
void write(char[] c)读取最多b.length个字符
void write(char[] c,int offset,int len)读取最多len个字符到输出流,从offset开始
  • 可以用字符串替代字符数组
void write(String str)
void write(String str,int offset,int len)
InputStream和Reader是抽象类,要用过FileInputStream和FileReader进行实例化
  • 可以通过判断来识别以防阻塞:if(in.available()>0){in.read(new byte[in.available])}
4、节点流与处理流

节点流:程序和数据源之间的直接访问读写,也称为低级流
处理流(包装流):对已存在的流进行封装,使得程序与数据源隔离,不会直接被访问,更好进行插拔置换数据源,提高性能

5、转换流(字节流转成字符流)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

6、推回流(推回缓冲区,重新再读,优先读取刚被退回的内容)

PushbackInputStream和PushbackReader

7、重定向标准输入/输出

平时使用System.out.println()会打印到屏幕
使用System.setOut(new PrintStream(new FileOutputStream(“out.txt”)))可以输出到out.txt文件中

8、读取大文件
// 文件流
Scanner sc = new Scanner(new FileInputStream("in.txt"),"utf-8");
while(sc.hasNextLine()){
   String line = sc.nextLine();
}
// Apache Commoms IO
LineIterator it = FileUtils.lineIterator(file,"utf-8");
while(it.hasNext()){
   String line = it.nextLine();
}
9、序列化(把对象编程二进制的过程)

序列化机制是JavaEE平台的基础,建议每个JavaBean类都序列化

new ObjectOutputStream(new FileOutputStream("")).writeObject(new Person());
Person per = (Person)new ObjectInputStream(new InputStream("")).readObject();

同一个对象只会序列化一次,如果已经被序列化过,则只会返回序列化编号
使用writeObject写入一个对象,然后修改属性,程序只认第一个对象

10、RandomAccessFile

可以任意位置访问,raf.seed(位置)
mode
r代表只读
rw代表读取、写入,如果文件不存在则尝试创建
rws代表读取、写入,需要同步更新文件和元数据,一次写入文件
rwd代表读取、写入,同步更新内容,不同步更新元数据

11、常用流组合
new BufferedInputStream(new FileInputStream(""));
new BufferedReader(new FileReader(""));
new BufferedRead(new InputStreamReader(new FileInputStream("")));
12、对象复制

浅复制:被引用对象只复制引用
深复制:被应用对象也被复制

13、NIO
Buffer0<=mark<=positon<=limit<=capacity)
容量capacity
界限limit
位置position
flip:从Buffer中取出数据做好准备
clear:向Buffer中装入数据做好准备
Channel
Channel可以直接将指定文件的部分或全部映射成Buffer
程序不能直接访问Channel,必须先用通过Buffer取出数据
获取Channel
InputStream.getChannel()
OutputStream.getChannel()
RandomAccessFile.getChannel()
14、映射成Buffer
MappedByteBuffer buffer = new FileInputStream(new File("in.txt")).getChannel().map(FileChannel.MapMode.READ_ONLY,0,new File("in.txt").length)
15、文件锁
非阻塞:FileLock lock = channel.tryLock();lock.release();
阻塞:FileLock lock = channel.lock();lock.release();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值