Java - I/O

File类

  •  java.io

 操作文件和目录,与平台无关。具体的常用实例方法

File file = new File(".");    //  以当前路径创建名为 "." 的 File 对象

·   文件目录信息函数
    -String getName/Path/Parent(): 文件名/路径/父目录
    -boolean renameTo(File newName):文件/目录重命名
    -long length():文件内容长度
    -long lastModified():文件最后编辑时间
·   文件检测函数
    -boolean exists():判断文件/目录是否存在
    -boolean isFile/isDirectory():判断是否为文件/目录
    -boolean canRead/Write():是否可读/写
    -boolean isAbsolute():文件/目录是否绝对路径
·   文件目录操作函数
    -boolean creatNewFile():新建 File 对象对应的文件
    -boolean mkdir():创建 File 对象对应的目录
    -boolean delete():删除文件/目录
    -void deleteOnExit():JVM 退出时,删除文件/目录
    -String[] list():返回 File 对象的所有子文件名和路径名
    -File[] listFiles():返回 File 对象的所有子文件和路径

·文件过滤器
 利用File类的String[] list(FilenameFilter filter)方法,过滤得到指定类型的文件/目录,必须重写accept方法。具体应用步骤
  ζ   实现FilenameFilter接口
  ζ   实现boolean accept(File dir, String name)方法;  
由于FilenameFilter是函数式接口,Lambda表达式可直接作为入参。
参考 :FilenameFilter 介绍;

·RandomAccessFile类
   Java输入-输出体系中功能最丰富的文件内容访问类(局限性是只能读写文件,不能读写IO流),提供"随机访问"方式,支持追加文件内容、自由定义记录指针位置:
   -long getFilePointer():返回文件记录指针当前位置;
   -void seek(long pos):文件记录指针定位到pos处;
注意,定点插入数据需要先缓存插入点之后的数据,然后追加新数据,最后还原缓存的数据。RandomAccessFile类可以实现多线程断点下载/传输工具。

Files类

  •  java.io.file

 File类的工具类,高度封装,支持文件复制、读写文件、遍历文件和子目录,Java-8支持Stream API操作文件目录和文件内容。

 ·   文件复制

Files.copy(Path source, Path target, CopyOption options);  // 文件到文件
Files.copy(InputStream in, Path target, CopyOption options);   // 输入流到文件
Files.copy(Path source, OutputStream out);   // 文件到输出流

 ·   读写文件

Files.write(Path src, List<string> strList);  // 将字符串内容写入文件
Files.list(Path path);  // 列出path目录下的所有文件和子目录
Files.lines(Path src);  // 列出文件中所有行

 ·   遍历文件和目录

// 遍历startPath路径下所有文件和子目录,并会“触发”FileVisitor中的相应方法
Files.walkFileTree(Path startPath, FileVisitor<? super Path> visitor);
Files.walkFileTree(Path startPath, Set<File VisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);  

I/O 流

 流(stream)是从起源(source)到接收(sink)的有序数据,允许Java程序以相同的方式访问不同的输入/输出源。Java通过装饰器模式将底层节点流(低级流)封装成上层处理流(高级流),统一对不同数据源的访问,灵活方便、执行效率高。利用文件过滤器和I/O流可以实现文件的条件复制。流模型的功能体现
· 性能提高:以增加缓冲的方式提高I/O效率
· 操作便捷:提供不同的流处理方法,灵活性; 
 Java-I/O的4个抽象基类
·   输入流: InputStream字节流 - Reader字符流,
  ζ  int read():读取单字节/单字符,返回int型字节/字符数据;
  ζ  int read(byte/char[] b): 字节/字符数组;
  ζ  int read(byte/char[] b, int pos, int len):字节/字符数组;
·   输出流:OutputStream字节流 - Writer字符流
  ζ  void write(int v):将字节/字符数据v写入到输出流中;
  ζ  int write(byte/char[] b)-(String str):字节/字符数组 - 字符串;
  ζ  int write(byte/char[] b, int pos, int len)-(String str, int pos, int len):字节/字符数组 - 字符串;
 字节流比字符流适应范围广,但字符流操作方便,文本文件推荐字符流,二进制文件推荐字节流。流的处理依靠隐式的记录指针
   ζ  void mark(int pos):标记记录指针当前位置;
   ζ  void reset():记录指针复位; 
   ζ  long skip(long n):记录指针前移n个字节/字符;
 节点流直接以物理IO节点为构造器参数,处理流以已存在的流为构造器参数。System.out是输出处理流PrintStream的实例,System.in是输入节点流InputStream的实例。
    其他的流
[1].转换流InputStreamReader/OutputStreamWriter
   处理流,将字节流单向转换为字符流。

[2].推回输入流PushbackInputStream/Reader
   处理流,利用推回缓冲区,其方法unread()可以重复读取刚刚读取的内容。

[3].缓冲流BufferedInput/OutputStream-BufferedReader/Writer
   处理流,结合flush()方法实现缓冲功能。其方法readLine()用于读取行。

[4].对象流ObjectInput/OutputStream
   处理流,实现对象的序列化。

[5].管道流PipedInput/OutputStream-PipedReader/Writer
   节点流,实现进程间通信。

  其他的如处理文件、数组、字符串的流均为节点流。
    标准流重定向:将System.in/out重定向到相应位置;
   static void setIn/Out/Err(InputStream in/PrintStream out/PrintStream err);

 此外,Runtime.getRuntime().exec("文件名")启动子进程,JVM可以利用返回的Process对象读写子进程的数据。

参考:Java - IO整理

对象序列化机制

 允许把内存中的Java对象(对象的类名、实例变量)转换为平台无关的二进制字节流(序列化,Serialize),用于永久保存对象到磁盘或利用套接字/RMI传输对象,后续可以恢复出Java对象(反序列化,Deserialize)。其中,反序列化读取的是类对象的数据而不是类本身,必须提供该对象的class文件。对象序列化机制是Java提供分布式网络编程的基础,也是Java EE的基础。
 对象支持序列化,其类必须是可序列化的,即必须实现接口之一:
  · Serializable:标记声明性接口,常用;
  · Externalizable:用于完全自定义序列化机制,性能略优但编程复杂度高;

1 public class MyClass implements java.io.Serializable{
2       ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("文件名")); 
3       MyClass objMy = new MyClass();   out.writeObject(objMy);
4       out.close();
5 
6       ObjectInputStream in = new ObjectInputStream(new FileInputStream("文件名"));    
7       MyClass resMy = (MyClass)in.readObject();
8       in.close();
9 }
View Code

 Java序列化机制采用对对象序列化编号的方法避免同一对象重复序列化,此方法中要注意可变对象。
·自定义序列化机制
  自定义序列化控制程序如何序列化实例变量,重写如下方法:
  ·private void writeObject(ObjectOutputStream out):写入特定类的实例状态;
  ·private void readObject(ObjectInputStream in):从流中读取并恢复对象的实例变量;
  ·private void readObjectNoData():可以正确初始化反序列化的对象;
  关键字transient用于修饰实例变量,序列化对象时忽略之,static变量也不会序列化,但是可以通过重写writeObject()和readObject()手动序列化保存。

 1 @override
 2 private void writeObject(ObjectOutputStream out) throws IOException{
 3       out.defaultWriteObject();
 4       out.writeXxx(基本类型变量)/writeObject(引用类型变量);
 5 }
 6 @override
 7 private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{
 8       in.defaultReadObject();
 9       in.ReadXxx()/readObject();
10 }
View Code

  自定义序列化机制可以加密提供安全性: 
  ·private Object writeReplace()
    序列化对象objA时将对象objA替换成其他对象objB,然后调用writeObject()方法序列化对象objB,可继承;
  ·private Object readResolve()
    实现保护性复制整个对象,在readObject()之后调用,返回值会代替readObject()反序列化出来的对象以保证反序列化的正确性,常用于单例类、枚举类的序列化,可继承;
·完全自定义序列化机制
 允许完全由程序员自主决定存储和恢复对象数据,必须实现接口Externalizable和如下方法
  ·public void writeExternal(ObjectOutput out):保存对象的状态;
  ·public void readExternal(ObjectInput in):实现对象反序列化;
  方法实现体中,调用DataIn/Output(ObjectIn/Output的父接口)的方法保存/恢复基本类型的实例变量,调用ObjectIn/Output的read/writeObject()方法保存/恢复引用类型的实例变量。

 1 public class MyClass implements Externalizable{
 2       public MyClass(){}       // 无参的public构造函数
 3       @override
 4       public void writeExternal(ObjectOutput out) throws IOException{
 5           ...
 6       }
 7       @override
 8       public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{
 9           ...
10       }
11 }
View Code

·序列化机制版本
  Java序列化机制允许为序列化类提供private static final long serialVersionUID标识Java类的序列化版本,保证序列化版本的兼容性、有利于程序在不同JVM间的可移植性。

参考

  • Java对象序列化; 理解Java对象序列化; JAVA序列化机制;序列化介绍;
  • Java序列化格式详解; 

NIO

Java的NIO参见:Java - NIO - sqh;

转载于:https://www.cnblogs.com/wjcx-sqh/p/5929874.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Halcon —— 边缘检测算子详解

一、算子介绍 1.1 种类 halcon内常用的边缘检测算子包括如下几种&#xff1a; 1.edges_image: 提取2D 图像边缘 2.edges_sub_pix&#xff1a;提取2D图像亚像素边缘 3.edges_object_model_3d &#xff1a;提取3D图像边缘 4.edges_color和edges_color_sub_pix&#xff1a;提取彩…

【TensorFlow】——索引与切片

目录 1、利用index进行索引 2、利用“&#xff1a;”和“...”进行索引与切片 3、tf.gather&#xff08;&#xff09;——对一个维度进行乱序索引 优势&#xff1a; 缺点&#xff1a; 例子 4、tf.gather_nd()——同时对多个维度进行索引 5、tf.boolean_mask()——通过布…

华硕(ASUS)X554LP笔记本一开机就进入aptio setup utility 问题的解决

某次因大意一直未插电&#xff0c;华硕&#xff08;ASUS&#xff09;X554LP笔记本后来没电关机。后来每次一开机就进入aptio setup utility界面&#xff0c;按F9调入默认配置&#xff0c;F10保存后退出&#xff0c;重启仍然进入aptio setup utility。 网上查了一下&#xff0c;…

redis和memcached缓存

memcached memcache开源的&#xff0c;高性能&#xff0c;高并发分布式内存缓存系统,天生支持集群 memcached下载地址&#xff1a; http://memcached.org/downloads python实现memcached缓存 pip3 install python-memcached import memcache aamemcache.Client(["10.0.0.2…

C# —— 进程与线程的理解

定义 进程 进程&#xff08;Process&#xff09;是Windows系统中的一个基本概念&#xff0c;它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程&#xff0c;进程可以包括一个或多个线程。 程序是在特定操作系统上的可执行文件&#xff0c…

git安装和初步使用

基本参照以下链接&#xff1a; http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000 注意&#xff1a; &#xff08;1&#xff09;每台电脑对于github来说都有对应的ssh密钥&#xff0c;…

【TensorFlow】——broadcast_to(在不复制内存的情况下自动扩张tensor)

目录 作用&#xff1a; 内在的思路 优点 什么时候可以broadcast ​ tf.boradcast_to .VS tf.tile 作用&#xff1a; 在不会实际意义上复制数据的情况下进行tensor的维度和形状的扩张&#xff0c;使得两个tensor维度和形状一致 对两个维度不一致的tensor进行加减前进行br…

20145212 《信息安全系统设计基础》第2周学习总结

20145212 《信息安全系统设计基础》第2周学习总结 教材学习内容总结 Vim基本操作 1.使用vim命令进入vim界面vim后面加上你要打开的已存在的文件名或者不存在&#xff08;则作为新建文件&#xff09;的文件名。 打开Xfce终端&#xff0c;输入以下命令$ vim practice_1.txt 直接使…

