подобная Python библиотека Java IO?

Java не является моим основным языком программирования, таким образом, я мог бы спрашивать очевидное.

Но есть ли простая обрабатывающая файл библиотека в Java, как в Python?

Например, я просто хочу сказать:

File f = Open('file.txt', 'w')
for(String line:f){
      //do something with the line from file
}

Спасибо!

ОБНОВЛЕНИЕ: Ну, stackoverflow автопринял странный ответ. Это имеет отношение к щедрости, которую я поместил - поэтому, если Вы хотите видеть другие ответы, просто прокрутить вниз!

18
задан Andriy Drozdyuk 17 June 2010 в 09:09
поделиться

10 ответов

Я думал о чем-то вроде:

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();
        }   
    }
}
19
ответ дан 30 November 2019 в 06:50
поделиться

Чтение файла построчно в 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's Java I/O tutorial для более подробной информации.

addition: В приведенном выше примере для чтения текстового файла будет использоваться кодировка символов по умолчанию в вашей системе. Если вы хотите явно указать кодировку, например UTF-8, измените первую строку на следующую:

BufferedReader in = new BufferedReader(
    new InputStreamReader(new FileInputStream("myfile.txt"), "UTF-8"));
11
ответ дан 30 November 2019 в 06:50
поделиться

Если у вас уже есть зависимости для 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
ответ дан 30 November 2019 в 06:50
поделиться

Вы можете использовать jython , который позволяет запускать синтаксис Python на Java.

0
ответ дан 30 November 2019 в 06:50
поделиться

Если вы хотите перебирать файл по строкам, вам может пригодиться класс 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 Вы также можете анализировать файл с помощью регулярных выражений.

4
ответ дан 30 November 2019 в 06:50
поделиться

Хороший пример здесь: Построимая итерация

0
ответ дан 30 November 2019 в 06:50
поделиться

Простой пример используя 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;
                }
            });
    }
}
1
ответ дан 30 November 2019 в 06:50
поделиться

Мне никогда не надоедает сутенерство guava-библиотек Google , которые снимают много боли ... ну, большинство вещей в Java.

Как насчет:

for (String line : Files.readLines(new File("file.txt"), Charsets.UTF_8)) {
   // Do something
}

В случае, если у вас большой файл и вам нужен построчный обратный вызов (а не считывание всего этого в память), вы можете использовать LineProcessor , который добавляет немного шаблонов (из-за отсутствия закрытий ... вздох), но по-прежнему защищает вас от работы с самим чтением и всеми связанными с ним Исключениями :

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);
}

, а затем ваш код может be:

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'!");
  }
});

, что соответственно чище.

3
ответ дан 30 November 2019 в 06:50
поделиться
  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() в конце для правильной обработки ошибок
2
ответ дан 30 November 2019 в 06:50
поделиться

Попробуйте взглянуть на groovy!

Это супермножество Java, которое работает в JVM. Большинство действительного кода Java также является действительным кодом Groovy, так что вы можете получить прямой доступ к любому из миллионов API java.

Кроме того, в нем есть множество высокоуровневых структур, знакомых любителям Python, плюс ряд расширений для облегчения работы с картами, списками, sql, xml и, как вы догадались, файловым вводом-выводом.

0
ответ дан 30 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: