实例来源think in java
读取:
根据需要读取文件返回不同类型的信息进行选择使用。
实例1
使用BufferReader读取。
package io;
// 使用Reader方式进行读取
import java.io.*;
public class BufferedInputFile {
// Throw exceptions to console:
public static String read(String filename) throws IOException {
// 使用BufferedReader进行缓冲,来提高文件的读取数据
BufferedReader in = new BufferedReader(new FileReader(filename));
String s;
StringBuilder sb = new StringBuilder();
while ((s = in.readLine()) != null)
sb.append(s + "\n");
in.close();
return sb.toString();
}
public static void main(String[] args) throws IOException {
System.out.print(read("C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\BufferedInputFile.java"));
}
}
实例2
使用StringReader类读取,in.read()以int形式返回下一个字节。
package io;
// 从内存中读取
import java.io.*;
public class MemoryInput {
public static void main(String[] args) throws IOException {
StringReader in = new StringReader(BufferedInputFile
.read("C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\MemoryInput.java"));
int c;
while ((c = in.read()) != -1)
System.out.print((char) c);
}
}
实例3
使用DataInputStream类读取,in.readByte()返回的byte类型。
package io;
//相对TestEOF.java 此方法不能检测字节是否结束
//面向字节的IO类
import java.io.*;
public class FormattedMemoryInput {
public static void main(String[] args) throws IOException {
try {
DataInputStream in = new DataInputStream(
new ByteArrayInputStream(BufferedInputFile
.read("C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\FormattedMemoryInput.java")
.getBytes()));
while (true)
System.out.print((char) in.readByte());
} catch (EOFException e) {
System.err.println("End of stream");
}
}
}
另一种用法,差异在第9行,使用in.available() != 0,判断检测字节是否结束。
FormattedMemoryInput例子在运行时 不能检测流中是否还有字节,所以在控制台最后会抛出一个异常:End of stream
下面用法可以避免此问题。
package io;
import java.io.*;
public class TestEOF {
public static void main(String[] args) throws IOException {
DataInputStream in = new DataInputStream(new BufferedInputStream(
new FileInputStream("C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\TestEOF.java")));
while (in.available() != 0)
System.out.print((char) in.readByte());
}
}
写:
实例1
基本的文件写入
package io;
// 基本的文件输出
import java.io.*;
public class BasicFileOutput {
static String file = "C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\BasicFileOutput.out";
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(
new StringReader(
BufferedInputFile.read("C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\BasicFileOutput.java")));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(
file)));
int lineCount = 1;
String s;
while ((s = in.readLine()) != null)
out.println(lineCount++ + ": " + s);
out.close();
// Show the stored file:
System.out.println(BufferedInputFile.read(file));
}
}
快捷用法,PrintWriter提供了进行缓存操作构造函数,省去了我们自己进行包装。
package io;
// 输出方式的快捷用法,PrintWriter提供了进行缓存操作构造函数
import java.io.*;
public class FileOutputShortcut {
static String file = "C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\FileOutputShortcut.out";
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new StringReader(
BufferedInputFile.read("C:\\Users\\zm\\workspace\\Thinking in java\\src\\io\\FileOutputShortcut.java")));
// Here's the shortcut:
PrintWriter out = new PrintWriter(file);
int lineCount = 1;
String s;
while ((s = in.readLine()) != null)
out.println(lineCount++ + ": " + s);
out.close();
// Show the stored file:
System.out.println(BufferedInputFile.read(file));
}
}
读取和写入工具类
//: net/mindview/util/TextFile.java
// Static functions for reading and writing text files as
// a single string, and treating a file as an ArrayList.
package net.mindview.util;
import java.io.*;
import java.util.*;
public class TextFile extends ArrayList<String> {
private static String gpfile = "C:\\Users\\zm\\workspace\\Thinking in java\\src\\net\\mindview\\util\\";
// Read a file as a single string:
public static String read(String fileName) {
StringBuilder sb = new StringBuilder();
try {
BufferedReader in = new BufferedReader(new FileReader(new File(
fileName).getAbsoluteFile()));
try {
String s;
while ((s = in.readLine()) != null) {
sb.append(s);
sb.append("\n");
}
} finally {
in.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return sb.toString();
}
// Write a single file in one method call:
public static void write(String fileName, String text) {
try {
PrintWriter out = new PrintWriter(new File(fileName)
.getAbsoluteFile());
try {
out.print(text);
} finally {
out.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// Read a file, split by any regular expression:
public TextFile(String fileName, String splitter) {
super(Arrays.asList(read(fileName).split(splitter)));
// Regular expression split() often leaves an empty
// String at the first position:
if (get(0).equals(""))
remove(0);
}
// Normally read by lines:
public TextFile(String fileName) {
this(fileName, "\n");
}
public void write(String fileName) {
try {
PrintWriter out = new PrintWriter(new File(fileName)
.getAbsoluteFile());
try {
for (String item : this)
out.println(item);
} finally {
out.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// Simple test:
public static void main(String[] args) {
String file = read(gpfile + "TextFile.java");
write("d:\\test.txt", file);
TextFile text = new TextFile("d:\\test.txt");
text.write("d:\\test2.txt");
// Break into unique sorted list of words:
TreeSet<String> words = new TreeSet<String>(new TextFile(
gpfile + "TextFile.java", "\\W+"));
// Display the capitalized words:
System.out.println(words.headSet("a"));
}
}