Opencv—— 拟合直线

概念 最小二乘法是勒让德( A. M. Legendre)于1805年在其著作《计算慧星轨道的新方法》中提出的。 最小二乘法就是通过最小化误差的平方和&#xff0c;使得拟合对象无限接近目标对象。在图像处理中主要用于拟合线&#xff0c;通过求采样点距离误差最小的线&#xff0c;可以是直…

本地搭建Dubbo监控中心的安装步骤

Dubbo监控中心的安装步骤 参考链接&#xff1a;http://blog.csdn.net/lichunan/article/details/40349645 一、从github上下载dubbo源码进行编译&#xff1a; 1、下载地址为&#xff1a; https://github.com/alibaba/dubbo.git2、编译源码命令&#xff1a;首先进入~/dubbo&am…

(转)SQLServer实例讲解

欢迎和大家交流技术相关问题&#xff1a; 邮箱: jiangxinnju163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/people/jiangxinnju 实例就是一个在数据库中存在的&#xff0c;现实的数据…

Basler相机SDK相关问题收集与知识汇总

1.心跳时间导致报错 此心跳非彼心跳,相机心跳是指过通过设置一个时间用于监测相机和网卡的连接,如果超过这个时间,相机就会释放跟网卡的连接,进入一种允许相机被再次连接的状态。 但此方式会导致相机SDK报错,经常显示在使用中,无可用连接,如何解决? 1.干等。不可取 2.…

14-会场安排问题

会场安排问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述学校的小礼堂每天都会有许多活动&#xff0c;有时间这些活动的计划时间会发生冲突&#xff0c;需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动&#xff0c;…

【TensorFlow】——实现minist数据集分类的前向传播(常规神经网络非卷积神经网络)

目录 一、常规神经网络模型 二、TensorFlow实现前向传播步骤 1、读取数据集 2、batch划分 3、根据神经网络每一层的神经元个数来初始化参数w,b 4、进行每一层输入输出的计算 5、对每一层的输出进行非线性relu函数变换 6、计算一个batch训练后的误差loss 7、计算每一次…

大道至简第二章

懒人造就了方法 开头说的&#xff0c;有一个人叫李冰也要移山&#xff0c;可是他却要用和愚公截然不同的方法&#xff0c;那就是用“烧”的方法来碎石&#xff0c;那么这样的好处就是省力。那么他又是怎样想到的办法的呢&#xff0c;就是生活中仔细观察他老婆做饭时水溢出是石头…

C# 回调函数详解

回调和回调函数是什么 软件模块之间存在着接口&#xff0c;而回调是一种双向调用模式&#xff0c;被调用方在接口被调用时也会调用对方的接口。 对于一般的结构化语言&#xff0c;可以通过回调函数来实现回调。回调函数是一个函数或过程&#xff0c;是一个由调用方自己实现&am…

神经网络(11)--具体实现:unrolling parameters

我们需要将parameters从矩阵unrolling到向量&#xff0c;这样我们就可以使用adanced optimization routines. unroll into vectors costFunction与fminunc里面的theta都是n1维的向量&#xff0c;costFunction的返回值gradient也是n1维的向量。 但是当我们使用神经网络时&#x…

[转]ASP.Net篇之Session与Cookie

本文转自&#xff1a;http://www.cnblogs.com/japanbbq/archive/2011/08/31/2160494.html Session: Session是“会话”的意思&#xff0c;然而&#xff0c;因为http协议是无状态的&#xff0c;那么每次客户端请求服务器端&#xff0c;服务器端都会以“崭新”的页面展示给客户端…

C# 接口详解

概念 接口描述的是可属于任何类或结构的一组相关行为&#xff0c;所以实现接口的类或结构必须实现接口定义中指定的接口成员。 定义&#xff1a;使用interface 关键字&#xff0c;由方法、属性、事件、索引器或这四种成员类型的任意组合构成。另可使用new、public、protected、…