您的位置:首页 > 编程语言 > Java开发

你必须知道的261个Java语言问题笔记- Java流和文件操作3

2017-08-10 21:25 525 查看
如何使用NIO读写文件

经过缓冲流包装后的效率会比以前要高,

NIO读写效率会更快;

读操作:

写操作:

文件复制:

NIO是在原有IO流的基础上进行改进,注意:并不是所有IO流类都支持NIO的操作,

支持NIO操作的类又FileInputStream、FileOutputStream和RandomAccessFile。

什么是字符编码和解码

默认使用与操作系统一致的字符集,在NIO技术中提供了与字符集、编码和解码相关的API,

存放在java.nio.charset包中,包含在字节与Unicode字符间转换的字符集、解码器与编码器:

Charset:字符集,用于描述字符和字节之间的命名映射关系。

CharsetDecoder:解码器,用于实现将字节解码为字符。

CharsetEncode:编码器,用于实现将字符编码为字节。

读写文件时为什么中文字符经常产生乱码

字符集用于描述字符与二进制之间的映射关系。

除了由于编码和解码的字符集不一致引起乱码之外,API使用不当也会引起中文乱码。

例如使用InputStream读取中文字符的文件,由于一个中文字符需要由两个字节表示,

InputStream是以字节为单位读取的,因此会将中文拆成两个字节分两次读取,这就是读取中文为

乱码而英文字符却正常的原因。

如何解决FileReader读文件乱码的问题

为避免中文乱码问题,开发者会习惯选用FileReader类读文件。

但是有些情况,即使使用了FileReader类同样会昌盛乱码问题。

FileReader属于字符流,是读取字符文件的便捷类。FileReader继承自InputStreamReader,InputStreamReader

是将字节流转换为字符流的桥梁,即将字节信息转换为字符信息。

实际上FileReader类在内部实现过程中也是利用InputStreamReader完成字节流到字符流的转化,只不过

转化时采用的字符集为系统平台默认的字符集。

如果文件保存时的编码设定为UTF-8,那么在中文操作系统使用FileReader就会乱码,因为中文操作

系统平台的默认字符集为GBK.解决该问题的方法就是放弃使用FileReader,选用InputStreamReader

,在获取InputStreamReader对象时显示指定合适的字符集。

为什么DataInputStream和DataOutputStream读写文件时乱码

使用DataInputStream和DataOutputStream,开发者可以以基本类型为单位对文件进行读写。

使用DataOutputStream写入文件中的信息,除了包含信息本身之外,还有类型标识等,只有使用

DataInputStream才能正确读取原有信息,其他方式会产生乱码,这也是使用记事本打开文件时

显示乱码的原因。

DataOutputStream和DataInputStream在读写文件时需要配合使用,不能单独应用,否则读写过程

将会产生乱码。

DataOutputStream写文件:

DataInputStream读文件:

DataInputStream和DataOutputStream类必须成对使用,而且读写时应采取对应的顺序和类型,否则

将会发生乱码问题。

如何实现文件锁定功能

Java提供了两种方式,可以实现文件锁定功能。一种是使用RandomAccessFile实现,另一种是使用

FileChannel实现。

使用RandomAccesFile对象时,需要提供一个参数,用于指定文件的访问模式。

如果需要以锁定方式对文件进行写入,可以使用"rws"参数:

RandomAccessFile rw = new RandomAccessFile(file,"rws")

rw代表读写方式、s代表同步方式,也就是锁,这种方式就是独占方式。

使用FileChannel实现锁定,FileChannel是NIO提供的一个类,该类提供了锁定的方法。

使用FileChannel的tryLock()方法获取文件锁,此外也可以使用lock()方法,

该方法与tryLock()方法的区别在于lock()是一个阻塞性方法,只有获取文件锁才能进行后续操作,

否则一直等待。

注意:FileOutputStream和FileInputStream也提供了getChannel()方法,但是获取的是一个缺省的

FileChannel对象,该对象不能实现文件的锁定。

文件锁定功能是NIO提供的技术,可以有效的避免出现文件操作冲突的问题。

如何实现对文件和字符串加密、解密

数据加密和解密的算法有很多,例如DES和RSA等,也可以自己制定加密算法。

利用DES算法实现对文件、字符串的加密和解密操作:

DES(Data Encryption Standard)算法出自IBM的研究工作,是一种分组密码,通过反复使用加密组块

替代和换位两种技术,经过16轮的变换后得到密文,安全性很高。DES属于传统的对称密码体制,其

加密秘钥与解密秘钥是相同的,由于其安全性高、速度快、计算较简单,因此被应用与许多需要安全

加密的场合。

注意:有些算法只能加密不能解密,例如MD5和SHA-1就是不可逆算法。

