JAVA I/O操作
1.File操作
a.创建文件:
File file = new File();//括号内可根相应的路径参数
File.separator用作文件夹的间隔符,这样可以考虑到windows和linux通用性;
b.InputStream流的形式访问文件:
BufferedInputStream in=new BufferedInputStream(new FileInputStream("TokenTest.java"));//此时转换为InputStream流
PrintStream out=new PrintStream(new BufferedOutputStream(
new FileOutputStream("test.java")));
进行文件流的输出:
int i;
while((i=br.read())!=-1)
System.out.println(s);
out.close();
c.Reader/Writer读取字符的形式获取文件://通过InputStreamReader进行转换
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(inputfile)));
String data;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
//也可直接用FileReader的形式获取
BufferedReader br = new BufferedReader(new FileReader("TokenTest.java"));
d.文件的一些操作
创建目录:file.mkdir();//创建目录
剪切转移文件:file.renameto(new File(temppath+list[i]))//相当于剪切文件
显示下属文件:String[] list = file.list();
System.out.println(list[i]);
//注意字符串的操作可以用于判断文件的类型如list[i].endWith(".java")
2.进行相应的String类型的字符流操作
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.EOFException; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; public class JavaIOTest { public static void main(String[] args) throws IOException { String s2 = "hello" + "/n" + "world"; //StringReader从memory当中读取数值 StringReader in2 = new StringReader(s2); int c; try { while ((c = in2.read()) != -1) { System.out.print((char) c); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //DataInputStream从内存取得格式化输出 try { DataInputStream in3 = new DataInputStream(new ByteArrayInputStream( s2.getBytes())); while (true) { System.out.print((char) in3.readByte()); } } catch (EOFException e) { System.out.println("End of stream"); } // PrintWriter主要为面向Byte的,以此来进行文件输出 try { String s3; BufferedReader in4 = new BufferedReader(new StringReader(s2)); PrintWriter out1 = new PrintWriter(new BufferedWriter( new FileWriter("IODemo.text"))); int lineCount = 0; while ((s3 = in4.readLine()) != null) { out1.println(lineCount++ +":"+s3); } out1.close(); } catch (EOFException e) { System.out.println("End of file Stream"); } } }
//小结:
//String类型即直接用StringReader转换为字符流,也可转换为字节数祖转换为DataInputStream流
3.字节流与字符流的相关介绍
最早的JAVA 的API提供的是字节流,以InputStream和OutputStream为主,进行派生,如ObjectInputStream,DataInputStream,BufferedInputStream,FileInputStream等等
eg:DataInputStream in=new DataInputStream(new ByteArrayInputStream(string.getbytes()));
int i=0;
while((i=in.read)!=-1)
System.out.println((char)i);
随着国际化的出现,需要更多的对国际进行支持,于是出现了Reader和Writer类型的字符处理,如StringReader,FileReader,BufferedReader,FileWriter,BufferedWriter,PrintWriter等
eg:BufferedReader in4 = new BufferedReader(new StringReader(s2));
PrintWriter out1 = new PrintWriter(new BufferedWriter(
new FileWriter("IODemo.text")));
在字节流和字符流之间可以实现转换
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(inputfile)));
String data;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
4.StringTokenizer与StreamTokenizer
a. 二者都根据一定规则(主要为分隔符或词组)获取词组
b.StringTokenizer 与split类似,其操作如下
String data = "I-love-you"
StringTokenizer st = new StringTokenizer(data,"-");
String[] list=data.split("-");
c.StreamTokenizer较为复杂,需要设置相应的词祖范围(或者默认),在判断输出时不能为TT_EOF,并可根据相应的词组形式进行输出
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.StreamTokenizer; import java.util.Enumeration; import java.util.Hashtable; public class Streamtoken { public static void main(String args[]) { /*if (args.length == 0) { System.err.println("missing input filename"); System.exit(1); }*/ Hashtable wordlist = new Hashtable(); try { // FileReader fr = new FileReader("TokenTest.java"); // BufferedReader br = new BufferedReader(fr); BufferedReader br = new BufferedReader(new FileReader("TokenTest.java")); StreamTokenizer st = new StreamTokenizer(br); //StreamTokenizer st = // new StreamTokenizer(new StringReader( // "this is a test")); // st.resetSyntax(); // st.wordChars('A', 'Z'); // st.wordChars('a', 'z'); int type; Object dummy = new Object(); while ((type = st.nextToken()) != StreamTokenizer.TT_EOF) { if (type == StreamTokenizer.TT_WORD) wordlist.put(st.sval, dummy); if(type == StreamTokenizer.TT_NUMBER) System.out.println("数字为"+type); } br.close(); } catch (IOException e) { System.err.println(e); } Enumeration a=wordlist.keys(); while(a.hasMoreElements()) { System.out.println(a.nextElement()); } } }
5.File的renameTo 与delete方法
delete()直接删除,需要花费一点时间,500M大概32ms
renameTo()方法在跨文件系统的时候会有问题,可以用FileUtil的copyFile(srcFile,destFile)文件来解决这个问题
6.Java对象转换为字节流
1):ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ObjectOutputStream objout = new ObjectOutputStream(bytes);
objout.writeObject(obj);
byte[] data = bytes.toByteArray();
2:)byte[] data = multiSegment.read();
ObjectInputStream objin = new ObjectInputStream(new ByteArrayInputStream(data));
return objin.readObject();