类似于Python的Java IO库?
Java 不是我主要使用的编程语言,所以我可能问的问题很简单。
但是在 Java 中有没有像 Python 那样简单的文件处理库呢?
举个例子,我只想这样做:
File f = Open('file.txt', 'w')
for(String line:f){
//do something with the line from file
}
谢谢!
更新:好吧,stackoverflow 自动接受了一个奇怪的答案。这和我设置的悬赏有关——所以如果你想看看其他答案,只需往下滚动即可!
10 个回答
4
如果你已经在用Apache commons lang和commons io这两个库,那么这可能是一个替代方案:
String[] lines = StringUtils.split(FileUtils.readFileToString(new File("myfile.txt")), '\n');
for(String line: lines){
//do something with the line from file
}
(我更喜欢Jesper的回答)
11
在Java中逐行读取文件的方法:
BufferedReader in = new BufferedReader(new FileReader("myfile.txt"));
String line;
while ((line = in.readLine()) != null) {
// Do something with this line
System.out.println(line);
}
in.close();
大部分与输入输出相关的类都在java.io
这个包里。你可以查看这个包的API文档。想要了解更多详细信息,可以看看Sun的Java I/O教程。
补充说明:上面的例子会使用你系统的默认字符编码来读取文本文件。如果你想明确指定字符编码,比如UTF-8,可以把第一行改成这样:
BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream("myfile.txt"), "UTF-8"));
19
我在想的其实是这样的:
File f = File.open("C:/Users/File.txt");
for(String s : f){
System.out.println(s);
}
这是我的源代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
public abstract class File implements Iterable<String>{
public final static String READ = "r";
public final static String WRITE = "w";
public static File open(String filepath) throws IOException{
return open(filepath, READ);
}
public static File open(String filepath, String mode) throws IOException{
if(mode == READ){
return new ReadableFile(filepath);
}else if(mode == WRITE){
return new WritableFile(filepath);
}
throw new IllegalArgumentException("Invalid File Write mode '" + mode + "'");
}
//common methods
public abstract void close() throws IOException;
// writer specific
public abstract void write(String s) throws IOException;
}
class WritableFile extends File{
String filepath;
Writer writer;
public WritableFile(String filepath){
this.filepath = filepath;
}
private Writer writer() throws IOException{
if(this.writer == null){
writer = new BufferedWriter(new FileWriter(this.filepath));
}
return writer;
}
public void write(String chars) throws IOException{
writer().write(chars);
}
public void close() throws IOException{
writer().close();
}
@Override
public Iterator<String> iterator() {
return null;
}
}
class ReadableFile extends File implements Iterator<String>{
private BufferedReader reader;
private String line;
private String read_ahead;
public ReadableFile(String filepath) throws IOException{
this.reader = new BufferedReader(new FileReader(filepath));
this.read_ahead = this.reader.readLine();
}
private Reader reader() throws IOException{
if(reader == null){
reader = new BufferedReader(new FileReader(filepath));
}
return reader;
}
@Override
public Iterator<String> iterator() {
return this;
}
@Override
public void close() throws IOException {
reader().close();
}
@Override
public void write(String s) throws IOException {
throw new IOException("Cannot write to a read-only file.");
}
@Override
public boolean hasNext() {
return this.read_ahead != null;
}
@Override
public String next() {
if(read_ahead == null)
line = null;
else
line = new String(this.read_ahead);
try {
read_ahead = this.reader.readLine();
} catch (IOException e) {
read_ahead = null;
reader.close()
}
return line;
}
@Override
public void remove() {
// do nothing
}
}
还有这是它的单元测试:
import java.io.IOException;
import org.junit.Test;
public class FileTest {
@Test
public void testFile(){
File f;
try {
f = File.open("File.java");
for(String s : f){
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testReadAndWriteFile(){
File from;
File to;
try {
from = File.open("File.java");
to = File.open("Out.txt", "w");
for(String s : from){
to.write(s + System.getProperty("line.separator"));
}
to.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}