File类是java.io包下代表与平台无关的文件和目录,不管是文件还是目录都可以使用File操作,File能新建、删除、重命名文件和目录,但不能访问文件内容本身,访问文件内容需要使用输入/输出流。使用文件路径字符串来创建File类实例,既可以是绝对路径也可以是相对路径。
Tips:Windows的路径分隔符使用反斜线\,而Java程序中\表示转义字符,所以如果需要在Java程序中包含windows路径则需要使用两跳反斜线\\,比如"C:\\Frogram Files\\"。或者可以直接使用斜线/,Java允许将斜线当成平台无关的路径分隔符。
在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为流(stream)。Java的输入流主要由InputStream和Reader作为基类,输出流主要由OutputStream和Writer作为基类。但它们都是一些抽象基类无法创建实例。
Java中的流又可以分为字节流和字符流,字节流操作的数据单元是8位的字节,字符流操作的数据单元是16位的字符。字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。
Java中的流还可以分为节点流和处理流,节点流直接连接到低级的数据源,处理流则是对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写得功能。
FileInputStream、FileReader、FileOutputStream、FileWriter是基本的节点流,直接和指定文件关联。
Tips:Windows平台的换行符是\r\n,Linux下使用\n做换行符
一般不直接使用节点流,而是使用可以隐藏底层上节点流差异的处理流进行更加方便地输入输出。
经常使用的处理流有:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,PrintStream,StringReader,StringWriter等。
以下程序实现了将一个目录下的所有txt文件的每行数字加1的功能:
File file = new File("D:\\tmp\\");
String[] fileList = file.list();
for (String fileName : fileList) {
StringBuffer sb= new StringBuffer("");
FileReader reader = new FileReader("D:\\tmp\\" + fileName);
BufferedReader br = new BufferedReader(reader);
String str;
while((str = br.readLine()) != null) {
int num = Integer.parseInt(str) + 1;
sb.append(num+"\r\n");
//System.out.println(str);
}
br.close();
reader.close();
// write string to file
FileWriter writer = new FileWriter("D:\\tmp\\" + fileName);
BufferedWriter bw = new BufferedWriter(writer);
bw.write(sb.toString());
bw.close();
writer.close();
}