如何实现对文件和目录的压缩、解压缩

java支持的压缩格式是zip、gzip、jar等。

zip是Windows系统常用的压缩格式、gzip是Linux系统常用的压缩格式、而jar是Java特有的一种压缩

格式。

zip格式的压缩、解压缩时,压缩可以使用ZipEntry类和ZipOutputStream类,

解压缩可以使用ZipEntry类和ZipInputStream类。

文件压缩:

文件解压缩:

目录压缩:目录压缩需要采用递归方式遍历压缩目录中的文件及子目录中文件。

目录解压缩:目录解压缩在解压过程中需要根据压缩时的目录结构,在目标位置将目录和文件还原。

如何读写properties文件

properties是Java程序特有的一种文件类型,该文件的信息以键-值格式存放。通常可以将容易变化

的一些系统参数写到properties文件中,然后利用Java程序读取,这样可以提高程序的灵活性。

读操作:

写操作:

Properties类在读写properties文件时,使用的是ISO-8859-1编码,每个字节是一个Latinl字符,

因此对于非Latinl的字符和某些特殊字符,例如中文字符,在读写时就会发生乱码,为了避免

读写中文字符乱码,可以将中文字符转义,再进行读写操作:

使用JDK提供的native2ascii工具实现转义,将文件中的中文字符和要写入文件的中文字符进行编码,

这样Properties在读写时就不会发生乱码。

native2ascii工具在JDK安装目录的bin目录中,双击native2ascii.exe文件,输入要转换的中文字符后 ,

按回车键执行编码转换。

如何读写XML文件

解析XML文件可以使用DOM(Document Object Model)或SAX(Simple API for XML)技术。

DOM可以实现增加、删除、修改和读取功能,但是在文件很大时比较耗内存。

而SAX对XML文件是一边读取一边处理,对内存要求很低,但是仅支持文件读取,不支持对文件的

增加、删除、修改操作。

DOM读文件:

DOM写文件:

SAX读文件:

XML文件具有跨平台的特点,使用也比较广泛。例如XML配置文件、实现异构系统的整合,即在不同

系统之间利用XML文件传递数据信息。

如何读写XML文件中的元素属性

DOM在解析XML文档时,文档中每个元素都会转化为内存文档树中的节点,节点对象的类型为Element.

使用Element的getAttributeNode()和getAttribute()方法可以获取属性信息,

通过setAttributeNode()和setAttribute()方法可以设置属性信息。

XML文件又严格的语法规则,例如必须有一个根元素、元素的开始标记可以包含属性等。

对于元素属性值的操作,在Java中可以通过Element类的方法实现。

如何读写CSV格式的文件

CSV是Comma Separated Value(逗号分隔值)的英文缩写,属于纯文本文件,文件扩展名为csv。

CSV文件与普通的TXT文件不同的是,CSV文件中的每项数据都是用逗号分隔。因此java读写CSV文件

与读写TXT文件相比,只是多一些逗号和换行符的处理。

写CSV文件:

读CSV文件:

CSV格式的文件也属于纯文本文件,只是在文件打开时默认使用Excel软件。如果需要将系统的一些数据

以Excel格式进行处理,可以考虑使用CSV文件,应为Java处理CSV文件比处理Excel文件要简单的多。

如何为图片文件生成缩略图

在实现缩略图的过程中,主要使用BufferedImage和ImageIO两个类。首先将图片信息读取到BufferedImage

对象中,接着构造缩略图的BufferedImage对象,最后将缩略图输出。

ImageIO类提供了read()和write()方法,用于读写图片中的信息。

如何操作Excel文件

由于Java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现。

支持对Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL。

1POI组件的应用:POI组件的下载地址为http://poi.apache.org/,该组件对Excel文档操作:

写入Excel文件:

读取Excel文件:

2JXL组件的应用

JXL组件的下载地址为http://jexcelapi.sourceforge.net/,该组件对Excel文档操作。

写入Excel文件:

读取文件:

搜索Excel是否包含指定的字符串;

向Excel中插入图片;

JXL只支持png格式的图片,jpg格式和gif格式都不支持。

如何操作Word文件

现在有很多第三方组件都支持Word文件的操作,例如jacob、iText、POI和java2word.

jacob组件的功能最强大,可以操作Word、Excel等格式的文件。该组件调用的是操作

系统底层的dll文件,需要在system32目录下放置jacob.dll,然后为工程添加jacob.jar

文件的引用。

在使用Java操作Word文件时,jacob组件是最常用的一个,该组件的下载地址为
http://sourceforge.net/projects/jacob-project/。推荐使用较新版本,如果版本太低的话
可能会报错。

WordBean类封装了对Word文件的相关操作,例如打开、新建、写入、另存为何打印等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: