`
1enny
  • 浏览: 70380 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

File文件的解析,和编码

 
阅读更多
java021
file讲解:文件和目录路径名的抽象表示形式
IO流操作的是数据,而数据一般是以文件的表现形式。
File类:用来将文件或者文件夹封装成对象
方便对文件与文件夹的属性信息进行操作
file对象可以作为参数传递给流的构造函数
File类常见的方法:
1. 文件的创建:
boolean createNewFile():在指定位置下创建文件,如果该文件已经存在,则不创建,
返回false.和输出流不一样,输出流对象一建立创建文件,而且文件已经存在。
boolean mkdir():创建文件夹
boolean mkdirs():创建多级文件夹
2. 删除文件:
boolean delete():删除失败返回false,如果文件正在被使用,则删除不了
void deleteOnExit() 在程序退出时删除指定文件。
3. 判断:
boolean exists():文件是否存在
因为仅仅通过File file = new File("1.txt");中的1.txt是不能判断
file是否是文件还是文件夹,因为1.txt可以作为文件还是文件夹的名称使用
isFile():判断是否是文件,前提条件要先createNewFile创建
isDirectory():判断是否是目录,前提要先mkdir,mkdirs创建
exists():测试此抽象路径名表示的文件或目录是否存在。提条件要先createNewFile创建
isHidden():判断是否是隐藏文件;
isAbsolute():判断是否是绝对路径。
3. 获取信息:
getPath():获取路径
getAbsolutePath():获取绝对路径
getPerent():获取绝对路径中的父目录,如果获取的是相对路径,返回null,
如果相对路径中有上一层目录那么该目录就是返回的结果。
listRoots():返回系统的盘符:c:d:..
list(“目录”):列出所有在该目录下的文件和文件夹(包括隐藏文件)
假如“目录”是文件类型则会抛异常(空指针,因为文件没有目录就没有包含其他文件
或文件夹当遍历时就会出现异常)
list(FilenameFilter filter):列出通过了过滤器的文件
4.修改:
file1.renameTo(file2)://此方法类似于剪切,但是假如在目标中有被重名的文件那么会重命名不成功
5.遍历文件夹
listFile中存在递归:
· packagexyxysjxy.io.file;

importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileWriter;
importjava.io.FilenameFilter;
importjava.util.ArrayList;
importjava.util.List;

publicclassFileTest1 {

publicstaticvoidmain(String[] args)throwsException {
method6();
}

publicstaticvoidmethod6()throwsException {
File file =newFile("I:\\tupian");
List<File> files =newArrayList<File>();
listMenus(files, file);
System.out.println(files.size());

FileWriter fw =newFileWriter("I:\\tupian\\1.txt");
BufferedWriterbw=newBufferedWriter(fw);
for(File f : files) {
bw.write(f.getAbsolutePath());
bw.newLine();
bw.flush();
}

}

// 列出文件夹的清单文件
publicstaticvoidlistMenus(List<File> filess, File file) {
if(file.isDirectory()) {
File files[] = file.listFiles();
if(files !=null&& files.length!= 0) {
for(File f : files) {
if(f.isFile()) {
filess.add(f);
}else{
listMenus(filess, f);
}
}
}
filess.add(file);
}
}

// 目录的删除,写递归啊,觉得就应该把要递归语句当作已经完成了。继续写接下来要执行的语句
publicstaticvoiddeleteDirFiles(File file) {
if(file.isDirectory()) {
File files[] = file.listFiles();
if(files !=null&& (files.length!= 0)) {
for(File f : files) {
if(f.isFile())
System.out
.println(file.toString() +"dir"+ f.delete());
else
deleteDirFiles(f);
}
System.out.println(file.toString() +"dir"+ file.delete());
}else
System.out.println(file.toString() +"dir"+ file.delete());

}
}

// 递归调用遍历文件
publicstaticvoiddiGui(File file,intlevel) {

if(file.isDirectory()) {
System.out.println(cengJi(level++) + file);
File files[] = file.listFiles();
if(files !=null&& (files.length!= 0))
for(File file2 : files) {
diGui(file2, level);
}
}
System.out.println(cengJi(level++) + file);
level--;
}

publicstaticString cengJi(intlevel) {
StringBuilder sb =newStringBuilder();
for(intl = 0; l < level; l++)
sb.append(" ");
returnsb.toString() +"|--";
}

publicstaticvoidmethod5()throwsException {
File file1 =newFile("F:\\");
// String files[] = file1.list();
// File files[] = file1.listFiles();
String files[] = file1.list(newFilenameFilter() {
@Override
// 接口回调方式:dir是this,name是文件名(在该目录下的通过fs.list())
publicbooleanaccept(File dir, String name) {
System.out.println("dir:"+ dir +"name:"+ name);
if(name.endsWith(".mp3")) {
returntrue;
}
returnfalse;
}
});
for(String file : files) {
System.out.println("file:"+ file);
}

}

publicstaticvoidmethod4()throwsException {
File file1 =newFile("e:\\1.txt");
// file1.createNewFile();
File file2 =newFile("f:\\2.txt");
// 此方法类似于剪切,但是假如在目标中有被重名的文件那么会重命名不成功
System.out.println(file2.renameTo(file1));
}

publicstaticvoidmethod3()throwsException {
File file1 =newFile("f:\\a\\1.txt");
// file1.createNewFile();// 必须是已经存在的路径
// file1.mkdirs();
System.out.println(file1.exists());
System.out.println(file1.isFile());
System.out.println(file1.isDirectory());
System.out.println(file1.isAbsolute());
}

publicstaticvoidmethod2()throwsException {
File file1 =newFile("f:\\a\\b\\c","1.txt");
file1.mkdirs();
file1.createNewFile();
// file1.deleteOnExit();
// file1.delete();
}

publicstaticvoidmethod1() {
File file1 =newFile("f:\\a\\b\\c\\1.txt");
File file2 =newFile("f:\\a\\b\\c\\d","2.txt");
File file3 =newFile("f:"+ File.separator+"a"+ File.separator
+"b"+ File.separator+"c"+ File.separator+"d"
+ File.separator+"e","3.txt");
File d =newFile("f:\\a\\b\\c\\d\\e\\f");
File file4 =newFile(d,"f.txt");
sop(file1);
sop(file2);
sop(file3);
sop(file4);
}

publicstaticvoidsop(File file) {
System.out.println(file.toString());
}

}




7. Properties是hashTable的子类
也就是说它具备集合的特点,而且它里面存储的键值对都是字符串
是集合中和IO技术相结合的集合容器
该对象的特点:可以用于键值对形式的配置文件

8. PrintStream 和 PrintWriter
打印流:(输出流)
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:
PrintStream
构造函数可以接收的参数类型:
1. file对象。File
2. 字符串路径。String
3. 字节输出流。outputStream
字符打印流:
printWriter
构造函数可以接收的参数类型:
1.file对象。File
2. 字符串路径。String
3. 字节输出流。OutputStream
4. 字符输出流。Writer

9. SequenceInputStream 合并流
packagexyxysjxy.io;

importjava.io.BufferedInputStream;
importjava.io.FileInputStream;
importjava.io.PrintStream;
importjava.io.PrintWriter;
importjava.io.SequenceInputStream;
importjava.util.Enumeration;
importjava.util.Vector;

publicclassSequenceInputStreamTest {

publicstaticvoidmain(String[] args)throwsException {
FileInputStreamfr1 =newFileInputStream("f:\\1.txt");
FileInputStreamfr2 =newFileInputStream("f:\\2.txt");
FileInputStreamfr3 =newFileInputStream("f:\\3.txt");
FileInputStreamfr4 =newFileInputStream("f:\\4.txt");
PrintStream ps =newPrintStream("f:\\5.txt");
Vector<FileInputStream> v =newVector<FileInputStream>();
v.add(fr1);
v.add(fr2);
v.add(fr3);
v.add(fr4);
Enumeration<FileInputStream> e = v.elements();
SequenceInputStream sis =newSequenceInputStream(e);

BufferedInputStream bts =newBufferedInputStream(sis);
byteb[] =newbyte[1024];
intlen = 0;
while((len = bts.read(b)) != -1) {
ps.write(b, 0, len);
ps.flush();
}
sis.close();
ps.close();

System.out.println("合并流成功了 !!!");
}

}

9. 切割文件
packagexyxysjxy.io;

importjava.io.BufferedInputStream;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.SequenceInputStream;
importjava.util.ArrayList;
importjava.util.Enumeration;
importjava.util.Iterator;

publicclassSplitFiles {

publicstaticvoidmain(String[] args)throwsIOException {
FileInputStream fis =newFileInputStream("f:\\Brandy - So Sick.mp3");
BufferedInputStream bis =newBufferedInputStream(fis);
byteb[] =newbyte[1024 * 1024];
intlen = 0;
intcount = 0;
while((len = bis.read(b)) != -1) {
FileOutputStream fos =newFileOutputStream("f:\\"+ ++count
+".part");
fos.write(b, 0, len);
fos.close();
}
bis.close();
System.out.println("分割成功i哦");

ArrayList<FileInputStream> fileInputStreams =newArrayList<FileInputStream>();
for(inti = count; i > 0; i--) {
FileInputStream fiss =newFileInputStream("f:\\"+ i +".part");
fileInputStreams.add(fiss);
}
finalIterator<FileInputStream> is = fileInputStreams.iterator();
Enumeration<FileInputStream> es =newEnumeration<FileInputStream>() {
@Override
publicbooleanhasMoreElements() {
returnis.hasNext();
}

@Override
publicFileInputStream nextElement() {
returnis.next();
}
};
SequenceInputStream sis =newSequenceInputStream(es);
FileOutputStream fos =newFileOutputStream("f:\\merge.mp3");
byteb2[] =newbyte[1024];
intlen2= 0;
while((len2= sis.read(b2)) != -1) {
fos.write(b2, 0,len2);
fos.flush();
}
fos.close();
sis.close();

}

}

10 操作对象:对象需要序列化(实现标记接口(没有要你去实现的接口)) 标记

ObjectInputStream与ObjecOutputStream (成对使用)
通过serializable来标识对象是否出自哪个类中,而且序列化UID是通过类成员来计算出来的
所以当你改变类中的成员后(反序列化会报标识不一致)
但是自己也可以自定义一个标识 而且更改了其中的成员一样可以识别(序列化 反序列化)
静态是不能被序列化的(因为序列化针对是对象存在于堆中,而静态的存在共享区)要想非静态的成员
不能被序列化可以用(transient)修饰。


11 管道流:输出和输入可以直接连接,通过结合线程使用
PipedInputStream 和 PipeOutputStream
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream对象读取,并由其他线程将其写入到相应的PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏

packagexyxysjxy.io;

importjava.io.IOException;
importjava.io.PipedInputStream;
importjava.io.PipedOutputStream;

publicclassPipeStreamTest {

publicstaticvoidmain(String[] args) {
//创建两个管道流发现并没有目的地,说明内存中的流
PipedInputStream pi =newPipedInputStream();
PipedOutputStream po =newPipedOutputStream();
try{
po.connect(pi);
}catch(IOException e) {
e.printStackTrace();
}
Thread t1 =newThread(newPipeStreamTest().newWrite(po));
Thread t2 =newThread(newPipeStreamTest().newRead(pi));
t1.start();
t2.start();
}

classWriteimplementsRunnable {
privatePipedOutputStreampo;

publicWrite(PipedOutputStream po) {
this.po= po;
}

publicvoidrun() {
try{
po.write("管道流来了".getBytes());
po.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}

classReadimplementsRunnable {
PipedInputStreampi;

publicRead(PipedInputStream pi) {
this.pi= pi;
}

@Override
publicvoidrun() {
byte[] b =newbyte[1024];
try{
intlen =pi.read(b);
System.out.println(newString(b,0,len));
}catch(IOException e) {
e.printStackTrace();
}
}
}
}

12 RandomAccessFile://
随机访问文件,自身具备读写方法。可以实现多线程下载功能。
线程1|-----| 线程2|-----| 线程3|-----| 线程4|-----| 线程5|-----|........把一个文件切割成多段
通过skipByte(int x)seek(int x)来达到随机访问
该类不是IO体系中的子类,而是直接继承自Object,但是IO包中的成员,因为他有读写功能。
内部封装了一个数组,而且通过指针对数组元素进行操作。可以通过getFilePointer获取指针位置,
同时可以通过seek改变指针位置。之所以有读写功能是因为内部封装了输入输出流。
而且还有操作文件还有模式:r ,rw,rws,rwd 四种
当模式为r时,假如读文件不存在会抛异常不会自动创建;当模式为rw时没有就创建,有也不覆盖文件。

13 DataOutputStream 和 DataInputStream 操作基本数据类型
用它writeUTF()写必须用readUTF()读这里的UTF和UTF-8有所不同

14 ByteArrayInputStream 和 ByteArrayOutputStream//带缓冲区,可变长度
ByteArrayInputStream
1.ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
内部计数器跟踪read方法要提供的下一个字节。关闭ByteArrayInputStream无效。
此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException

2.在构造的时候,需要接收数据源,而且数据源是一个字节数组。
ByteArrayOutputStream
1.此类实现了一个输出流,其中的数据被写入一个 byte 数组。
缓冲区会随着数据的不断写入而自动增长。可使用toByteArray()toString()获取数据。
2.在构造的时候,不用定义数据目的,因为该对象中已经封装了一个数组为目的地。
因为这两个流对象都是操作数组,并没有关联系统资源,所以不用关流。


操作字符数组:CharArrayReader 和 CharArrayReader
操作字符串:StringReader 和 StringWriter

write()向下转为一个字节写入,read()阻塞式读出

字符编码:
PrintStream PrintWriter
OutputStreamWriter InputStreamReader



编码:字符串变成字节数组 String-->byte[] str.getBytes(charsetName)

解码:字节数组变成字符串byte[]-->String new String(byte[],charsetName);



分享到:
评论

相关推荐

    解析URL和文件的编码方式

    用开源的JAR包分析 不多说了 工作中用的比较多

    java解析txt

    if(file.isFile() && file.exists()){ //判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file),encoding);//考虑到编码格式 BufferedReader bufferedReader = new ...

    发布一个基于BER编码的CDR文件高速解码程序——destroy for linux

    不过,由于我在工作中只接触到Ericsson的某些版本的CDR,而且,用于解析CDR文件的描述文件来源于供应商,我的程序也只能识别来自于这个供应商的描述文件,所以,移植到其它厂商的环境下可能会产生一些问题。...

    原生JS上传文件,获取文件二进制数据及文件大小和文件名称

    html前端技术,原生js上传文件,代码结构清晰、简短、易于理解,建议收藏。

    Hex文件格式学习笔记

    Intel HEX文件是由一行行符合Intel ...这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。

    torrent_parser:.torrent文件解析器和Python 2和3的创建者

    种子文件解析器和Python创建者 .torrent文件的简单解析器。 也可以在0.2.0版之后编辑并写回到torrent格式。 特征 种子文件的解码器和编码器 使用指定的编码和错误处理程序将字节字段自动解码为字符串 使用auto编码...

    H.264视频字节流解析成NALU

    该程序完成从XXX.h264编码文件中解析出视频的基本单元NALU,NALU是H.264码流解码的基本单元。NALU包括起始码和数据部分,对于起始码,程序可以解析出0x000001或者0x00000001开头的NALU。程序由main()、int parse_h...

    lightbenc.php解析BT(BitTorrent)种子的php类

    $file_info 就是我们获取到的bt文件的信息,里面包含了bt文件的服务器地址,文件个数和文件大小等信息,其中: 文件名称:$bt[‘info’][‘files’][/*这边要是个偶数*/][‘path.utf-8′][0]; 文件大小:$bt[...

    发布一个基于BER编码的CDR文件高速解码程序——destroy for solaris

    不过,由于我在工作中只接触到Ericsson的某些版本的CDR,而且,用于解析CDR文件的描述文件来源于供应商,我的程序也只能识别来自于这个供应商的描述文件,所以,移植到其它厂商的环境下可能会产生一些问题。...

    midi-json-parser:该模块将Midi文件解析为人类可读的JSON对象

    midi-json-parser 该模块将midi文件解析为人类可读的JSON对象。 此模块解析二进制MIDI文件,并将其转换为JSON表示形式。 然后可以使用此JSON表示将其传递给 。 当然,也可以通过使用将其修改为再次编码为二进制MIDI...

    发布一个基于BER编码的CDR文件高速解码程序——destroy for tru64

    不过,由于我在工作中只接触到Ericsson的某些版本的CDR,而且,用于解析CDR文件的描述文件来源于供应商,我的程序也只能识别来自于这个供应商的描述文件,所以,移植到其它厂商的环境下可能会产生一些问题。...

    jsp文件上传下载通用包

    如果在表单中使用表单元素 “file” /&gt;,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件: 当表单...

    Python中使用不同编码读写txt文件详解

    out=file&#40;“name.txt”,”w”&#41; for filename in filenames:  out.write(filename.decode(“gb2312”).encode(“utf-8”)) out.close() 将执行文件的当前目录及文件名写入到name.txt文件中,以utf-8格式...

    myEclipse乱码解决办法

    告诉浏览器用何种编码来解析html或者JSP文件。 window--&gt;Preferences--&gt;MyEclipse--&gt;Files and Editors--&gt;选择子项--&gt;Encoding 例如:选择UTF-8, 新建jsp文件的时候,contentType="text/html; charset=UTF-8" ...

    show_file_mysel

    韦东山第三期视频数码相框中的电子书项目的ShowOnePage函数解析 iLen = g_ptEncodingOprForFile-&gt;... 这里得到一个字 但是得到的编码并不是返回值而是存在*pdwCode里 返回的是本次一共处理了文件里的多少个字

    mobileprovision:解析.mobileprovision文件的项目

    Base64编码的证书 -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- 包含在openssl x509 -in /path/to/file -text可以输出信息 确认 验证是通过libmis的MISProvisioningProfileCheckValidity函数完成的 ...

    pem:使用Python轻松解析PEM文件

    pem是许可的Python模块,用于解析和拆分,即Base64编码的DER密钥和证书。 它在Python 2.7和3.5+上运行,没有依赖关系,并且不会尝试以任何方式解释证书数据。 它源于从各种证书部署中加载密钥,证书,信任链和DH...

    geocoder:一个小的实用程序脚本,用于对csv文件中的地址进行地理编码

    要对自己的csv文件进行地址解析,您需要在index.js更改以下变量: const INPUT_CSV = 'input/test.csv' ; // location of the input csv file const OUTPUT_CSV = 'output/test.csv' ; // location where to store ...

    C语言实例解析精粹(第二版) 光盘代码

    按【F3】键或者“File-&gt;Open”菜单命令,打开1.c文件, 按【Ctrl+F9】键,或者“Run-&gt;Run”菜单命令,编译运行该程序。 ◎ 光盘目录清单如下: 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 ...

    DOMCount.rar_Schema C_XML程序开发_personal_xml list_解析xml

    自己开发的XML DOM计数程序DOMCount,使用DOM API解析XML文件,构造DOM树,然后遍历DOM树并计算元素个数(仅使用一个API调用)。 DOMCount解析XML文件,计算其元素数并打印。 用法: DOMCount [options]&lt;XML file...

Global site tag (gtag.js) - Google Analytics