java 基础知识之io总结
我计划在接下来的几篇文章中快速回顾一下java,主要是一些基础的jdk相关的内容。
工作后,使用的技术随着项目的变化而变化,时而c#,时而java,当然还有其他一些零碎的技术。总体而言,c#的使用时间要更长一些,其次是java。我本身对语言没有什么倾向性,能干活的语言,就是好语言。而且从面向对象的角度来看,我觉得c#和java对我来说,没什么区别。
这篇文章主要回顾java中和i/o操作相关的内容,i/o也是编程语言的一个基础特性,java中的i/o分为两种类型,一种是顺序读取,一种是随机读取。
我们先来看顺序读取,有两种方式可以进行顺序读取,一种是inputstream/outputstream,它是针对字节进行操作的输入输出流;另外一种是reader/writer,它是针对字符进行操作的输入输出流。
下面我们画出inputstream的结构
- fileinputstream:操作文件,经常和bufferedinputstream一起使用
- pipedinputstream:可用于线程间通信
- objectinputstream:可用于对象序列化
- bytearrayinputstream:用于处理字节数组的输入
- linenumberinputstream:可输出当前行数,并且可以在程序中进行修改
下面是outputstream的结构
printstream:提供了类似print和println的接口去输出数据
下面我们来看如何使用stream的方式来操作输入输出
使用inputstream读取文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
使用fileinputstream读取文件信息 public static byte [] readfilebyfileinputstream(file file) throws ioexception { bytearrayoutputstream output = new bytearrayoutputstream(); fileinputstream fis = null ; try { fis = new fileinputstream(file); byte [] buffer = new byte [ 1024 ]; int bytesread = 0 ; while ((bytesread = fis.read(buffer, 0 , buffer.length)) != - 1 ) { output.write(buffer, 0 , bytesread); } } catch (exception ex) { system.out.println( "error occurs during reading " + file.getabsolutefile()); } finally { if (fis != null ) fis.close(); if (output != null ) output.close(); } return output.tobytearray(); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
使用bufferedinputstream读取文件 public static byte [] readfilebybufferedinputstream(file file) throws exception { fileinputstream fis = null ; bufferedinputstream bis = null ; bytearrayoutputstream output = new bytearrayoutputstream(); try { fis = new fileinputstream(file); bis = new bufferedinputstream(fis); byte [] buffer = new byte [ 1024 ]; int bytesread = 0 ; while ((bytesread = bis.read(buffer, 0 , buffer.length)) != - 1 ) { output.write(buffer, 0 , bytesread); } } catch (exception ex) { system.out.println( "error occurs during reading " + file.getabsolutefile()); } finally { if (fis != null ) fis.close(); if (bis != null ) bis.close(); if (output != null ) output.close(); } return output.tobytearray(); } |
使用outputstream复制文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
使用fileoutputstream复制文件 public static void copyfilebyfileoutputstream(file file) throws ioexception { fileinputstream fis = null ; fileoutputstream fos = null ; try { fis = new fileinputstream(file); fos = new fileoutputstream(file.getname() + ".bak" ); byte [] buffer = new byte [ 1024 ]; int bytesread = 0 ; while ((bytesread = fis.read(buffer, 0 ,buffer.length)) != - 1 ) { fos.write(buffer, 0 , bytesread); } fos.flush(); } catch (exception ex) { system.out.println( "error occurs during copying " + file.getabsolutefile()); } finally { if (fis != null ) fis.close(); if (fos != null ) fos.close(); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
使用bufferedoutputstream复制文件 public static void copyfilebybufferedoutputstream(file file) throws ioexception { fileinputstream fis = null ; bufferedinputstream bis = null ; fileoutputstream fos = null ; bufferedoutputstream bos = null ; try { fis = new fileinputstream(file); bis = new bufferedinputstream(fis); fos = new fileoutputstream(file.getname() + ".bak" ); bos = new bufferedoutputstream(fos); byte [] buffer = new byte [ 1024 ]; int bytesread = 0 ; while ((bytesread = bis.read(buffer, 0 , buffer.length)) != - 1 ) { bos.write(buffer, 0 , bytesread); } bos.flush(); } catch (exception ex) { system.out.println( "error occurs during copying " + file.getabsolutefile()); } finally { if (fis != null ) fis.close(); if (bis != null ) bis.close(); if (fos != null ) fos.close(); if (bos != null ) bos.close(); } } |
这里的代码对异常的处理非常不完整,稍后我们会给出完整严谨的代码。
下面我们来看reader的结构
这里的reader基本上和inputstream能够对应上。
writer的结构如下
下面我们来看一些使用reader或者writer的例子
使用reader读取文件内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
使用bufferedreader读取文件内容 public static string readfile(string file) throws ioexception { bufferedreader br = null ; stringbuffer sb = new stringbuffer(); try { br = new bufferedreader( new filereader(file)); string line = null ; while ((line = br.readline()) != null ) { sb.append(line); } } catch (exception ex) { system.out.println( "error occurs during reading " + file); } finally { if (br != null ) br.close(); } return sb.tostring(); } |
使用writer复制文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
使用bufferedwriter复制文件 public static void copyfile(string file) throws ioexception { bufferedreader br = null ; bufferedwriter bw = null ; try { br = new bufferedreader( new filereader(file)); bw = new bufferedwriter( new filewriter(file + ".bak" )); string line = null ; while ((line = br.readline())!= null ) { bw.write(line); } } catch (exception ex) { system.out.println( "error occurs during copying " + file); } finally { if (br != null ) br.close(); if (bw != null ) bw.close(); } } |
下面我们来看如何对文件进行随机访问,java中主要使用randomaccessfile来对文件进行随机操作。
创建一个大小固定的文件
1
2
3
4
5
6
7
8
|
创建大小固定的文件 public static void createfile(string file, int size) throws ioexception { file temp = new file(file); randomaccessfile raf = new randomaccessfile(temp, "rw" ); raf.setlength(size); raf.close(); } |
向文件中随机写入数据
1
2
3
4
5
6
7
8
|
向文件中随机插入数据 public static void writefile(string file, byte [] content, int startpos, int contentlength) throws ioexception { randomaccessfile raf = new randomaccessfile( new file(file), "rw" ); raf.seek(startpos); raf.write(content, 0 , contentlength); raf.close(); } |
接下里,我们来看一些其他的常用操作
移动文件
1
2
3
4
5
6
7
8
9
|
移动文件 public static boolean movefile(string sourcefile, string destfile) { file source = new file(sourcefile); if (!source.exists()) throw new runtimeexception( "source file does not exist." ); file dest = new file(destfile); if (!( new file(dest.getpath()).exists())) new file(dest.getparent()).mkdirs(); return source.renameto(dest); } |
复制文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
复制文件 public static void copyfile(string sourcefile, string destfile) throws ioexception { file source = new file(sourcefile); if (!source.exists()) throw new runtimeexception( "file does not exist." ); if (!source.isfile()) throw new runtimeexception( "it is not file." ); if (!source.canread()) throw new runtimeexception( "file cound not be read." ); file dest = new file(destfile); if (dest.exists()) { if (dest.isdirectory()) throw new runtimeexception( "destination is a folder." ); else { dest.delete(); } } else { file parentfolder = new file(dest.getparent()); if (!parentfolder.exists()) parentfolder.mkdirs(); if (!parentfolder.canwrite()) throw new runtimeexception( "destination can not be written." ); } fileinputstream fis = null ; fileoutputstream fos = null ; try { fis = new fileinputstream(source); fos = new fileoutputstream(dest); byte [] buffer = new byte [ 1024 ]; int bytesread = 0 ; while ((bytesread = fis.read(buffer, 0 , buffer.length)) != - 1 ) { fos.write(buffer, 0 , bytesread); } fos.flush(); } catch (ioexception ex) { system.out.println( "error occurs during copying " + sourcefile); } finally { if (fis != null ) fis.close(); if (fos != null ) fos.close(); } } |
复制文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
复制文件夹 public static void copydir(string sourcedir, string destdir) throws ioexception { file source = new file(sourcedir); if (!source.exists()) throw new runtimeexception( "source does not exist." ); if (!source.canread()) throw new runtimeexception( "source could not be read." ); file dest = new file(destdir); if (!dest.exists()) dest.mkdirs(); file[] arrfiles = source.listfiles(); for ( int i = 0 ; i < arrfiles.length; i++) { if (arrfiles[i].isfile()) { bufferedreader reader = new bufferedreader( new filereader(arrfiles[i])); bufferedwriter writer = new bufferedwriter( new filewriter(destdir + "/" + arrfiles[i].getname())); string line = null ; while ((line = reader.readline()) != null ) writer.write(line); writer.flush(); reader.close(); writer.close(); } else { copydir(sourcedir + "/" + arrfiles[i].getname(), destdir + "/" + arrfiles[i].getname()); } } } |
删除文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
删除文件夹 public static void del(string filepath) { file file = new file(filepath); if (file == null || !file.exists()) return ; if (file.isfile()) { file.delete(); } else { file[] arrfiles = file.listfiles(); if (arrfiles.length > 0 ) { for ( int i = 0 ; i < arrfiles.length; i++) { del(arrfiles[i].getabsolutepath()); } } file.delete(); } } |
获取文件夹大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
获取文件夹大小 public static long getfoldersize(string dir) { long size = 0 ; file file = new file(dir); if (!file.exists()) throw new runtimeexception( "dir does not exist." ); if (file.isfile()) return file.length(); else { string[] arrfilename = file.list(); for ( int i = 0 ; i < arrfilename.length; i++) { size += getfoldersize(dir + "/" + arrfilename[i]); } } return size; } |
将大文件切分为多个小文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
将大文件切分成多个小文件 public static void splitfile(string filepath, long unit) throws ioexception { file file = new file(filepath); if (!file.exists()) throw new runtimeexception( "file does not exist." ); long size = file.length(); if (unit >= size) return ; int count = size % unit == 0 ? ( int )(size/unit) : ( int )(size/unit) + 1 ; string newfile = null ; fileoutputstream fos = null ; fileinputstream fis = null ; byte [] buffer = new byte [( int )unit]; fis = new fileinputstream(file); long startpos = 0 ; string countfile = filepath + "_count" ; printwriter writer = new printwriter( new filewriter( new file(countfile))); writer.println(filepath + "\t" + size); for ( int i = 1 ; i <= count; i++) { newfile = filepath + "_" + i; startpos = (i - 1 ) * unit; system.out.println( "creating " + newfile); fos = new fileoutputstream( new file(newfile)); int bytesread = fis.read(buffer, 0 , buffer.length); if (bytesread != - 1 ) { fos.write(buffer, 0 , bytesread); writer.println(newfile + "\t" + startpos + "\t" + bytesread); } fos.flush(); fos.close(); system.out.println( "startpos:" + i*unit + "; endpos:" + (i*unit + bytesread)); } writer.flush(); writer.close(); fis.close(); } |
将多个小文件合并为一个大文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
将多个小文件合并成一个大文件 public static void linkfiles(string countfile) throws ioexception { file file = new file(countfile); if (!file.exists()) throw new runtimeexception( "count file does not exist." ); bufferedreader reader = new bufferedreader( new filereader(file)); string line = reader.readline(); string newfile = line.split( "\t" )[ 0 ]; long size = long .parselong(line.split( "\t" )[ 1 ]); randomaccessfile raf = new randomaccessfile(newfile, "rw" ); raf.setlength(size); fileinputstream fis = null ; byte [] buffer = null ; while ((line = reader.readline()) != null ) { string[] arrinfo = line.split( "\t" ); fis = new fileinputstream( new file(arrinfo[ 0 ])); buffer = new byte [integer.parseint(arrinfo[ 2 ])]; long startpos = long .parselong(arrinfo[ 1 ]); fis.read(buffer, 0 , integer.parseint(arrinfo[ 2 ])); raf.seek(startpos); raf.write(buffer, 0 , integer.parseint(arrinfo[ 2 ])); fis.close(); } raf.close(); } |
执行外部命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
执行外部命令 public static void execexternalcommand(string command, string argument) { process process = null ; try { process = runtime.getruntime().exec(command + " " + argument); inputstream is = process.getinputstream(); bufferedreader br = new bufferedreader( new inputstreamreader(is)); string line = null ; while ((line = br.readline()) != null ) { system.out.println(line); } } catch (exception ex) { system.err.println(ex.getmessage()); } finally { if (process != null ) process.destroy(); } } |
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://www.cnblogs.com/wing011203/archive/2013/05/03/3056535.html