Python-подобная библиотека IO Java?
Java не является моим основным языком программирования, поэтому я могу задавать очевидное.
Но есть ли в Java простая библиотека обработки файлов, например python?
Например, я просто хочу сказать:
File f = Open('file.txt', 'w')
for(String line:f){
//do something with the line from file
}
Спасибо!
UPDATE: ну, stackoverflow автоматически принял странный ответ. Это связано с щедростью, которую я разместил, поэтому, если вы хотите увидеть другие ответы, просто прокрутите вниз!
Ответы
Ответ 1
Я думал о чем-то больше:
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();
}
}
}
Ответ 2
Чтение файла по строкам в 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 tutorial.
дополнение: пример выше будет использовать кодировку по умолчанию вашей системы для чтения текстового файла. Если вы хотите явно указать кодировку символов, например UTF-8, измените первую строку на это:
BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream("myfile.txt"), "UTF-8"));
Ответ 3
Если у вас уже есть зависимости от 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
}
(Я бы предпочел ответить Йесперу)
Ответ 4
Если вы хотите итерировать файл по строкам, класс, который может вам пригодиться, - это класс Scanner.
import java.io.*;
import java.util.Scanner;
public class ScanXan {
public static void main(String[] args) throws IOException {
Scanner s = null;
try {
s = new Scanner(new BufferedReader(new FileReader("myFile.txt")));
while (s.hasNextLine()) {
System.out.println(s.nextLine());
}
} finally {
if (s != null) {
s.close();
}
}
}
}
API очень полезен: http://java.sun.com/javase/7/docs/api/java/util/Scanner.html
Вы также можете анализировать файл с помощью регулярных выражений.
Ответ 5
Я никогда не устаю от сутенерства Google guava-libraries, который отнимает много боли из... ну, большинство вещей в Java.
Как насчет:
for (String line : Files.readLines(new File("file.txt"), Charsets.UTF_8)) {
// Do something
}
В случае, когда у вас есть большой файл, и вам нужен ответный запрос (вместо чтения всего этого в память), вы можете использовать LineProcessor
, который добавляет немного шаблона (из-за отсутствия затворов... вздоха), но все же защищает вас от работы с самим чтением и всех связанных Exceptions
:
int matching = Files.readLines(new File("file.txt"), Charsets.UTF_8, new LineProcessor<Integer>(){
int count;
Integer getResult() {return count;}
boolean processLine(String line) {
if (line.equals("foo")
count++;
return true;
}
});
Если вы действительно не хотите, чтобы результат возвращался из процессора, и вы никогда не прерывали раньше (причина для логического возврата из processLine
), вы могли бы сделать что-то вроде:
class SimpleLineCallback extends LineProcessor<Void> {
Void getResult{ return null; }
boolean processLine(String line) {
doProcess(line);
return true;
}
abstract void doProcess(String line);
}
а затем ваш код может быть:
Files.readLines(new File("file.txt"), Charsets.UTF_8, new SimpleLineProcessor(){
void doProcess(String line) {
if (line.equals("foo");
throw new FooException("File shouldn't contain 'foo'!");
}
});
который соответственно является более чистым.
Ответ 6
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new File("scan.txt"));
try {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} finally {
scanner.close();
}
}
Некоторые оговорки:
- Это использует стандартную системную кодировку, но вы должны указать кодировку файла
- Сканер проглатывает исключения ввода-вывода, поэтому вы можете проверить ioException() в конце для правильной обработки ошибок
Ответ 7
Простой пример с использованием Files.readLines()
из guava-io с обратным вызовом LineProcessor
:
import java.io.File;
import java.io.IOException;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import com.google.common.io.LineProcessor;
public class GuavaIoDemo {
public static void main(String[] args) throws Exception {
int result = Files.readLines(new File("/home/pascal/.vimrc"), //
Charsets.UTF_8, //
new LineProcessor<Integer>() {
int counter;
public Integer getResult() {
return counter;
}
public boolean processLine(String line) throws IOException {
counter++;
System.out.println(line);
return true;
}
});
}
}
Ответ 8
Вы можете использовать jython, который позволяет запускать синтаксис Python в Java.
Ответ 9
Приятный пример здесь: Итерация по строке
Ответ 10
Попробуйте найти groovy!
Его надмножество Java, которое работает в hte JVM. Наиболее допустимый Java-код также действителен Groovy, поэтому вы можете напрямую обращаться к любому из миллионов API Java.
Кроме того, у него есть много более сложных уровней, знакомых Питонистам, плюс
несколько расширений, чтобы удалить боль из карт, списков, sql, xml, и вы догадались - файл IO.