对文件的读写操作一直是我的薄弱环节,这都是错误的学习习惯导致的:每门课程我都是开始时学得蛮认真的,所以基础相对比较扎实一点;但是到后来就越学越放松,所以后面的一块就变得模模糊糊的,而Java 课程中的I/O 也是放在靠后的位置来介绍的,所以这一块学得不咋的。。。
今天上午又在看《 Ivor Horton’s Beginning Java 2, JDK 5 Edition 》(《Java 2 入门经典》),写了几个例题。
首先看看API中是怎么描述FileInputStream的:
public class FileInputStreamextends InputStreamFileInputStream 从文件系统中的某个文件中获取输入字节。哪些文件可用取决于主机环境。
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
FileInputStream(FileDescriptor fdObj):通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
FileInputStream(String name):通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
下面这个例题是使用通道将字符串写入文件的
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @title WriteAString.java
* @author Alenc
*/
public class WriteAString ... {
public static void main(String[] args) ...{
String phrase = new String("Garbage in, Garbage out ");
String dirname = "C:/";
String filename = "out.txt";
File dir = new File(dirname);
//check out the directory
if(!dir.exists())...{
if(!dir.mkdir())...{
System.out.println("Cannot creat directory: " + dirname);
System.exit(1);
}
} else if(!dir.isDirectory()) ...{
System.out.println(dirname + " is not a director");
System.exit(1);
}
//creat the filestream
File aFile = new File(dir, filename);
FileOutputStream outputFile = null;
try ...{
outputFile = new FileOutputStream(aFile);
System.out.println("File stream created successfully.");
} catch(FileNotFoundException e) ...{
e.printStackTrace(System.err);
}
//creat the file output stream channel and the buffer
FileChannel outChannel = outputFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println("New buffer: position = " + buf.position() +
" Limit = " + buf.limit() + " capacity = " +
buf.capacity());
// /**
// * This code can be only compile under JDK1.5
// */
// for(char ch : phrase.toCharArray()) {
// buf.putChar(ch);
// }
char[] ch = phrase.toCharArray();
for(int j=0; j<ch.length; j++) ...{
buf.putChar(ch[j]);
}
System.out.println("Buffer after loading: postion = " + buf.position()
+ " Limit = " + buf.limit() + " capacity = "
+ buf.capacity());
buf.flip();
System.out.println("Buffer after flip: position = " + buf.position()
+ " Limit = " + buf.limit() + " capacity = "
+ buf.capacity());
//write the file
try...{
outChannel.write(buf);
outputFile.close();
System.out.println("Buffer contents written to file.");
} catch(IOException e) ...{
e.printStackTrace(System.err);
}
System.exit(0);
}
}
编译后运行程序会得到如下的结果:
File stream created successfully.
New buffer: position = 0 Limit = 1024 capacity = 1024
Buffer after loading: postion = 116 Limit = 1024 capacity = 1024
Buffer after flip: position = 0 Limit = 116 capacity = 1024
Buffer contents written to file.
此时,在目录 C:/ 会有一个文本文件 out.txt ,就是该程序写到磁盘上的
out.txt 文件中包含如下文字:
显示的字符之间出现空格,是因为输出的是8位的字符,而写入文件的时Unicode字符码。对于Unicode 字符码来说,字符串每个字符占用两个字节。
下面再看看API中是怎么描述FileReadStream的:
构造方法有:
FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。
FileOutputStream(File file, boolean append) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(FileDescriptor fdObj) :创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
FileOutputStream(String name) :创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) :创建一个向具有指定 name 的文件中写入数据的输出文件流。
下面再写一个读取刚刚创建的 out.txt文件的程序:
编译后运行程序会得到如下的结果:
C:study > java - enableassertions - classpath . ReadAString
File contains 116 bytes.
String read: Garbage in, Garbage out.
String read: Its just a test of my f
String read: avor Java
EOF reached.